首先我们先来张图看下正常包数据的传输,MSG1与MSG2是无关的两包数据
两包数据
1. 什么是粘包
不同于UDP的广播式通讯,TCP是基于流式的发送,存在丢包重发机制,并没有明确的边界定义。发送端在发送数据时,其会开辟一个缓冲区,并往其中写入数据,每过一段时间就发送出去。接收端在接收这些数据时会限定一个接收长度,发送端在发送时,并非每次发送都被接收端间隔接收。会存在这样一种情况,在发送频率很高的情况下,发送端可能会把两包或者更多包数据连在一起发送出去,若是接收端的接收长度足够大,那本次读取的便是“粘”在一起的多包数据,这时接收端便需要特定的处理来解析这段数据。如下图所示:
两包数据被合在一起发送
2. 什么是拆包
拆包则是一包消息的一部分被粘在另一个包的前面或者后面发送出去,这个时候接收端就很难处理,如图所示:
拆包
3. 处理方式
i. 两端约定报文头部和尾部内容,从而识别是一包完整数据
ii. 固定报文长度,不足用空补齐,接收端读取固定长度
iii. 类似于第一种方式,在尾部增加换行符
iv. 在报文头部声明消息体长度
v. 一发一收