IP标志的Do not Fragment Bit在哪里使用?

我很想知道在哪里使用IP Flags的“Do not Fragment”[DF]位。 由于碎片对于更高层而言是不可见的,并且它们也不关心。

我也在寻找一个例子。

非常感谢提前。

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

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

最后,您可以使用它来测试网络基础架构的行为,例如当您获得的数据包大于最大传输单元时会发生什么(DF会阻止该数据包被分段以“挤过”该洞)。

除了@ Pax的答案 (或者也许是他提到的测试的一部分),DP标志也用于路径MTU发现 。 这是当您尝试找出对于给定链接可以发送而不被分段的最大数据包的情况。

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

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

请注意,没有标准的方法在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发现”