對於剛接觸TCP網絡編程的人有時候碰到一些問題,好比當客服端發送一串消息到服務端,服務端只收到消息的一半,或者當連續發送兩個消息到服務端,服務端同時收到這兩個消息但沒法解析。這就是今天要講的TCP拆包粘包現象。算法
咱們能夠經過如下圖進行說明編程
1.圖一是正常的狀況下包的發送和接受,客戶端發送p1,p2包,服務端前後接受到p1,p2包,沒有發生粘包和拆包。緩存
2.圖二是發生了拆包的現象。客戶端發送p1,p2包,客戶端對p1拆包分紅p1_1和p1_2,服務端前後收到p1_1,p1_2和p2包。 拆包發生緣由分2種狀況:網絡
在TCP通信協議中TCP的每一個包的頭的長度都是固定的,總長度不能超過MTU(最大傳輸單元),且數據長度不能超過MSS(MSS=MTU-20bytes(IP包頭)-20bytes(TCP包頭))。若是超過了MTU系統會進行拆包處理。以圖二舉個例子:框架
3.圖三是發生了粘包的現象。客戶端發送p1,p2包,p1,p2包到達接收端的緩存,服務端應用讀取緩存時沒法區分p1,p2各自的大小。由於在TCP通信協議中TCP是面向流的,包和包之間沒有界限。粘包可發生在發送端也可發生在接收端以圖三各舉例子:netty
不管拆包仍是粘包本質問題都是沒法區分包界限,解決包界限的問題主要有如下幾種方式:code
在實際開發中不少網絡框架對TCP拆包粘包問題的解決作了不少支持,好比netty中LineBasedFrameDecoder解析器就是利用換號符號作分割。blog