只有TCP有占包问题,UDP不会出现
111、应用程序看到的数据是一个整体(流),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议,容易出现粘包的问题。TCP协议层会把构成整条消息的数据段排序完成后呈现在内核缓冲区
222、UDP是面向消息的协议,每个UDP段都是一条消息,应用程序必须是以消息为单位提取数据,不能因此提取任意字节的数据,这一点和TCP很不同。
所谓的粘包问题主要是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据造成的
111、UDP 的recvfrom 是阻塞的,一个recvfrom(x)必须是对唯一一个sendinto(y),收完了x个字节的数据就算完成,若y>x,数据就会丢失,UDP根本不会出现粘包,但是会丢失数据,不可靠
222、TCP的协议数据不会丢失,没有收完包,下次再接收,会继续上次继续接收,己端总是在收到ack时才会清除缓冲区的内容,数据是可靠的,但是回粘包
TCP发送数据的四种情况
- D1和D2间隔时间长,且两者数据量小,不会发生粘包问题
- D1和D2间隔时间非常短,数据量小,会发生粘包问题,tcp协议本身规定的
- D2比较大,D1比较小,间隔时间也短,服务端一次性读取D1和D2的一部分,出现了粘包问题
- D1大,D2比较小,获取了D1的一部分,然后获取了D1的剩余部分和D2,出现了粘包问题
粘包的两种情况
1、发送端需要等缓冲区满了才出去,造成粘包(发送数据时间间隔非常短,数据量小,会合在一起,产生粘包
2、接收方不及时接收缓冲区的包,造成了多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)
解决方法
- 1、两者间隔时间变长
- 2、发送之前告诉客户端数据的大小
发送前告诉大小,这个大小也会占位置
大小的位置必须得固定
4:4,4:4,4:4,100:4,200:4