当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用IP标志的DonotFragmentBit在哪里?》经验,为你挑选了3个好方法。

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

我也在寻找一个例子.

非常感谢提前.



1> paxdiablo..:

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

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

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



2> unwind..:

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

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

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


,即可以在不被分段的情况下发送到目的地的最大分组.路径MTU发现用于查找此大小,方法是简单地设置DF位并连续发送更大的数据包,直到网络报告(通过
知道这非常方便.+1.

3> bortzmeyer..:

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

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有