外观
什么是 TCP 的沾包和拆包
TCP
粘包:TCP
是面向字节流的协议,没有 “包” 的明确界限。当发送方连续发送多个小数据包时,由于这些数据包较小且发送间隔时间短,TCP
可能会为了提高传输效率,将多个逻辑上独立的数据包组合成一个大数据包进行发送,导致接收方在接收时无法直接区分不同数据包之间的界限,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾,就好像多个包粘在了一起,这就是粘包现象。比如,发送方先后发送了 “Hello
” 和 “World
” 两个数据包,接收方可能会收到一个 “HelloWorld
” 的数据包,无法直接判断这是两个不同的消息。TCP
拆包:当发送方一次请求发送的数据量比较大,超过了TCP
缓冲区的大小,或者网络层的MTU
(最大传输单元)限制时,TCP
会将这个大的数据包拆分成多个小的数据包进行发送,这就导致接收方需要接收多个小包才能组成完整的原始数据,如果接收方没有正确处理这些小包的组装,就会出现数据不完整或错误的情况,这就是拆包现象。例如,发送方要发送一个长度为2048
字节的数据包,但TCP
缓冲区大小为1024
字节,那么这个数据包就可能会被拆分成两个1024
字节的小包进行发送,接收方需要正确接收并组装这两个小包才能得到完整的原始数据。