这是我不久前放弃的一个老问题,因为我找不到解决方案,而且它只影响了一台服务器(所以我只是把我的服务放在其他地方)。 This用户遇到了与我的症状相同的问题:
- C# .net synchronous Tcp server
- a TcpClient object is assigned by blocking on a TcpListener with the AcceptTcpClient method
- once there's a TcpClient object, I pass it to a thread that invokes the client's GetStream method to create a NetworkStream
- this NetworkStream is looped over, in each iteration doing a networkStream.Read(someBuffer, 0, 4096)
- right now client and server are located on the same network, with no congestion to speak of
- my server has plenty of memory to spare
- if I load my server software onto another machine, the problem goes away
- the kicker: traffic from a network Linux box gets through fine and on time
tcpClient.AcceptTcpClient()
方法一次阻塞大约一分钟,导致服务器不得不在短时间内读取大量字节,而不是它应该做的。它应该在发送小字节 block 时执行 networkStream.Read() 操作(客户端每 5 秒发送一次,而不是一分钟一次)。
之前对其他用户的评论表明网络或连接问题可能是次要问题,乍一看这似乎是合理的。但事实并非如此。
我更进一步,在客户端和服务器上都安装了数据包分析器。结果:
- 客户端即时发送一个它显示在服务器的分析器上
- 网络延迟或连接不是问题
- 数据包/帧在正确的时间到达服务器
- 我的分析器正在监控的网络接口(interface)卡和我的应用程序之间的某个地方导致了这种延迟
- .NET 运行时是我的应用程序和网络接口(interface)之间唯一的东西
- .NET 中的某种套接字错误是造成这种巨大延迟的原因
环境:
- 在我的具体情况下,我使用的是 Intel PRO/1000 MT 网卡和 .NET
- 标准版 Server 2003 R2,SP2
- 已安装 .NET Frameworks:2.0 SP2、3.0 SP2、3.5 SP1、4 个客户端配置文件、4 个扩展
如果有人有任何建议,我非常想知道它是什么。
最佳答案
这可能是由于以下原因之一。
- 最有可能:硬件 TCP 卸载。
据观察,该型号的网卡在其他情况下会出现 TCP 卸载问题。您可以在设备驱动程序配置中禁用它。
如果分段的卸载处理有问题,那么您可能会发现它只发生在某些网络路由上,这可以解释您观察到的 Linux 客户端和 Windows 客户端之间的差异。
- 不太可能:路径 MTU 问题。
路径 MTU 应该是自动发现的,但如果中间路由器正在丢弃所有 ICMP 流量(包括“需要分段”),那么您可能会看到挂起的连接。在您的情况下,连接最终会成功,所以我认为这不是您的问题,但值得检查。 (您也可以减少 MTU 并在必要时更改 MTU 发现算法,但您可能应该别管它,除非这是您的问题并且您无法修复路由器。)
- 不太可能:尝试设置 IPSec 连接失败。
如果 Windows 机器在域中,它可能正在尝试建立 IPSec 关系但失败了。这将取决于客户端和服务器的配置。通常这会很快失败,但如果您阻止某些 IPSec 流量,您可能会看到它缓慢失败。在您的网络分析器中查找 IKE 和 IPSec 流量。
关于c# - .NET 运行时中的 Tcp 缓冲中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8994846/