Networking

TCP RWIN 是由應用程序還是作業系統設置的?

  • April 18, 2013

我有一種情況,應用程序正在偵聽 TCP 埠,並且每隔一段時間,如 tcp 轉儲中所見,將其接收視窗 (RWIN) 設置為零。發生這種情況時,它的 Recv-Q 停止移動(因為發送者停止發送)並且監聽連接/埠的應用程序執行緒只是掛起。在 WireShark 中,我看到正在生成“ZeroWindow”狀態,這發生在 RWIN 設置為 0(大小為 0 的視窗)時。

我試圖確定我的應用程序,它使用許多充滿神秘程式碼的開源庫,是否手動設置它的連接的 RWIN = 0,或者這是否發生在作業系統層。如果它是應用程序,我可以訪問所有原始碼,並且通過一些努力可以正確調試它。

但是如果它的作業系統說“嘿,這個連接有問題,將 RWIN 設置為 0… ”,那麼我不知道如何進行診斷。有什麼想法嗎?提前致謝!

接收視窗由作業系統計算/設置。net.core.rmem_maxLinux 可以通過sysctl 設置更改可用於接收 TCP 數據包的記憶體。

TCP 性能調整的頁面有很多,例如這一頁:

http://fasterdata.es.net/host-tuning/linux/

唉,這很可能對您沒有幫助,因為它只會增加緩衝的數據量。

如果緩衝區已滿,則視窗大小設置為 0。您必須查看應用程序以了解為什麼它不從 TCP 緩衝區收集數據。日誌文件,在調試模式下啟動它等等。在作業系統級別上你無能為力。

引用自:https://serverfault.com/questions/500579