什麼是tcp粘包和拆包
因爲tcp協議是基於流的傳輸層協議,他會根據tcp緩衝區的實際情況對數據包進行拆分或合併,所以對於上層應用來說,會發生一個大的數據包被tcp拆分成多個小的數據包或多個小的數據包被tcp合併成一個大的數據包的情況。
導致tcp粘包和拆包原因
- 要發送的數據大於TCP發送緩衝區剩餘空間大小,將會發生拆包
- 待發送數據大於MSS(最大報文長度),TCP在傳輸前將進行拆包
- 要發送的數據小於TCP發送緩衝區的大小,TCP將多次寫入緩衝區的數據一次發送出去,將會發生粘包
- 接收數據端的應用層沒有及時讀取接收緩衝區中的數據,將發生粘包
tcp粘包和拆包的解決方案
-
定長消息
發送端將每個數據包封裝爲固定長度(不夠的可以通過補0填充),這樣接收端每次從接收緩衝區中讀取固定長度的數據就自然而然的把每個數據包拆分開來
-
分隔符分割
可以在數據包之間設置邊界,如添加特殊符號,這樣,接收端通過這個邊界就可以將不同的數據包拆分開
-
消息頭中標識消息長度
發送端給每個數據包添加包首部,首部中應該至少包含數據包的長度,這樣接收端在接收到數據後,通過讀取包首部的長度字段,便知道每一個數據包的實際長度了