TcpClient对某些包装尺寸的延迟很长?

时间:2014-03-17 16:43:52

标签: c# tcp

我编写了一个非常小的应用程序,以了解我们本地网络上的TCP延迟。这就是我遇到某些包装尺寸的一个非常奇怪的延迟,我现在可能与我的错误无关。

使用下面的代码,对于高达100 kiB的所有DataLength,我得到亚毫秒的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);
    }
}

1 个答案:

答案 0 :(得分:1)

此延迟似乎来自Nagle's Algorithm之类的内容,用于在发送之前收集多个小包。

我遇到的问题在此knowledgebase article.

中有所描述

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