【发布时间】:2018-02-07 18:32:39
【问题描述】:
IP 标头中有一个“不要分段”标志。 应用程序可以设置这个标志吗? 什么时候设置这个标志,为什么?
【问题讨论】:
标签: networking tcp ip wireshark
IP 标头中有一个“不要分段”标志。 应用程序可以设置这个标志吗? 什么时候设置这个标志,为什么?
【问题讨论】:
标签: networking tcp ip wireshark
如果在数据包上设置了“DF”位,通常会将大于 MTU 的数据包分段(并可能乱序传递)的路由器将丢弃该数据包。路由器应发送“需要 ICMP 分段”数据包,允许发送主机考虑到目标主机路径上的较低 MTU。然后,发送方将减少其对连接的路径 MTU(最大传输单元)的估计,并以较小的分段重新发送。这个过程称为 PMTU-D(“路径 MTU 发现”)。
碎片会导致 CPU 处理在另一端重新组装数据包(以及处理丢失的碎片)的额外开销。
通常,“DF”位是 IP 堆栈的可配置参数。我知道带有设置 DF 选项的 ping 实用程序。
避免碎片通常很有用,因为除了碎片和重新组装的 CPU 利用率之外,它可能会影响吞吐量(如果丢失的碎片需要重新传输)。出于这个原因,通常希望知道最大传输单位。因此,“路径 MTU 发现”用于查找此大小,只需设置 DF 位(例如用于 ping)
【讨论】:
在 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。
【讨论】:
我能想到的唯一可能设置此标志的情况是:
除非这种特殊情况,你可能永远不会碰它。
来自 RFC 791:
互联网数据报的分段是必要的 起源于允许大数据包大小的本地网络,并且必须 遍历将数据包限制为较小尺寸的本地网络以达到 它的目的地。
可以将 Internet 数据报标记为“不分段”。任何互联网 如此标记的数据报不会在任何 情况。如果 Internet 数据报标记为不分段,则不能 在不将其分割的情况下交付到目的地,它将被 而是丢弃。
应用程序可以设置这个标志吗? 是的,如果您编写足够低级的代码来处理 IP 标头。这部分问题对于给出更具体的答案有点宽泛,您可能应该在担心如何设置之前弄清楚是否要设置它。
【讨论】: