我编写了一个简单的.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-3ms来读回整个32kb的响应,如果我反复慢慢地点击按钮(例如每秒一次),这个时间保持一致。
如果我开始更快地点击按钮(例如每半秒钟),那么几秒钟之后,即使我回到慢慢点击按钮,时间也会突然下降到12ms左右并停留在那里。如果我关闭然后重新打开客户端上的连接并再试一次,则会回到2-3ms。
WireShark在更快的响应期间显示出来自PC的3-4个ACK,但是一旦时间下降到12ms,这会增加到十几个。在这两种情况下,来自FPGA的数据包的数量和大小都是相同的。我尽可能地相信它在客户端或FPGA上的代码中不是问题(也不会变得更简单) - 直觉是它是一个协议或网络的东西。有什么想法吗?
答案 0 :(得分:0)
您是否看过这个类似问题中的各种答案:https://serverfault.com/questions/215674/latency-in-tcp-ip-over-ethernet-networks/215963?我怀疑问题是窗口大小或ack算法悲观地重新配置自己,但唯一真正的方法是尝试在客户端和服务器上一次调整一件事,直到你发现性能差异为止。默认情况下会使用许多自适应算法(如Nagle),有时会对本地流量产生意外后果。