为什么 IP 分片在 8 字节边界上?

网络工程 ipv4
2021-07-23 02:55:16

在 Peterson 和 Davie 的教科书:Computer Networks 5th edition 中,我发现“IP 的设计者决定碎片应该总是发生在 8 字节的边界上,这意味着偏移字段计算 8 字节的块,而不是字节”。

为什么 offset 字段被设计为 8 的倍数?我不明白这有什么意义。另外,如果 MTU 偏移量不是 8 的倍数会怎样?(eg) 如果 MTU = 1502 字节,20 字节用于报头,1482 字节用于数据。在这种情况下,第二个片段中的片段偏移量是多少,因为 1482 不是 8 的倍数。

2个回答

对我来说,在 8 字节边界上进行碎片偏移似乎不一定是主要的设计选择。相反,这是他们在主要设计选择中可用的位数的结果,即标头应该有多大,以及其他字段需要多少位。

设计者选择头大小为 20 字节,在这 20 字节中,考虑到他们如何为各个字段分配位,他们最终只有 13 位可用于片段偏移。

在此处输入图片说明

所以这给出了 2^13 = 8192 个可能的偏移值。同时,总长度字段为 16 位,因此技术上最大有效载荷大小为 2^16 - 20 = 65516 字节。

当然,片段偏移字段必须能够跨越可能大小的整个范围,因此 65536 / 8192 = 8。

我可以想到使用 8 字节块的两个优点:首先,就您使用的 CPU 而言,将数据对齐在偶数边界上可能更有效。其次,您在发送的每个IP 数据包的 IP 标头中保存三位,无论是否分段。

您问题的第二部分的答案是,如果您发送 1482 字节的数据,并且它不是最后一个数据包,那么您没有正确分段。您将改为发送 1480 个字节。