TCP 和 UDP 套接字緩衝區

1、MTU(Maximum Transmission Unit)

最大傳輸單元,在數據鏈路層中,往往規定了MTU大小,IP層的數據包通過數據鏈路層如果大於MTU,將被分片,到達接收端IP層後再被重組。以太網的MTU爲1500字節。

2、MSS(Maximum Segment Size)

最大報文段,是TCP協議的一個選項。MSS選項用於在TCP建立連接時,收發雙方協商一個TCP報文段所能承載的最大數據長度。MSS選項只在初始化連接請求(SYN=1)的報文段中使用。選擇合適的MSS很重要。如果MSS小了,網絡利用率低。如果MSS大了,由於在網絡層需要分片,也會影響網絡性能。一般MSS的長度爲MTU(1500)-IP首部(20)-TCP首部(20)=1460字節。

3、TCP的緩衝區

如上圖所示,每一個TCP套接字都有一個發送緩衝區,可以使用SO_SNDBUF套接字選項來更改緩衝區大小。我們調用send發送數據的時候(默認阻塞模式),如果緩衝區沒滿,調用直接返回。但是這僅僅表明數據被複制到緩衝區中,並不表明對端接收到數據。系統內核在IP層發送數據的時候,並不是按照我們調用send接口發送的數據包大小來進行發送,即使我們調用send發送的數據大小小於1460字節(MTU-TCP首部-IP首部)。因爲我們調用send接口實際是將數據複製到緩衝區中,而內核基本上是按照最大MSS大小(1460字節)從緩衝區中取數據發送出去,當緩衝區中數據小於MSS,則將剩餘數據全部發送出去。TCP的發送緩衝區必須爲已發送的數據保留一個副本,直到它被對端確認爲止,才能從緩衝區中刪掉已確認的數據。

TCP接收緩衝區,可以通過SO_RCVBUF套接字選項來更改。接收緩衝區被TCP用來保存接收到的數據,直到應用程序來讀取。對於TCP來說,接收緩衝區中可用空間的大小限定了TCP通告對端的窗口大小。TCP套接字的接收緩衝區不能溢出,所以發送端不能發送超過接收端通知的窗口大小,否則在接收端將丟棄數據包。

4、UDP的緩衝區

                                          

以虛線框展示套接字發送緩衝區,因爲它實際上並不存在,UDP有發送緩衝區大小,也可以通過SO_SNDBUF套接字選項更改它,不過它不同於TCP的發送緩衝區大小,它僅僅是可以寫到該套接字的UDP數據報的大小上限。如果一個應用程序寫一個大於套接字發送緩衝區大小的數據報,內核將返回一個EMSGSIZE錯誤。UDP緩衝區中數據被髮送完之後,該數據就被刪除了。我們調用sendto發送數據的時候,內核在收到用戶的數據報,僅僅給數據包加上8字節的首部構成UDP數據報,然後就傳給IP層(寫一個UDP套接字的write調用成功返回表示所寫的數據報或其所有分段已被加入數據鏈路層的輸出隊列中。如果該隊列沒有足夠的空間存放該數據報或它的某個片段,內核通常會返回一個ENOBUFS錯誤給它的應用程序。)。如果數據報大小小於MTU,則直接發送給對端;如果大於MTU,則會被分片。所以通過UDP協議發送數據報,應該考慮發送的數據包小於MTU-8(UDP首部)-20(IP首部),這樣在通過IP層就不用分片,丟包率將比分片處理的情況小很多。

UDP的接收緩衝區,同樣通過SO_RCVBUF套接字選項更改它。當接收到的數據報裝不進接收緩衝區,該數據報就被丟棄。

5、TCP緩衝區的調用順序

當設置TCP套接字緩衝區大小時,函數的調用順序很重要。因爲TCP的窗口規模選項是在建立連接時用SYN分節與對端互換得到的。對於客戶端,這意味着緩衝區選項必須在調用connect之前設置。對於服務端,這意味着該選項必須在調用listen之前給監聽套接字設置,已連接套接字的緩衝區大小總是從監聽套接字繼承而來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章