TCP的粘包和拆包

2021-10-04 04:59:51 字數 452 閱讀 4487

簡單地說,比如客戶端呼叫

client.send(「1」);

client.send(「2」);

clinet.send(「3」);

底層的tcp可能會把這幾個小包合起來成為乙個大包,因此底層可能的呼叫是client.send(「123」);

另一種情況是伺服器沒有及時處理資料:

伺服器先後收到三個包"1",「2」,「3」,伺服器沒有及時處理,這三個包粘成了"123",由於伺服器不知道包的邊界,因此只能一起取出,而不知道分三次取出。把大包"123"拆成三個小包"1",「2」,"3"的過程就叫拆包。拆包只能依賴應用層來解決;

要是這三個包是有聯絡的,那麼就不需要拆包;

要是這三個包是不相聯的,那麼就需要拆包了。

粘包的原因:資料流是沒有邊界的

拆包的關鍵:為基於資料流的包新增邊界:如加入分界符,將包分為資料頭和資料體等。

參考:

TCP粘包和拆包

當傳送包同時傳送兩個資料報時,接收包只收到了乙個資料報,其中包含了兩個資料報的資訊,這種現象為粘包。這種情況下,接收方無法分清兩個資料報的界限,很難處理 當傳送包同時傳送兩個資料報時,接收方也收到了兩個資料報。但是這兩個資料報,乙個是不完整的,乙個是多出來一塊,這種現象為拆包。訊息定長 傳送方將資料...

TCP粘包 拆包

tcp粘包 拆包 客戶端發服務端傳送了兩個資料報a和b 粘包 服務端一次性接收到了a和b 拆包 服務端第一次接收了a和b的一部分,第二次接收到了b的剩餘部分 粘包 拆包原因 1 應用程式寫入的位元組大小 socket傳送緩衝區大小 2 tcp分段 tcp data部分的大小 mss max segm...

TCP粘包,拆包

粘包 拆包表現形式 現在假設客戶端向服務端連續傳送了兩個資料報,用packet1和packet2來表示,那麼服務端收到的資料可以分為三種,現列舉如下 第一種情況,接收端正常收到兩個資料報,即沒有發生拆包和粘包的現象,此種情況不在本文的討論範圍內。第二種情況,接收端只收到乙個資料報,由於tcp是不會出...