粘包就是指接收方处理数据包时,多个数据包粘成了一包,出现粘包的原因可能是来自发送方,也可能是来自接收方。 对于发送方来说,因为TCP连接中是可以连续的发多个数据包给服务端的,这个时候如果客户端启动了Nagle算法,就是对小的数据包进行合并,然后再发送,那么这时服务端接收后就不知道哪些数据包是分开的。而对于接收方来说,接收方接收到消息后,会把消息放到缓冲区中,如果消息没有被及时从缓冲区中取走,下次在取数据时可能就会出现一次取出多个数据包的情况,造成粘包问题。 解决方法的话,可以关闭发送方的Nagle算法,还可以格式化数据,就是使每条数据都有固定的格式,这样接收方就能区分哪些数据包是分开的,还可以发送每个数据包的长度。

    扩展:UDP会不会产生粘包问题呢? TCP为了保证可靠性传输并减少额外的开销,采用了基于数据流的传输,基于流的传输不认为消息是一条一条的,是无保护消息边界的。 而UDP则是面向消息传输的(数据报),是有保护消息边界的,接收方一次只接受一条独立的消息,所以不存在粘包问题。