ip碎片化有多严重

How bad is ip fragmentation

我知道在发送 ip 消息时,be 和我的数据包目的地之间的网络路径中的每一跳都会检查下一跳的 MTU 是否大于我发送的数据包的大小。如果是这样,数据包将被分段,两个数据包将分别发送到下一跳,只在目的地重新组装(或者,在某些情况下,在遇到的第一个 NAT 路由器)。 据我了解,这件事可能很糟糕,但我真的不明白为什么。

原则上,如果数据包没有被丢弃并且碎片被正确重组,实际上 使用 数据包碎片似乎是节省本地带宽并避免发送更多数据包的好主意还有更多 headers 而不是一大包。

谢谢

据我所知,唯一会丢弃数据包而不是分段的情况(除非无论如何都会丢弃的情况)是标记为 "don't fragment" 的数据包。这些数据包将被丢弃而不是被分段。

分片数据包在其 header 中具有标识符、分片偏移量和更多分片字段,当合并时,允许目标主机在收到所有分片后可靠地重组数据包。第一个片段的偏移量为零,最后一个片段的更多片段标志设置为零。如果两个数据包的 header 发生突变,因此它们的片段偏移量被交换,但它们的校验和仍然有效,则仍有可能(尽管不太可能)重新组装不正确的数据包。发生这种情况的概率基本上为零。请记住,IP 不提供任何机制来确保数据有效负载的完整性,仅提供 header.

中控制信息的完整性。

数据包碎片必然会浪费带宽,因为每个片段都有 [大部分] 原始数据报的副本 header。数据包可以被分割成每个片段只有 8 个字节,所以我们可以将 60 + 65536 字节的 maximum-sized 数据包分割成 60 * 8192 + 65536 字节,在最坏的情况下产生大约 750% 的有效负载增加。我能想出的唯一例子是,如果你将一个数据包分段,以便使用某种频分复用方案并行发送它的片段,并且知道其他通道是空闲的。在这一点上,它似乎仍然需要更多的工作来检测这种情况并分割数据包而不是仅仅发送它。

如果您需要更多信息,可以在 IETF RFC 791 中找到有关 IP 数据包分段机制的所有基本细节。

IP 碎片会导致几个问题:

1)应用层损耗增加

如您所述,如果丢弃单个片段,则整个第 4 层数据包都将丢失。因此,对于随机丢包率较小的网络,应用层丢包率增加的系数大约等于每个第 4 层数据包的分片数。

2) 并非所有网络都处理碎片化数据包

一些系统,such as Google's Compute Engine,不重组分段数据包。

3) 碎片会导致re-ordering

当路由器将流量拆分为平行路径时,它们可能会尝试将来自同一流的数据包保持在一条路径上。因为只有第一个片段有第 4 层信息,如 UDP/TCP 端口号,后续片段可能会沿着不同的路径路由,延迟第 4 层数据包的组装并导致 re-ordering.

4) 碎片会导致难以调试的混乱行为

例如,如果您将两个 UDP 流 A 和 B 从一个源发送到目标 运行 Linux,目标可能会丢弃来自其中一个流的数据包。这是因为默认情况下,Linux "times out" 片段 queues 如果从同一源接收到超过 64 个其他片段。如果流 A 的数据速率比流 B 高得多,则来自流 A 的 64 个片段可能会到达来自流 B 的片段之间,从而导致 B 片段被丢弃。

因此,虽然 IP 分段可以通过最小化用户来减少开销 headers,但它可能会造成比其价值更多的麻烦。