2

最近,当我们的特定客户安装我们的产品时,我们遇到了看起来像是连接问题的问题。我们最终将其追溯到网络中的一个设备上配置的低 MTU(约 1300 字节)。在这个特定的部署中,我们有两台运行我们的应用程序的 Windows 机器相互通信,它们的链接 MTU 设置为 1500。

让这个问题特别难以解决的一件事是,我们的应用程序在握手阶段(仅发送小请求)可以正常工作,但有时会无法通过网络发送大小约为 4KB 的特定请求。如果有所不同,则应用程序是用 C# 编写的,这些是 WCF 消息。

什么可以解释这种不确定性?我本来预计这总是会失败,因为我们发送的消息大小总是大于 Windows 客户端感知的链接 MTU,这将导致至少一个完整的 1500 字节数据包,这会导致问题。TCP中有什么东西可以使它更喜欢较小的数据包,但只是有时?

我们认为可能相关的其他一些事情:

1)套接字不断被设置和拆除(因为应用程序收到了它解释为网络故障的内容),所以这似乎与 TCP 慢启动无关。

2) 我假设 WCF“快速”将整个 4KB 消息推送到套接字,所以总是有一些大于 1500 字节的东西要发送。

3) 使用 WireShark,我没有发现任何 TCP 重传,这可以解释为什么只发送缓冲区的子集。

4) 使用 WireShark,我看到一个 4KB 的 IP 数据包正在发送,这可能表明 NIC 正在执行 TCP Segment Offloading?(我不确定 TSO 在 WireShark 上的外观)。我没有在 WireShark 中看到 4KB 请求被分解为多个 IP 数据包,无论是成功的还是不成功的实例。

5) 客户声称两台 Windows 机器之间没有路由可以绕过具有小 MTU 的“有问题”设备。

对此的任何想法将不胜感激。

4

0 回答 0