2016-01-28 83 views
3

我寫了一個簡單的.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上的代碼不是問題(兩者都不能簡單得多) - 直覺是它是一種協議或網絡事物。有什麼想法嗎?

回答

0

你看過這個類似問題中的各種答案:https://serverfault.com/questions/215674/latency-in-tcp-ip-over-ethernet-networks/215963?我懷疑問題在於窗口大小或ack算法悲觀地重新配置自己,但唯一真正的方法是嘗試在客戶端和服務器上一次調整一件事物,直到發現性能差異爲止。很多自適應算法(如Nagle)默認都在使用,有時會對本地流量產生意想不到的後果。