TCP 粘包,主要是因为发送端发送的两个包,TCP按照流进行发送,缓冲器满了才发送。
-
假如两个包都比较小的话,就会把两个包合并到一起进行发送,造成接收端接到的流无法知道这是一个包还是两个包
-
假如发送两个包,第一个包很大,TCP 的缓存池放不下,就会把第一个包拆包,然后和第二个包一起发送,接收端收到的流无法知道包怎么拼装了
-
TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样,接收端,就难于分辨出来了,必须提供科学的拆包机制。 即面向流的通信是无消息保护边界的。
-
UDP(user datagram protocol,用户数据报协议)是无连接的,面向消息的,提供高效率服务。不会使用块的合并优化算法,, 由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样,对于接收端来说,就容易进行区分处理了。 即面向消息的通信是有消息保护边界的。
参考:
粘包问题: https://www.cnblogs.com/nickchen121/p/11031027.html
面试官问:你来讲下Netty通信中的粘包、拆包?:https://mp.weixin.qq.com/s/A7CkBAN3fX6z2x60ZATgHA