对于某些包大小,TcpClient上的长延迟

本文关键字:延迟 TcpClient 于某些 包大小 | 更新日期: 2023-09-27 17:50:43

我写了一个非常小的应用程序来感受一下我们本地网络上的TCP延迟。在这里,我遇到了一个非常奇怪的包大小的延迟,到目前为止,我还不能将其与我的错误联系起来。

使用下面的代码,我得到亚毫秒ping/pong时间为所有DataLength高达100 kiB,有一个奇怪的例外:如果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);
    }
}

对于某些包大小,TcpClient上的长延迟

这种延迟似乎来自于Nagle算法,该算法用于在发送之前收集多个小包裹。

我遇到的问题在这篇知识库文章中有描述。

TcpClient具有NoDelay属性,当设置为true时,将避免此行为。