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

时间:2008-12-09 04:45:08

标签: c++ c networking network-programming network-protocols

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

我也在寻找一个例子。

提前多多感谢。

3 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:12)

除了@Pax's answer(或者也许是他提到的测试的一部分),DP标志也用于path MTU discovery。这是当你试图弄清楚对于给定的链接,可以发送而不被分段的最大数据包是什么。

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

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

答案 2 :(得分: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发现”