什么可能导致我的应用程序中的TCP ACK延迟

时间:2016-01-18 05:23:49

标签: c# sockets networking tcp

我有一个.NET Windows服务,它使用开源库(Asterisk.net - C#)来侦听特定端口上的TCP连接。

此服务部署在Windows 7的多个VM实例上(均来自同一源图像)。连接都来自VM主机(centos)。在这些实例中的一个(且仅一个)中,在偶尔的传入连接上,从窗口到连接客户端的ACK响应被延迟三秒。其他时候,会立即发送ACK。

此延迟导致客户超时:

Wireshark trace

我不是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;
    }

那么,什么可能导致这种令人愤怒的延迟?我错过了什么?

1 个答案:

答案 0 :(得分:0)

您录制的这3个数据包是建立连接。见https://en.m.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment
但是,如果它仅在1个VM中发生,那么它就没有编程问题。尝试以不同的顺序加载VM,检查防火墙设置等。
此外,使用HWGroup Hercules等网络终端软件进行测试,并使用Sysinternals TCPView监控连接。