2009-06-19 35 views
3

在閱讀this文章時,我有一個疑問。關於Winsock內核緩衝區和Nagle算法的疑問

我明白,雖然轉移小數據,但默格啓用了Nagle算法,它將小數據包合併。這會導致在傳輸之前緩存一些數據。我相信Winsock Kernel Buffer是緩存發生的地方。糾正我,如果我錯了。

是否意味着如果使用SO_SNDBUF選項將Winsock內核緩衝區設置爲零,是否將禁用Nagle算法?

如果不是那麼WINSOCK緩存小數據在哪裏?

回答

5

你提到的知識庫文章給你的答案這樣...

要在應用層優化性能,從應用程序的Winsock 複製數據緩衝區發送到一個Winsock內核緩衝區電話。然後,堆棧使用自己的啓發式(如Nagle算法)來確定實際將數據包放置在線路上的時間。

和,設置TCP_NODELAY或SO_SNDBUF = 0將禁用Nagle算法如下,

TCP_NODELAY套接字選項施加到禁用Nagle算法使得小數據分組被遞送到遠程主機沒有延遲。

您可以使用SO_SNDBUF選項(默認爲8K)更改分配給套接字的Winsock內核緩衝區的數量。如有必要,Winsock可以緩衝大於SO_SNDBUF緩衝區的大小。在大多數情況下,應用程序中的發送完成僅指示應用程序發送調用中的數據緩衝區被複制到Winsock內核緩衝區,並且不表示數據已經到達網絡介質。唯一的例外是通過將SO_SNDBUF設置爲0來禁用Winsock緩衝。


閱讀下面的評論,我意識到,因爲設置TCP_NODELAY或設置SO_SNDBUF = 0似乎都在做同樣的事情,你可能會感到困惑。如果是這種情況,請注意,Nagle僅適用於TCP流(將數據分段爲數據包),而SO_SNDBUF也適用於UDP套接字。

將SO_SNDBUF設置爲零將明確停止所有輸出緩衝,並立即爲套接字上的每個'write'嘗試立即調度(至少在普通套接字實現中)。

設置TCP_NODELAY將明確地停止TCP套接字上的Nagle算法,儘管發送緩衝區可能可用並用於延遲調度(在嚮應用程序確認發送成功之後)。

+0

它仍然不清楚。它說使用TCP_NODELAY來禁用它。最後突出顯示的聲明表示,發送完成通知延遲到實際發送數據時爲止。不是關於禁用Nagle算法。 – Canopus 2009-06-19 12:13:41

0

將SO_SNDBUF設置爲0不會強制立即在線路上發送。

0

將SO_SNDBUF設置爲零將而不是隱式禁用nagle;由WSK維護的鷹狀態獨立於緩衝區所在的位置。它的你的責任,以保持你有效的緩衝區,直到運輸消耗它。