2010-11-23 48 views
21

您能否解釋一下SO_SNDBUFSO_RECVBUF選項的具體含義?什麼是SO_SNDBUF和SO_RECVBUF

好的,出於某種原因,操作系統緩衝了傳出/接收數據,但我想澄清這個問題。

他們的作用(一般)是什麼?

它們是每插座緩衝區嗎?

傳輸層的緩衝區(例如TCP緩衝區)和這些緩衝區之間是否存在連接?

當使用流套接字(TCP)和使用無連接套接字(UDP)時,它們有不同的行爲/角色嗎?

好文章也會很棒。

我使用了它,但沒有找到任何有用的信息。

回答

3

搜索谷歌爲 「SO_RECVBUF MSDN」 給我......

http://msdn.microsoft.com/en-us/library/ms740476(VS.85).aspx

,回答你 「是他們每個插座」 從選項表中的這些行:

SO_RCVBUF int Specifies the total per-socket buffer space reserved for receives. 
SO_SNDBUF int Specifies the total per-socket buffer space reserved for sends. 

隨着稍後更詳細地描述:

SO_RCVBUF and SO_SNDBUF 
When a Windows Sockets implementation supports the SO_RCVBUF and SO_SNDBUF options, an application can request different buffer sizes (larger or smaller). The call to setsockopt can succeed even when the implementation did not provide the whole amount requested. An application must call getsockopt with the same option to check the buffer size actually provided. 
49

「SO_」前綴用於「套接字選項「,所以是的,這些是針對每個套接字緩衝區的每個套接字設置。通常有系統範圍的默認值和最大值。

SO_RCVBUF更容易理解:它是內核分配的緩衝區的大小,用於在數據到達網絡之間以及擁有此套接字的程序讀取數據期間將數據保存到給定套接字中。對於TCP,如果數據到達並且您沒有讀取它,緩衝區將被填滿,並且發送者將被告知放慢速度(使用TCP窗口調整機制)。對於UDP,一旦緩衝區已滿,新的數據包將被丟棄。

SO_SNDBUF,我認爲只對TCP有幫助(在UDP中,無論你發送的是什麼,直接發送到網絡)。對於TCP,如果遠程端沒有讀取,可以填充緩衝區(以便遠程緩衝區變滿,然後TCP將此事實傳達給您的內核,並且您的內核停止發送數據,而是將其累積在本地緩衝區中,直到它填上)。或者如果存在網絡問題,並且內核沒有得到它發送的數據的確認,它可能會填滿。然後它會減慢在網絡上發送數據的速度,直到最終輸出緩衝區填滿。如果是這樣,應用程序將來的write()調用此套接字將阻塞(如果您已設置O_NONBLOCK選項,則返回EAGAIN)。

這一切最好在Unix Network Programming書中描述。

7

在Windows中,發送緩衝區確實對UDP有影響。如果將數據包發送出去的速度比網絡傳輸速度快,最終將填充套接字輸出緩衝區,SendTo將以「將阻止」失敗。增加SO_SNDBUF將對此有所幫助。我不得不增加發送緩衝區和接收緩衝區,以便進行測試,以便查找我可以在Windows盒子和Linux盒子之間發送的最大數據包速率。我也可以通過檢測「會阻塞」錯誤代碼,休眠一下並重試來處理髮送大小。但增加發送緩衝區的大小更簡單。 Windows中的默認值是8K,在這個帶有GB內存的PC時代,這似乎是不必要的小事!