我编写了一个非常小的应用程序,以了解我们本地网络上的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);
}
}
答案 0 :(得分:1)
此延迟似乎来自Nagle's Algorithm之类的内容,用于在发送之前收集多个小包。
我遇到的问题在此knowledgebase article.
中有所描述 TcpClient
具有NoDelay
属性,当设置为true时,可以避免此行为。