我寫了一個簡單的.Net客戶端,它通過TCP/IP連接到硬件設備(FPGA)。當我點擊客戶端中的按鈕時,它向設備發送一個小的(4字節)「請求」,然後立即讀取設備響應的一塊數據(大約32kb)。客戶端代碼看起來是這樣的: -減慢TCP/IP接收速度
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在更快的響應期間顯示3-4個ACK從PC傳出,但是一旦定時下降到12ms,就會增加到十幾個甚至更多。在這兩種情況下,來自FPGA的數據包的數量和大小都是相同的。我很自信,因爲它在客戶端或FPGA上的代碼不是問題(兩者都不能簡單得多) - 直覺是它是一種協議或網絡事物。有什麼想法嗎?