关于IPv4首部标识和片偏移的一点理解
最近在看《图解TCP/IP》这本书,看到IPv4首部字段时,对于首部字段中标识和片偏移的概念有的摸不着头脑,后来自己在网上查阅了一些资料,也看了很多博客,目前有一个浅显的认识。
首先IP包最大的长度为65535(216)字节,但是传输信号的数据链路的最大传输单元(MTU)不相同,下图数不同数据链路的MTU(图来自《图解TCP/IP》)。
所以,IP包在传输过程中就面临着必须将IP包分片的操作。那如何确定将IP包分片时每片的大小呢?毕竟数据在传输的过程中可能会经过不同的数据链路。为了找到最好的分片的大小,这时候就提出了路径MTU的概念。
所谓路径MTU(Path MTU)就是在满足传输路径所有数据链路的最大传输单元,换句话说就是路径中存在的数据链路中最小的MTU。以这个大小来发送数据就可以满足所有的数据链路了。
既然要将IP包分片,那么怎么确定哪些分片属于同一包呢,标识就是用来标记同一个包不同的分片的。同一个包分片的标识相等,每发送一个包,标识的值就会增加。
知道了哪些分片是属于同一个包的,接下来怎样将它们重组为原来的IP包呢?此时就用到了片偏移。片偏移用来每一片相对于原来包的偏移量。关于片偏移的计算,大家可以看看这个解答。有了片偏移后就可以将片重组成原先的IP包了。
关于片偏移的单位是8的原因:
IPv4首部的片偏移的长度是13比特,所以能表示偏移的个数为213个。而前面说过IPv4包最大的长度为216,假设在一个非常特殊的情况下,IP包全部分到一个组中,那么这组的长度就等于216,片偏移也就是216。所以片偏移的单位必须为8个字节,才能得到这么大的值(213 x 8 = 216)。更为详细的解释可以参考这个问题