为何Packet经过路由器,要传回网络层 ?
为什么数据传输经过路由器时要传回网络层 ?
今天学IP地址和硬件地址,书上有一张图。为什么每经过一个路由器,就要传回网络层,中间还有首部尾部的问题,这样做的意义是什么?
逻辑意义上是这样的,但是物理意义上不是这样的!
所谓逻辑,按照OSI参考模型,网络层需要对数据包packet完成路由(导航)功能。既然TCP/IP协议的IP层,归类于OSI参考模型的网络层(三层),所以IP层需要直接服务于自己的链路层(二层),将packet 向上递交(UP)给IP层。
这里的向上递交(二层UP到三层),有一点需要注意:只能是纯粹的IP Packet (纯三层),不能有物理层头部(一层)、链路层头部(二层)、链路层尾部(二层/FCS)。加黑部分需要物理层、链路层清除。
网络层/IP层,拿到IP Packet之后,需要履行自己的义务。比如sanity check、length check、checksum校验等合法性检查,如果不通过,直接扔进垃圾桶,错误统计+1。
如果通过以上合法性检查,查询路由表找出口,如果没找到,扔进垃圾桶,错误统计+1。
如果找到出口,网络层/IP层(三层/甲方),需要联系出口对应的链路层(二层/乙方),将IP Packet 从三层向下传递(Down)给出口的链路层(二层)。
联系之前,还需要检查链路层出口(通向下一个路由器)大门的MTU Length 是否≥Packet Length。如果不是,还需要检查Packet DF bit是否 ==1。如果是,直接扔进垃圾桶,错误统计+1,还需要向packet的源主机发送ICMP Error Code(Type 3 code 4)。如果否,需要IP层将packet拆分成多个fragment。
如果很幸运,MTU Length ≥ Packet Length,Packet可以完整发送,无需拆分。
但是联系链路层,需要告知下一跳的MAC地址(假设链路层为ethernet)。
网络层/IP层,先检查ARP cache。如果没有,需要ARP广播获取。如果有,直接就可以调用(call)链路层了,提供的信息有:
下一跳的MAC,IP Packet(内存地址)、Length等等。
链路层拿到甲方这些信息,就开始将Packet封箱(Encapsulation)打包了,添加Ethernet头部、以及尾部FCS,然后就打电话(call)自己的乙方(物理层),将包裹(Frame)扔给物理层,接下来就全是物理层的脏话了。
物理层,将链路层的01串串,编码、映射成PAM脉冲幅度信号,对载波(carrier)进行调制,最前面的是由同步信号Preamble + SFD组成的PAM脉冲信号,方便接收方检测有效的packet到达,方便接收方完成时间同步、频率同步。如果有频率offset,需要补偿。
从链路层向上递交(UP)packet时刻起,到网络层向下完成传递(Down)packet止的计算都是路由器的CPU来完成的。尽管CPU的运算速度是极快的,但是要想完成超高速(每秒几百万次packet的转发速率),臣妾(CPU)是做不到的。
怎么办?
采用专用(dedicated)硬件,来完成上文加亮(highlight)部分的计算。需要网络层/IP层将IP路由表、下一跳MAC等信息,同步给专用硬件,由硬件来完成本该网络层/IP层完成的转发(Forward)任务。这个在不同路由器平台都有自己的表达方式,在Cisco平台上称为 CEF、或者Distributed
CEF。硬件的转发能力远超CPU转发。
启用了CEF之后,Packet不会Up给网络层/IP层,除非遇到了以下情况:
- CEF Table无法match数据包的目的IP
- IP Packet有option选项
- 数据包的目的IP == self(正常现象)
1说明,可能由于路由表与CEF表不同步,这会导致CPU利用率暴增导致报警,2给远程攻击路由器CPU提供了便利。
