寫socket通訊時的粘包拆包處理

首先我們先來張圖看下正常包數(shù)據(jù)的傳輸,MSG1與MSG2是無關(guān)的兩包數(shù)據(jù)

兩包數(shù)據(jù)

1. 什么是粘包

不同于UDP的廣播式通訊,TCP是基于流式的發(fā)送,存在丟包重發(fā)機制,并沒有明確的邊界定義。發(fā)送端在發(fā)送數(shù)據(jù)時,其會開辟一個緩沖區(qū),并往其中寫入數(shù)據(jù),每過一段時間就發(fā)送出去。接收端在接收這些數(shù)據(jù)時會限定一個接收長度,發(fā)送端在發(fā)送時,并非每次發(fā)送都被接收端間隔接收。會存在這樣一種情況,在發(fā)送頻率很高的情況下,發(fā)送端可能會把兩包或者更多包數(shù)據(jù)連在一起發(fā)送出去,若是接收端的接收長度足夠大,那本次讀取的便是“粘”在一起的多包數(shù)據(jù),這時接收端便需要特定的處理來解析這段數(shù)據(jù)。如下圖所示:


兩包數(shù)據(jù)被合在一起發(fā)送

2. 什么是拆包

拆包則是一包消息的一部分被粘在另一個包的前面或者后面發(fā)送出去,這個時候接收端就很難處理,如圖所示:


拆包

3. 處理方式

i.   兩端約定報文頭部和尾部內(nèi)容,從而識別是一包完整數(shù)據(jù)
ii.  固定報文長度,不足用空補齊,接收端讀取固定長度
iii. 類似于第一種方式,在尾部增加換行符
iv.  在報文頭部聲明消息體長度
v.  一發(fā)一收
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容