三层网络设备对于IP报文的分片和重组处理原理
对于网络分片,我一年前就想整理出来,虽然说网络上的资料很多,但是真正掌握精髓的除非真正做过分片程序,不然很难将协议栈整体联系起来理解。这篇文章,包括设计分片原理图,耗时一小时完成,算是记录一点理解。
三层网络设备,即能够基于IP头信息对报文进行识别和处理的网络设备,在转发IP报文的时候,经常会遇到来自上层的数据包过长,从而导致打上MAC头的帧不符合IEEE802.3标准规定的最大帧长,造成不能被转发和对端解析的问题。这样就需要在三层进行分片,将过长的IP报文拆分成小的数据块,一般规定最大的IP报文(IP头+数据)长度应该在46~1500范围内,这样,加上MAC头的14个字节和4个字节的校验,就满足以太网帧的最大帧长1518的要求。
那么,如何分片?如图所示,假设,现在有一个总长度为4000字节的IP报文,一个巨帧IP数据包,在经由三层的时候,需要进行分片,将数据包长控制在以太网II规定的帧长范围内,然后进行转发。
如果按照分片长度为1000字节来计算,那么3980个字节的IP数据包的数据部分可分成4个分片,分别用A,B,C和D表示。很明显,最后一个分片的数据部分长度则是减去前三个1000bytes的分片后,剩下的数据包的长度—980。
按照固定头长度20字节计算,每个分片都将拷贝源IP报文的IP头部信息,作为IP头加在分片前面,同时需要修改由分片组成的新的IP报文的头部信息。如果源IP报文的头部标识符域=15000,该值标志从主机三层下发的IP Packet的编号。分片的标识符域同样是15000,在新的IP头中,需要修改的是分片标志位和offset位。
1 MF:更多分片 2 DF:不分片 3 Offset:该分片数据部分开始位置在原IP报文数据部分的偏移,单位是8bytes。
1 对于第一个分片A来说,Offset=0表示是原IP数据包的第一个分片,MF=1,则说明后面还有分片报文; 2 对于第二个分片B来说,Offset=125=(1000/8),计算出第二个分片的数据部分距离原IP数据包的数据部分起始位置的偏移,同时MF=1说明后面还有分片; 3 ….. 4 最后一个分片D中,计算出Offset后,写入新的IP头,然后将MF=0,表示对于编号为15000的IP数据包的分片就此结束,后面不再跟分片。
这样一个过程,就实现了IP报文的分片操作。对对端的三层来说,收到MF=1的报文后,就知道该报文是某一个IP报文的分片,需要进行分片重组操作。重组时,从该分片的头中提取整个报文的长度(该长度就是3980),同时提取Offset域,计算该分片数据部分在整个IP报文数据部分的位置,填充,并继续接收后续分片(分片属同一个IP报文的依据是地址信息和报文编号),直到收到一个类似分片的MF=0的报文时,预示着分片结束,与之前重组的报文完成重组之后,交给四层处理。
问题:如果上述报文在分片的时候,最后一个分片的数据部分长度小于26字节,即加上固定IP头的20字节,再加上以太网头的14个字节,再加上校验的4个字节后,最终的分片组成的IP报文总长度小于以太网规定的64字节的最小长度的时候,会怎么办?