首先我們先來張圖看下正常包數(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ā)一收