降低 TCP/IP 接收速度
本文关键字:速度 IP TCP 降低 | 更新日期: 2023-09-27 18:32:22
我编写了一个简单的.Net客户端,它通过TCP/IP连接到硬件设备(FPGA)。当我单击客户端中的按钮时,它会向设备发送一个小(4字节)"请求",然后立即读取设备响应的数据块(约32kb)。客户端代码如下所示:-
var stream = _tcpClient.GetStream();
stream.Write(requestData, 0, requestData.Length);
using (var ms = new MemoryStream())
{
var tempBuffer = new byte[65535];
do
{
var numBytesRead = stream.Read(tempBuffer, 0, tempBuffer.Length);
ms.Write(tempRead, 0, numBytesRead);
}
while(ms.Length < ExpectedResponseSize);
_hardwareResponse = ms.ToArray();
}
在上面的代码中使用秒表通常会报告 2-3 毫秒来读回整个 32kb 响应,如果我反复缓慢单击按钮(例如每秒一次),这个时间保持一致。
如果我开始更快地点击按钮(例如每半秒一次),那么几秒钟后,时间突然下降到大约 12 毫秒并保持在那里,即使我回到缓慢点击按钮。如果我关闭然后重新打开客户端上的连接并重试,它会恢复到 2-3 毫秒的时间。
WireShark 在更快的响应过程中显示 3-4 个 ACK 从 PC 中出来,但一旦定时下降到 12 毫秒,这一数字就会增加到十几个或更多。在这两种情况下,来自FPGA的数据包的数量和大小是相同的。我尽可能自信地认为,客户端或FPGA上的代码不是问题(两者都不能变得简单得多) - 直觉是它是一个协议或网络的东西。有什么想法吗?
你有没有看过这个类似问题中的各种答案:https://serverfault.com/questions/215674/latency-in-tcp-ip-over-ethernet-networks/215963?我怀疑问题是窗口大小或 ack 算法悲观地重新配置自己,但唯一真正的方法是尝试在客户端和服务器上一次调整一件事,直到您发现性能差异。 默认情况下使用许多自适应算法(如 Nagle),有时会对本地流量产生意想不到的后果。