一、問題解析
TCP粘包和拆包問題是指在進行TCP通信時,因為TCP是面向流的,所以發送方在傳輸數據時可能會將多個小的數據包粘合在一起發送,而接收方則可能將這些數據包拆分成多個小的數據包進行接收,從而導致數據接收出現錯誤或者數據粘連的問題。
TCP粘包和拆包問題主要出現在以下兩種情況下:
1發送方連續發送多個小數據包:由于TCP是基于流的協議,發送方在傳輸數據時可能會將多個小數據包組合成一個大數據包進行發送,從而導致接收方在接收數據時無法區分不同數據包之間的界限。
2接收方緩存區大小限制:接收方在接收數據時,如果接收緩存區的大小有限,可能會將一個大的數據包拆分成多個小數據包進行接收,從而導致粘包和拆包問題的出現。
解決方案
對于粘包和拆包問題,一般都是對包的格式進行約束,常見的解決方案有四種:
●將業務層協議包的長度固定下來,每個包都固定長度,比如512個字節大小,如果客戶端發送的數據長度不足512個字節,則通過補充空格的方式補全到指定長度;
●在每個包的末尾使用固定的分隔符,如換行符/n,如果一個包被拆分了,則等待下一個包發送過來之后找到其中的\n,然后對其拆分后的頭部部分與前一個包的剩余部分進行合并即可;
●仿照TCP/IP協議棧,將消息分為header和body,在head中保存有當前整個消息的長度,只有在讀取到足夠長度的消息之后才算是讀到了一個完整的消息;
●通過自定義協議進行粘包和拆包的處理。
二、粉絲福利
我是浮生,一個工作十四年經驗的Java程序員!
最近很多同學問我有沒有java學習資料,我根據我從小白到架構師多年的學習經驗整理出來了一份80W字面試解析文檔、簡歷模板、學習路線圖、java必看學習書籍?、 需要的小伙伴 可以關注我
公眾號:“?灰灰聊架構?”, 回復暗號:“?321?”即可獲取
?