9

我很想知道 IP 标志的“不分段”[DF] 位在哪里使用。因为碎片对更高层是不可见的,他们也不在乎。

我也在寻找一个例子。

提前非常感谢。

4

3 回答 3

15

碎片并不总是对所有上层都是不可见的。一些早期的(甚至可能是当前的)微控制器 TCP/IP 堆栈没有实现完整的功能,例如碎片处理。在这种情况下使用标志将确保数据包以其原始形式到达,而不是另一端无法处理的大量片段。

此外,当使用 UDP 时,不需要所有分片都到达目的地,因此,防止分片意味着消息到达或未到达 - 不可能只有一小部分 UDP 数据报到达目的地. 我不记得 TCP/IP 堆栈在等待丢失片段的未组装 IP 数据包上保留了多长时间,但是使用 DF 标志意味着在那段时间没有占用不必要的资源。

最后,您可以使用它来测试网络基础设施的行为,例如当您收到一个大于最大传输单元的数据包时会发生什么(DF 将防止该数据包被分段以“挤过”孔)。

于 2008-12-09T05:41:39.220 回答
12

除了@Pax 的回答(或者可能作为他提到的测试的一部分)之外,DP 标志还用于路径 MTU 发现。这是当您尝试找出对于给定链接而言,可以在不被分段的情况下发送的最大数据包是多少。

避免碎片化通常很有用,即使更高级别的协议在理论上与它的机制隔离,它们仍然可以“感受到”后果。如果网络套接字的单个应用程序级write()由于太大而最终被分片,并且其中一个分片在网络中丢失,则整个 IP 数据包将丢失。这当然会影响吞吐量。

由于这个原因,通常希望知道最大传输单元,即可以发送到目的地而不被分段的最大数据包。路径 MTU 发现用于查找此大小,方法是简单地设置 DF 位并连续发送更大的数据包,直到网络报告(通过ICMP)失败。

于 2008-12-09T07:29:35.273 回答
5

请注意,在 C 中设置 DF 没有标准方法。在 Linux 上,此代码有效:

result = setsockopt(mysocket, IPPROTO_IP, 
                IP_MTU_DISCOVER, IP_PMTUDISC_DO, sizeof(int));

但它不在 FreeBSD 6 上

此外,路径 MTU 发现在真实 Internet 上极其不可靠。太多损坏的防火墙和中间盒过滤掉了 ICMP“数据包太大”消息(这是在面试期间测试候选人网络管理员的好方法:让他/她停止 ping,他/她可能会完全阻止 ICMP。)请参阅RFC 2923:“路径 MTU 发现的 TCP 问题”

这就是为什么 IETF 现在建议使用一种新方法来测试 MTU,而不依赖于路径 MTU 发现:RFC 4821:“分组层路径 MTU 发现”

于 2008-12-10T09:42:03.053 回答