1、udp 会发生粘包吗?
由于tcp 是面向连接的,客户端连接服务端必须二者都有自己的套接字,而udp不是面向连接的,接收端缓冲区利用链式结构来记录每一次到达的udp包,所以不会发生粘包问题。
2、tcp 在哪些情况下会发生 粘包问题?Tcp在什么情况下会发生粘包拆包问题?
客户端套接字缓冲区过小
TCP包大于MSS
接收方收到发送方多包粘在一起的数据
接收 应用层一次读取多包数据
发送端数据包过小 一次发送多个分组(Nagle算法)。
接收端 应用层未及时处理缓冲区的数据,导致多个包粘粘在一起。
补充:tcp 作为传输层协议,是面向流的,当发送的数据包比较小未达到发送缓冲区大小,可能会与其他数据包合并在一起发送,这就产生了粘包问题。如果一次发送的数据包比较大,超过了缓冲区大小则TCP就会拆包分多个包发送。
3、如何解决tcp粘包问题?
通过上面的叙述,我们可以认识到接收到的报文不一定就是整个数据包消息。如何区分是不是一整包消息:在包头说明长度。
另外在接收端可以禁用nagle算法。(TCP_NODELAY)
加上包边界