套接字中緩衝區

2021-08-20 11:59:29 字數 2110 閱讀 9627

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層。如果資料報大小小於mtu,則直接傳送給對端;如果大於mtu,則會被分片。所以通過udp協議傳送資料報,應該考慮傳送的資料報小於mtu-8(udp首部)-20(ip首部),這樣在通過ip層就不用分片,丟包率將比分片處理的情況小很多。

udp的接收緩衝區,同樣通過so_rcvbuf套接字選項更改它。當接收到的資料報裝不進接收緩衝區,該資料報就被丟棄。

5、tcp緩衝區的呼叫順序

當設定tcp套接字緩衝區大小時,函式的呼叫順序很重要。因為tcp的視窗規模選項是在建立連線時用syn分節與對端互換得到的。對於客戶端,這意味著緩衝區選項必須在呼叫connect之前設定。對於服務端,這意味著該選項必須在呼叫listen之前給監聽套接字設定,已連線套接字的緩衝區大小總是從監聽套接字繼承而來。

6、tcp套接字緩衝區的效能

在設定套接字緩衝區大小時需要考慮效能問題。下圖展示了兩個端點間容量為8個分節的乙個tcp連線(稱其為管道)。

我們在頂部給出4個資料分節,在底部給出4個ack。即使管道中只有4個資料分節,客戶端也必須有至少8個分節容量的傳送緩衝區,因為客戶端tcp必須為每個分節保留乙個副本,直到接收到來自伺服器的相應ack。這裡涉及管道容量的概念,稱為「頻寬-延遲積(bandwidth-delay product)」,它通過將頻寬(bit/s)和rtt(s)相乘,再將結果由位轉換為位元組計算得到。其中,rtt可以使用ping程式測得。例如,客戶端到服務端頻寬為100mb/s,客戶端到服務端rtt為1ms,則頻寬-延遲積為100*1/8為12.5kb。當套接字緩衝區大小小於該值,管道將不會處於滿狀態,效能達不到最高,所以緩衝區一般設定略大於頻寬-延遲積。當頻寬變大或者rtt變大,套接字緩衝區也需要增長。

注:以上參考《unix網路編輯卷1》2.11和7.5.8章節

socket套接字中的緩衝區

套接字是一種通訊機制 通訊的兩方的一種約定 憑藉這種機制,不同主機之間的程序可以進行通訊。我們可以用套接字中的相關函式來完成通訊過程。套接字的特性有三個屬性確定,它們是 域 domain 型別 type 和協議 protocol include include intsocket int domai...

緩衝區設定 套接字緩衝區大小及限制

pv4資料報的最大值是65535位元組,包括ipv4首部。ipv6資料報的最大值是65575位元組,包括40位元組的首部。mtu ip資料報的最大傳輸單元,乙太網的mtu是1500位元組。ipv4要求的最小鏈路mtu是68位元組。ipv6要求的最小鏈路mtu是1280位元組。如果乙個ipv6的資料報...

套接字的接受緩衝區及傳送緩衝區

1.套接字的接受緩衝區及傳送緩衝區 net.ipv4.tcp rmem 這個引數定義了tcp接收緩衝 用於tcp接收滑動視窗 的最小值 預設值 最大值 net.ipv4.tcp wmem 這個引數定義了tcp傳送緩衝 用於tcp傳送滑動視窗 的最小值 預設值 最大值 netdev max backl...