2014-09-25 95 views
1

中有「UNIX網絡編程」段落中的連接,他說:TCP套接字緩衝區大小也應該是MSS的偶數倍爲

爲了避免浪費潛在的緩衝空間,TCP套接字緩衝區大小 也應該是連接的MSS的偶數倍。某些 實現爲應用程序處理此詳細信息,在建立連接( TCPv2的第902頁)後將套接字緩衝區大小整理爲 。這是在 建立連接之前設置這兩個套接字選項的另一個原因。例如,使用8,192的默認4.4BSD大小 ,並假設以太網的MSS爲1460,則在建立連接 時,兩個套接字 緩衝區都將四捨五入爲8,760(6 x 1,460)。這不是一個關鍵的要求;在多個MSS之上的套接字緩衝區中的附加空間 僅僅是未使用的。

我無法想象如何「浪費潛在的緩衝空間」發生。爲什麼浪費
如果緩衝區大小不是MSS的偶數倍,會發生什麼情況?
任何人都可以幫我解釋嗎?或者有人可以提供一個例子或場景?

回答

2

大多數數據包都具有最大段大小(MSS)。因此,緩衝區將傾向於以MSS的倍數累積數據。如果剩餘的緩衝區空間小於MSS,當緩衝區不是MSS的整數倍時會發生這種情況,則不會有空間用於其他全尺寸數據包。在這種情況下,用於避免愚蠢窗口綜合症的算法使接收機宣告0窗口,關閉數據接收直到再次有足夠的空間容納MSS,並導致額外的緩衝空間被「浪費」。

請注意,根據收件人對數據的使用模式以及發件人生成的數據,額外的緩衝區空間可能不會完全浪費。例如,收件人可能會逐漸使用數據,在這種情況下,額外的空間將導致有足夠的空間容納MSS,而不是隻有MSS的確切整數倍的緩衝區。同樣,如果發送方逐漸產生數據,則可能會發送更小的數據包,導致數據首先不能以MSS的倍數接收。在網絡限制數據傳輸速率的情況下,這個問題基本上是一個次要的效率問題。

-1

根據報價,如果你要求一個大小爲8192的緩衝區,分配的緩衝區實際上是8760字節。這意味着分配的內存比您的應用程序打算使用的內存多。內存被浪費了,這是因爲它是爲緩衝區保留的,但實際上不會用於任何事情。

對於相同數量的已用內存,您的應用程序實際上可以使用更大的8760字節緩衝區。使用8192字節的較小緩衝區實際上並不保存任何內存,因爲在內部無論如何都會分配8760字節。

因此,如果您處於可用內存很少並計劃建立多個連接的環境中,此信息將幫助您最佳地利用您的程序中可用的小內存。

+1

這段話並不是指記憶效率;它指的是TCP數據傳輸效率。 – 2014-09-25 16:13:28

+0

報價並不真實地說出你的第一句話聲稱。這不是我見過的最好的作品,但它同時談論兩種情況:它被「某些實現」四捨五入的情況,以及它不是的情況。 – EJP 2014-09-25 23:20:09

0

你說得對,這段話是無稽之談。

  1. 如果大小是8760,沒有多餘的浪費。 8760 MSS的倍數。

  2. 最後一句似乎是在談論其中不是四捨五入到MSS的倍數的情況。

  3. 但是,這個「超額」假定所有收到的段都是MSS大小的,其中沒有保證。

  4. 它還假定應用程序在MSS大小的塊中讀取,這非常不尋常。

所以關於浪費空間的東西是完全不正確的。忽略它。

編輯這一段出現在W. R.史蒂文斯,比爾·芬納,安德魯·M.·魯道夫,unix網絡編程,第一卷,第3版,艾迪生韋斯利2004年,第7.5節,P208。公平地看待已故的WRS,應該注意的是,關於浪費空間的材料並未出現在第二版(1998)中,他最後一次寫了獨奏。據推測,它是由第三版的新合着者添加的。

史蒂文斯最初只是說,'TCP套接字緩衝區大小應該是連接的MSS的偶數倍',並且'當連接建立時'結束,沒有說什麼浪費的空間,或者爲什麼。顯然這是爲了效率在電線上。碰巧,這也通常是不正確的,因爲它假定應用程序讀取MSS大小的塊:當它不這樣做時,理由消失在窗口外面。