IP标头中有一个“Don?t片段”标志。 应用程序能设置此标志吗? 何时设置此标志以及为什么?
答案 0 :(得分:5)
如果在数据包上设置'DF'位,则通常会将大于MTU的数据包分段(并且可能无序地传送)的路由器将丢弃该数据包。期望路由器发送“需要ICMP分段”的数据包,允许发送主机在到目的主机的路径上考虑较低的MTU。然后,发送方将减少其对连接的路径MTU(最大传输单元)的估计,并在较小的段中重新发送。此过程称为PMTU-D(“路径MTU发现”)。
碎片会导致CPU处理的额外开销,以在另一端重新组装数据包(并处理丢失的碎片)。
通常,'DF'位是IP堆栈的可配置参数。我知道ping实用程序,可以选择设置DF。
避免碎片通常很有用,因为除了碎片和重新组装的CPU利用率之外,它可能会影响吞吐量(如果丢失的碎片需要重新传输)。因此,通常希望知道最大传输单元。所以'Path MTU discovery'用于通过简单地设置DF位(比如说ping)来找到这个大小
答案 1 :(得分:1)
在RFC 791中进一步说:
If the Don't Fragment flag (DF) bit is set, then internet fragmentation of this datagram is NOT permitted, although it may be discarded. This can be used to prohibit fragmentation in cases where the receiving host does not have sufficient resources to reassemble internet fragments.
因此,他们最初想到的是小型嵌入式设备,它们具有最简单的IP实施和很少的内存。如今,您可能会想到物联网设备,例如智能灯泡或烟雾报警器。它们可能没有代码或内存来重组片段,因此与它们通信的软件将设置DF。
答案 2 :(得分:0)
我能想到你可能想要设置此标志的唯一情况是:
除了这种特殊情况,你可能永远不会碰它。
来自RFC 791:
互联网数据报的碎片化是必要的 起源于允许大数据包大小的本地网络 遍历本地网络,将数据包限制为更小的范围 它的目的地。
互联网数据报可以标记为“不会碎片化”。"任何互联网 如此标记的数据报不会被互联网支离破碎 情况。如果互联网数据报标记为不是片段,则不能 传送到目的地而不会破坏它,它就是 丢弃了。
应用程序可以设置此标志吗? 如果您编写的是低级别的代码,则表示您正在处理IP标头。问题的这一部分对于提供更具体的答案来说有点宽泛,你应该弄清楚你是否想要在设置问题之前先做好准备。