最近项目在调试map-t技术,涉及到mtu,ip分片和重组问题。下图是IP协议头的数据字段的示意:
如图所示,IP协议理论上允许的最大IP数据报为65535字节(16位来表示包总长)。但是因为协议栈网络层下面的数据链路层一般允许的帧长远远小于这个值,例如以太网的MTU(即Maximum Transmission Unit,最大传输单元)通常在1500字节左右。所以较大的IP数据包会被分片传递给数据链路层发送,分片的IP数据报可能会以不同的路径传输到接收主机,接收主机通过一系列的重组,将其还原为一个完整的IP数据报,再提交给上层协议处理。上图中的红色字段便是被设计用来处理IP数据包分片和重组的。
那么,这三个字段如何实现对分片进行表示呢?
-
首先是标示符(16位),协议栈应该保证来自同一个数据报的若干分片必须有一样的值。
-
其次是标志位3位分别是R(保留位,未使用)位、DF(Do not Fragment,不允许分段)位和MF(More Fragment)位。MF位为1表示当前数据报还有更多的分片,为0表示当前分片是该数据报最后一个分片。
-
最后是偏移量(13位),表示当前数据报分片数据起始位置在完整数据报的偏移,注意这里一个单位代表8个字节。即这里的值如果是185,则代表该分片在完整数据报的偏移是185*8=1480字节。
RFC815文档(IP datagram reassembly algorithms)文档定义了IP分片重组的算法。
操作系统内核协议栈(以下简称协议栈)只需要申请一块和原始数据报相同大小的内存空间,然后将这些数据报分片按照其偏移拷贝到指定的位置就能恢复出原先的数据报了。目前看