TCP粘包
在默认情况下,TCP连接会启用延时传送算法,在数据发送之前缓存他们,如果短时间内有多个数据发送,会缓冲到一起一次发送,这样可以减少IO消耗提高性能。如果是发送文件的话,不用处理粘包问题;如果发送的是数据的话,就需要处理粘包问题。
粘包有以下几种情况:如果连续调用两次sand分别发送两端数据data1、data2,那么:
- 先接收到data1,再接收到data2
- 先接收到data1的部分数据,然后接收到data1的剩余部分和data2
- 先接收到data1和data2的部分数据、然后接收到data2的剩余部分
- 一次性接收到了data1和data2
如何解决粘包问题
- 多次发送之前间隔一个等待时间:只需要等上一段间隔时间结束再进行下一次send,适用于交互频率较低的场景;如果交互频率频繁,传输效率较低。
- 不使用延迟传送算法(Nagle):适用于每次发送的数据比较大,但文件不是很大的情况,
- 进行封包/拆包:给每个数据包的之前或之后放一些有特征的数据,就收到数据后按特征进行分割。
为什么UDP不会粘包
- TCP是面向流的协议,UDP是面向消息的协议。UDP段是一条消息,必须以消息为单位接收数据,不能以字节为单位接收数据。
- 每个UDP包中都有消息头,这样对于接收端来说就很容易区别UDP包了。