1. 程式人生 > >TCP 拆包、粘包

TCP 拆包、粘包

拆包、粘包舉例

比如傳送端要往接收端傳送2個數據包 1.收到2個數據包,沒傳送拆包和粘包情況; 2.收到1個數據包,TCP把2個數據包合成1個傳送給接收端了,這樣應用層不能處理合成1個的兩個資料包,應用層不知道兩個資料包之間的分隔在哪,所以很難處理,這是粘包問題; 3.收到2個數據包,但1個數據包產生了粘包(傳送端的1個半資料包),另1個數據包產生了拆包(只有傳送端中1個數據包的半個包),這樣應用層也是很難處理粘包、拆包的;

粘包、拆包發生原因

發生TCP粘包或拆包有很多原因,現列出常見的幾點,可能不全面,歡迎補充,

1、要傳送的資料大於TCP傳送緩衝區剩餘空間大小,將會發生拆包。

2、待發送資料大於MSS(最大報文長度),TCP在傳輸前將進行拆包。

3、要傳送的資料小於TCP傳送緩衝區的大小,TCP將多次寫入緩衝區的資料一次傳送出去,將會發生粘包。

4、接收資料端的應用層沒有及時讀取接收緩衝區中的資料,將發生粘包。

解決

由於TCP是不知道應用層的資料包的分界的,所以我們應用層是決定不了傳輸層對資料包拆包還是粘包,不過應用層可以通應用層協議棧設計給資料包加分界標記,來處理最後接收到的資料,不管拆分還是粘包都可以處理好。 1.傳送端給資料包增加首部,首部包含資料包中資料的長度,這樣接收端的應用層接收資料後,根據首部中的長度就知道資料的實際長度了,可以很好處理資料了。 通常設計思路,比如第1個欄位使用32int表示資料的長度,接著是資料內容。 2.設定資料包的長度為固定的長度,不夠資料則以空格填補; 3.應用層在傳送每個資料包時,給每個資料包加分界標記,比如回車換行.