我有一个.NET Windows服务,它使用开源库(Asterisk.net - C#)来侦听特定端口上的TCP连接。
此服务部署在Windows 7的多个VM实例上(均来自同一源图像)。连接都来自VM主机(centos)。在这些实例中的一个(且仅一个)中,在偶尔的传入连接上,从窗口到连接客户端的ACK响应被延迟三秒。其他时候,会立即发送ACK。
此延迟导致客户超时:
我不是TCP套接字的专家,但是从调试看来,在将连接传递给应用程序(或者在这种情况下是库)之前发送这些ACK,即使接受线程被阻止,所以它在Windows或.net库级别是一个问题吗?
处理入站连接的代码会快速将其移交给线程并返回。
public IO.SocketConnection Accept()
{
if (tcpListener != null)
{
TcpClient tcpClient = tcpListener.AcceptTcpClient();
if (tcpClient != null)
return new IO.SocketConnection(tcpClient, encoding);
}
return null;
}
那么,什么可能导致这种令人愤怒的延迟?我错过了什么?
答案 0 :(得分:0)
您录制的这3个数据包是建立连接。见https://en.m.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment。
但是,如果它仅在1个VM中发生,那么它就没有编程问题。尝试以不同的顺序加载VM,检查防火墙设置等。
此外,使用HWGroup Hercules等网络终端软件进行测试,并使用Sysinternals TCPView监控连接。