23

我们的一位客户在将数据从我们的应用程序(在他们的 PC 上)提交到服务器(不同的地理位置)时遇到问题。当发送小于 1100 字节的数据包时,一切正常,但在此之上,我们看到 TCP 每隔几秒就重新传输一次数据包并且没有得到响应。我们用于测试的数据包大约 1400 字节(但小于 1472)。我可以向 www.google.com 发送一个 1472 字节的 ICMP ping 并得到响应(所以这不是他们的路由器/前几跳)。

我发现我们的应用程序为这些数据包设置了 DF 标志,并且我相信通往服务器的路由器的 MTU 小于/等于 1100 并丢弃了数据包。

这会影响 5000 中的 1 个客户端,但由于每个人的路线都会有所不同,因此这是意料之中的。

数据是一个 SOAP 信封,我们期望得到一个 SOAP 响应。我无法证明我们为什么要这样做,这样做的代码是由以前的开发人员编写的。

所以...在应用程序数据的 TCP 数据包上设置 DF 标志有什么好处或理由吗?

我可以想到网络诊断应用程序需要它的原因,但在我们的情况下不需要(我们希望数据到达端点,无论是否碎片化)。我们的一位系统管理员说,这可能与我们使用 SSL 有关系,但据我所知,SSL 就像一个流,无论碎片如何,只要流在最后重建,就没有问题。

如果没有充分的理由,我将改变我们应用程序的行为。

提前致谢。

4

3 回答 3

49

DF 标志通常设置在携带 TCP 段的 IP 数据包上。

这是因为 TCP 连接可以动态改变其段大小以匹配路径 MTU,并且当 TCP 段每个都承载在一个 IP 数据包中时,可以获得更好的整体性能。

因此 TCP 数据包设置了 DF 标志,如果中间路由器因为数据包太大而不得不丢弃数据包,这应该会导致返回 ICMP Fragmentation Needed 数据包。然后,发送 TCP 将减少其对连接的路径 MTU(最大传输单元)的估计,并以较小的分段重新发送。如果没有设置 DF,发送 TCP 将永远不会知道它正在发送太大的段。这个过程称为 PMTU-D(“路径 MTU 发现”)。

如果 ICMP Fragmentation Needed 数据包没有通过,那么您正在处理一个损坏的网络。理想情况下,第一步是识别配置错误的设备并进行纠正;但是,如果这不起作用,那么您将向您的应用程序添加一个配置旋钮,告诉它TCP_MAXSEG使用setsockopt(). (错误配置设备的典型示例是路由器或防火墙,由经验不足的网络管理员配置为丢弃所有ICMP,而没有意识到 TCP PMTU-D 需要分段需要数据包)。

于 2010-05-07T13:31:35.037 回答
2

Path-MTU 发现的操作在 RFC 1191, https://www.rfc-editor.org/rfc/rfc1191中描述。TCP 发现 Path-MTU 比将每个超过一定大小的数据包分成两部分(通常是一大块和一小块)要好。

于 2016-01-12T17:23:14.930 回答
-3

显然,像 NFS 这样的一些协议可以从避免碎片(链接文本)中受益。但是,你是对的,除非你真的需要它,否则你通常不应该请求 DF。

于 2010-05-06T07:29:55.460 回答