对于某些包大小,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);
}
}
这种延迟似乎来自于Nagle算法,该算法用于在发送之前收集多个小包裹。
我遇到的问题在这篇知识库文章中有描述。
TcpClient
具有NoDelay
属性,当设置为true时,将避免此行为。