最近,当我们的特定客户安装了我们的产品时,我们遇到了类似连接问题。我们最终将其追踪到在网络中的一个设备上配置的低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的“有问题”设备。
对此的任何想法都将不胜感激。