1:数据黏包
- TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。
2:出现黏包问题的原因:
-
发送方:引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。
-
发送的数据没有直接写个对端,存入内核缓冲。内核默认优化。攒够一定量数据,批量发送。
-
发送端发送数据较快,接收端处理数据慢效率低
-
接收方:引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。
3: 数据黏包的情况
-
一种是粘在一起的包都是完整的数据包
-
粘在一起的包有不完整的包
4: 黏包问题分类
-
传输的数据为不带结构的连续流数据(如文件传输),则不必把粘连的包分开。
-
实际工程应用中,传输的数据一般为带结构的数据,这时就需要做分包处理
5: 避免黏包问题的手段
-
发送方:引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满
缺点:第一种编程设置方法虽然可以避免发送方引起的粘包,
但它关闭了优化算法,降低了网络发送效率,影响应用程序的性能 -
接收方:引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象
缺点:只能减少出现粘包的可能性,但并不能完全避免粘包,当发送频率较高时,
或由于网络突发可能使某个时间段数据包到达接收方较快,接收方还是有可能来不及接收,从而导致粘包 -
接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包
避免了粘包,但应用程序的效率较低,对实时应用的场合不适合 -
强制内核发送缓冲区数据。fflush。 给数据添加 “包头”。
接收方创建一预处理线程,对接收到的数据包进行预处理,将粘连的包分开(数据包头+数据内容 +)
按照一个数据传输结构进行发送。