Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 使用TCP时,数据包大小的确定性如何?_Sockets_Wireshark_Mtu - Fatal编程技术网

Sockets 使用TCP时,数据包大小的确定性如何?

Sockets 使用TCP时,数据包大小的确定性如何?,sockets,wireshark,mtu,Sockets,Wireshark,Mtu,最近,当我们的某个客户安装了我们的产品时,我们遇到了一个看起来像是连接问题的问题。我们最终追踪到在网络中的一个设备上配置的低MTU(~1300字节)。在这个特定的部署中,我们有两台运行我们的应用程序的Windows计算机彼此通信,它们的链接MTU设置为1500 有一件事使得这个问题特别难以解决,那就是我们的应用程序在握手阶段(只发送小请求)可以正常工作,但有时会在网络上发送大小为~4KB的特定请求时失败。如果有区别的话,应用程序是用C#编写的,这些是WCF消息 什么可以解释这种不确定性?我本以为

最近,当我们的某个客户安装了我们的产品时,我们遇到了一个看起来像是连接问题的问题。我们最终追踪到在网络中的一个设备上配置的低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数据包被发送,这可能表明TCP段卸载是由NIC实现的?(我不知道曹在WireShark上会是什么样子)。在WireShark中,我没有看到在成功或失败的情况下,4KB请求被分解为多个IP数据包

5) 客户声称,两台Windows机器之间没有任何路线可以通过小型MTU绕过“有问题”的设备


如果您对此有任何想法,我们将不胜感激。

好吧,在应用程序级别,TCP是一个字节流,因此MTU、数据包大小、分段等在很大程度上是不相关的。TCP不能传输任何大于一个字节的消息。@嗯,是的,但最终数据是通过IP数据包发送的。似乎最终使用的数据包大小存在差异,这使分析变得复杂-因此我的问题是。您的应用程序如何失败?听起来对我来说太敏感了。它不应该关心数据包的大小,因为它甚至看不到它们。发布一些代码,“失败”你这是什么意思?将完整异常发布到字符串。如果框架使用TCP作为传输,则MTU/分段/数据包应该是无关的。如果TCP传输的特性影响服务的功能(与性能不同),则框架/传输无法正确通信。