TCP粘包是指发送方发送的若干包数据到接收方,接收方应用程序看到一连串的字节数据,不知道从哪个部分到哪个部分是一个完整的应用层数据包。 发生粘包的原因: 发送方:TCP为了提高效率,如果发送的数据包太小,就会启动Nagle算法,对小的数据包进行合并,然后发送。这样的话,接收方接收到消息的时候就无法区分那些数据包,便产生了粘包现象。 接收方:接收方收到数据后,先放到接收缓冲区,如果不及时将接收缓冲区的数据拿走,下一次读取数据的时候可能会同时读到多个数据包,造成粘包现象。 如何避免粘包问题? 1.传输定长数据,这个方法不太可靠。 传输定长数据可以稍微解决tcp粘包问题,但是不能应对复杂情况,例如,一个通信连接当中,有多个定长的数据结构或者没有定长的数据结构 2.定长包头+数据+分隔符,可以完美的解决数据粘包问题 确定一个定长的数据包头, 由于分隔符后面就是包头,所以当我们判断什么时候是包头的时候,只需判断,接收的数据里面有没有分隔符。 定长包头当中可以获取当前数据的长度,而分隔符可以找到下一条数据的起始位置(下一条数据的包头) 分隔符不一定是一个字节的字符,可以是一个字符串,通常下使用\r\n进行分隔。 分隔符就是起到了一个定义数据边界的作用。