什么是粘包
粘包指的是数据与数据之间没有明确的分界线,导致不能正确读取
应用程序无法直接操作硬件,应用程序想要发送数据则必须将数据交给操作系统,而操作系统需要同时为所有应用程序提供数据传输服务,也就意味着,操作系统不可能立马就能将应用程序的数据发送出去,就需要为应用程序提供一个缓冲区,用于临时存放数据,具体流程如下
发送方
当应用程序调用send函数时,应用程序会将数据从应用程序拷贝到操作系统缓存,再由操作系统从缓冲区读取数据并发送出去。
接收方
对方计算机收到数据也是操作系统先收到,至于应用程序何时处理这些数据,操作系统并不清楚,所以同样需要将数据先存储到操作系统的缓冲区中,当应用程序调用recv时,实际上是从操作系统缓冲区中将数据拷贝到应用程序的过程。
上述过程对于TCP与UDP都是相同的不同之处在于;
UDP在收发数据时是基于数据包的,即一个包一个包的发送,包与包之间有着明确的分界,到达对方操作系统缓冲区后也是一个一个独立的数据包,接收方从操作系统缓冲区将数据拷贝到应用程序
如何解决粘包问题
解决粘包的核心思路就是 先通知接收方 要发送数据的长度
再发送真实数据
问题在于 数据长度也是不确定的
对方也不清楚 长度信息到底是几个字节
解决方案是 把长度信息转换为一个固定的字节的二进制数据(要用到struct模块)