c# - .NET 运行时中的 Tcp 缓冲中断

标签 c# .net sockets tcp

这是我不久前放弃的一个老问题,因为我找不到解决方案,而且它只影响了一台服务器(所以我只是把我的服务放在其他地方)。 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 客户端之间的差异。

示例:http://forums.novell.com/novell-product-support-forums/netware/nw-other/communications/187741-offload-tcp-segmentation-intel-pro-1000-mt.html

  • 不太可能:路径 MTU 问题。

路径 MTU 应该是自动发现的,但如果中间路由器正在丢弃所有 ICMP 流量(包括“需要分段”),那么您可能会看到挂起的连接。在您的情况下,连接最终会成功,所以我认为这不是您的问题,但值得检查。 (您也可以减少 MTU 并在必要时更改 MTU 发现算法,但您可能应该别管它,除非这是您的问题并且您无法修复路由器。)

  • 不太可能:尝试设置 IPSec 连接失败。

如果 Windows 机器在域中,它可能正在尝试建立 IPSec 关系但失败了。这将取决于客户端和服务器的配置。通常这会很快失败,但如果您阻止某些 IPSec 流量,您可能会看到它缓慢失败。在您的网络分析器中查找 IKE 和 IPSec 流量。

关于c# - .NET 运行时中的 Tcp 缓冲中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8994846/

相关文章:

C# - 附加调试器失败后如何继续 - System.Diagnostics.Debugger.Launch()

.net - Iterop Forms Toolkit 验证和焦点事件

sockets - CFWriteStreamScheduleWithRunLoop 有时有效,有时无效?

java - Apache mina SocketAcceptor 与 java.net.Socket 通信

c# - "GodMode"文件夹内容c#

JAVA 客户端/服务器计算器示例

c# - 线程的奇怪地方?

javascript - WebKitBrowser.StringByEvaluatingJavaScriptFromString 不返回任何值

c# - 如何在 C# 中制作/设计一个在运行时可以具有不同类型成员的类

c# - 为什么我会收到此异常 : "he ' Microsoft. ACE.OLEDB.12。 0' provider is not registered on the local machine"?