【问题标题】:Long delay on TcpClient for certain package sizes?某些包大小的 TcpClient 长时间延迟?
【发布时间】:2014-03-17 16:43:52
【问题描述】:

我编写了一个非常小的应用程序来了解我们本地网络上的 TCP 延迟。这就是我遇到某些包大小的非常奇怪的延迟的地方,到目前为止我可能与我的错误无关。

使用下面的代码,我得到了所有 DataLength 最大 100 kiB 的亚毫秒 ping/pong 时间,但有一个奇怪的例外:如果 DataLength 在大约 1010 和 2400 字节之间,似乎有一个固定的 400ms 延迟添加到我无缘无故地看到了。

这么长的延迟从何而来?

客户端代码

using (var client = new TcpClient())
{
    client.Connect(Server);  // Server is set somewhere else

    var stream = client.GetStream();
    var writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true };
    var reader = new StreamReader(stream, Encoding.UTF8);


    Stopwatch stopwatch = new Stopwatch();
    string data = "".PadLeft(DataLength, 'T');

    for (int i = 0; i < NumberOfPings; i++)
    {
        stopwatch.Restart();
        writer.WriteLine(data);
        reader.ReadLine();
        // record elapsed time
    }
}

服务器代码

while (true)
{
    var client = tcpListener.AcceptTcpClient();

    var stream = client.GetStream();
    var reader = new StreamReader(stream, Encoding.UTF8);
    var writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true };
    while (client.Connected)
    {
        var request = reader.ReadLine();
        if (request == null)
            break;
        writer.WriteLine(request);
    }
}

【问题讨论】:

    标签: c# tcp


    【解决方案1】:

    这种延迟似乎来自Nagle's Algorithm 之类的东西,它用于在发送之前收集多个小包裹。

    这个knowledgebase article.描述了我遇到的问题

    TcpClient 有一个 NoDelay 属性,当设置为 true 时,可以避免这种行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多