IP标志中的“不分段位”用于哪里?

10

我很好奇“不分段”[DF] IP标志位在哪里使用。由于分段对更高层来说是不可见的,它们也不太关心。

我还在寻找一个例子。

非常感谢您提前的帮助。

3个回答

15

分片并不总是对所有上层可见。一些早期的(可能甚至现在仍在使用的)微控制器TCP/IP协议栈没有实现完整的分片处理能力。在这种情况下使用标志会确保数据包以其原始形式到达,而不是一堆对方无法处理的碎片。

此外,在使用UDP时,并不需要所有碎片都到达目的地,因此防止分片意味着消息要么到达要么不到达——没有可能只有部分UDP数据报文到达目的地。我记不清TCP/IP协议栈等待缺失碎片的未组装的IP数据包保留了多久,但使用DF标志意味着在此期间没有浪费不必要的资源。

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


13
除了@Pax的回答(或者也许作为他所提到的测试的一部分),DP标志也用于路径MTU发现。这是当你尝试找出在给定的链路上可以发送而不需要分段的最大数据包大小时使用的。
通常有用的避免分段,即使更高级别的协议从理论上来说与其机制隔离,它们仍然可以“感受”到后果。如果单个应用程序级别的write()到网络套接字因太大而被分段,并且其中一个片段在网络中丢失,则整个IP数据包将丢失。当然,这会影响吞吐量。
因此,通常希望知道最大传输单元,即可以发送到目标而不需要分段的最大数据包。通过简单地设置DF位并发送越来越大的数据包,直到网络报告(通过ICMP)失败,可以使用路径MTU发现来查找此大小。

2
那非常有用。+1。 - paxdiablo

5
请注意,在C语言中没有标准的设置DF寄存器的方法。在Linux上,以下代码可行:
result = setsockopt(mysocket, IPPROTO_IP, 
                IP_MTU_DISCOVER, IP_PMTUDISC_DO, sizeof(int));

但是在FreeBSD 6上无法实现此功能。

此外,在真实的互联网上,路径MTU发现非常不可靠。太多损坏的防火墙和中间箱会过滤掉ICMP“数据包太大”的信息(这是测试候选网络管理员的好方法:要求他/她停止ping,他/她可能会完全阻止ICMP。)请参阅RFC 2923:“使用路径MTU发现时的TCP问题”

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接