为什么 ip 协议使用片段偏移量而不是索引号?

网络工程 ip IPv4 以太网 碎片化
2022-02-27 01:47:10

我想知道为什么 IP 协议使用片段偏移量来定义 IP 数据报的片段而不是使用索引号(索引为 0 的第一个片段,索引为 1 的第二个片段,...)。我们已经知道带有总长度字段的片段的大小,因此对于我来说指定偏移量和(可能)浪费空间看起来像是重复的。使用索引,13 位我们可以有 8192 个片段,每个片段最大 1500 位(在以太网上),我们可以只使用 6 位(每个片段的大小为 1500 位)或 7 位(每个片段的大小为 576 位)或 10 位(每个片段的大小为 68 位)。我错过了什么吗?路由器用偏移量构造数据报更容易吗?

谢谢

2个回答

请记住,分片的数据包可能会进一步分片:

一个数据包被分片一次,你现在有两个分片,索引 0 和 1。

现在 packet0 被进一步分片。因此,您保留索引 0 并创建一个索引为 1 的新数据包。(执行此新分片的路由器完全不知道另一个分片的存在)。

您现在有 2 个索引为 1 的数据包,而目标路由器不知道如何组装它们。

片段偏移处理这个。

正如@JFL 所说,多重碎片是原因之一。通过存储偏移量,不需要额外的重组代码。如果您保留片段编号,则必须从多个级别开始编号,例如 4.2.5

另一个问题是 IP 片段可能会乱序传送。使用偏移量,您可以立即从 NIC 复制到缓冲区中的正确位置。

最后,IPv4 数据报的最大大小为 64k。偏移量字段尽可能大。