SOCKET通訊中TCP資料報大小的確定

2021-08-26 23:54:44 字數 1330 閱讀 8717

mss(maximun segment size)

最大分段大小,tcp有乙個最大分段大小,用於通告對端每個分段中能傳送的最大tcp資料量。mss的目的是告訴對端其重組緩衝區大小的實際值,從而避免分片。mss經常設計成mtu減去ip和tcp首部的固定長度。乙太網中使用ipv4mss值為1460,使用ipv6的mss值為1440(兩者tcp首部都是20位元組,但是ipv6首部是40位元組,ipv4首部是20位元組)。

如果我們定義的tcp和udp包沒有超過範圍,那麼我們的包在ip層就不用分包了,這樣傳輸過程中就避免了在ip層組包發生的錯誤;

如果超過範圍,既ip資料報大於1500位元組,傳送方ip層就需要將資料報分成若干片,而接收方ip層就需要進行資料報的重組。更嚴重的是,如果使用udp協議,當ip層組包發生錯誤,那麼包就會被丟棄。接收方無法重組資料報,將導致丟棄整個ip資料報。udp不保證可靠傳輸;但是tcp發生組包錯誤時,該包會被重傳,保證可靠傳輸。

udp資料報的長度是指包括報頭和資料部分在內的總位元組數,其中報頭長度固定,資料部分可變。資料報的最大長度根據操作環境的不同而各異。從理論上說,包含報頭在內的資料報的最大長度為65535位元組(64k)。

我們在用socket程式設計時, udp協議要求包小於64k,tcp沒有限定。不過鑑於internet上的標準mtu值為576位元組,所以建議在進行internet的udp程式設計時,最好將udp的資料長度控制在548位元組 (576-8-20)以內,就具體函式而言:

用udp協議傳送時,用sendto函式最大能傳送資料的長度為:65535- ip頭(20) – udp頭(8)=65507位元組。用sendto函式傳送資料時,如果傳送資料長度大於該值,則函式會返回錯誤。 

用tcp協議傳送時,由於tcp是資料流協議,因此不存在包大小的限制(暫不考慮緩衝區的大小),這是指在用send函式時,資料長度引數不受限制。而實際上,所指定的這段資料並不一定會一次性傳送出去,如果這段資料比較長會被分段傳送,如果比較短,可能會等待和下一次資料一起傳送。

最大報文段長度(m s s)(maximum segment size)表示t c p傳往另一端的最大塊資料的長度。當乙個連線建立時【三次握手】,連線的雙方都要通告各自的m s s。

我們已經見過m s s(maximum segment size)都是1 0 2 4。(m s s選項只能出現在sy n報文段中)。如果一方不接收來自另一方的m s s值,

則ms s就定為預設值5 3 6位元組(這個預設值允許2 0位元組的i p首部和2 0位元組的t c p首部以適合5 7 6位元組i p資料報)。

所以如果傳的報文長度大於緩衝區長度 那麼會被拆分成多個包 傳送

TCP IP通訊中資料報處理

參考 宋勁杉 的 linux c 1 目的主機收到資料報,處理各層協議棧最後達到應用程式的過程。乙太網驅動程式首先根據乙太網首部中的 上層協議 字段確定該資料幀的有效載荷 payload,指除去協議首部之外實際傳輸的資料 是ip arp還是rarp協議的資料報,然後交給相應的協議處理。假如是ip資料...

socket實現TCP通訊

tcp是一種可靠的,面向連線的協議。在socket中,建立tcp連線的過程大致如下 伺服器端 1.初始化套接字 2.建立伺服器socket 3.將本機位址與伺服器socket繫結在一起 4.伺服器開始監聽 5.伺服器確認請求 確認之前時一種阻塞的狀態 accept 函式生成乙個新的socket。6....

Tcp通訊 Socket)初學

第一次接觸socket的時候覺得挺好玩的,在閒暇之餘寫下了這個第乙個socket專案 使用於初學著 不喜勿噴 客戶端 suppresswarnings resource public static void main string args throws exception in.close 根據節...