什麼是粘包 拆包?

2022-05-08 02:39:11 字數 1357 閱讀 6259

什麼是粘包、拆包?

對於什麼是粘包、拆包問題,我想先舉兩個簡單的應用場景:

客戶端和伺服器建立乙個連線,客戶端傳送一條訊息,客戶端關閉與服務端的連線。

客戶端和伺服器簡歷乙個連線,客戶端連續傳送兩條訊息,客戶端關閉與服務端的連線。

對於第一種情況,服務端的處理流程可以是這樣的:當客戶端與服務端的連線建立成功之後,服務端不斷讀取客戶端傳送過來的資料,當客戶端與服務端連線斷開之後,服務端知道已經讀完了一條訊息,然後進行解碼和後續處理...。對於第二種情況,如果按照上面相同的處理邏輯來處理,那就有問題了,我們來看看第二種情況下客戶端傳送的兩條訊息遞交到服務端有可能出現的情況:

第一種情況:

服務端一共讀到兩個資料報,第乙個包包含客戶端發出的第一條訊息的完整資訊,第二個包包含客戶端發出的第二條訊息,那這種情況比較好處理,伺服器只需要簡單的從網路緩衝區去讀就好了,第一次讀到第一條訊息的完整資訊,消費完再從網路緩衝區將第二條完整訊息讀出來消費。

沒有發生粘包、拆包示意圖

第二種情況:

服務端一共就讀到乙個資料報,這個資料報包含客戶端發出的兩條訊息的完整資訊,這個時候基於之前邏輯實現的服務端就蒙了,因為服務端不知道第一條訊息從哪兒結束和第二條訊息從哪兒開始,這種情況其實是發生了tcp粘包。

tcp粘包示意圖

第三種情況:

服務端一共收到了兩個資料報,第乙個資料報只包含了第一條訊息的一部分,第一條訊息的後半部分和第二條訊息都在第二個資料報中,或者是第乙個資料報包含了第一條訊息的完整資訊和第二條訊息的一部分資訊,第二個資料報包含了第二條訊息的剩下部分,這種情況其實是傳送了tcp拆,因為發生了一條訊息被拆分在兩個包裡面傳送了,同樣上面的伺服器邏輯對於這種情況是不好處理的。

tcp拆包示意圖

為什麼會發生tcp粘包、拆包呢?

發生tcp粘包、拆包主要是由於下面一些原因:

應用程式寫入的資料大於套接字緩衝區大小,這將會發生拆包。

應用程式寫入資料小於套接字緩衝區大小,網絡卡將應用多次寫入的資料傳送到網路上,這將會發生粘包。

進行mss(最大報文長度)大小的tcp分段,當tcp報文長度-tcp頭部長度》mss的時候將發生拆包。

接收方法不及時讀取套接字緩衝區資料,這將發生粘包。

……如何處理粘包、拆包問題?

知道了粘包、拆包問題及根源,那麼如何處理粘包、拆包問題呢?tcp本身是面向流的,作為網路伺服器,如何從這源源不斷湧來的資料流中拆分出或者合併出有意義的資訊呢?通常會有以下一些常用的方法:

使用帶訊息頭的協議、訊息頭儲存訊息開始標識及訊息長度資訊,服務端獲取訊息頭的時候解析出訊息長度,然後向後讀取該長度的內容。

設定定長訊息,服務端每次讀取既定長度的內容作為一條完整訊息。

設定訊息邊界,服務端從網路流中按訊息編輯分離出訊息內容。

……

什麼是TCP粘包 拆包問題

產生粘包和拆包問題的主要原因是,作業系統在傳送tcp資料的時候,底層會有乙個緩衝區,例如1024個位元組大小,如果一次請求傳送的資料量比較小,沒達到緩衝區大小,tcp則會將多個請求合併為同乙個請求進行傳送,這就形成了粘包問題 如果一次請求傳送的資料量比較大,超過了緩衝區大小,tcp就會將其拆分為多次...

TCP粘包 拆包

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

TCP粘包,拆包

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