一、粘包
TCP是基于字节流传输的,只维护发送出去多少,确认了多少,没有维护消息与消息之间的边界,因而可能导致粘包和拆包问题。
粘包问题分为两种:
-
发送方产生粘包
采用 TCP 协议传输数据的客户端与服务器经常是保持一个长连接的状态,双方在连接不断开的情况下,可以一直传输数据。(一次连接发一次数据不存在粘包)
但当发送的数据包过于小,那么 TCP 协议默认的会将这些较小的数据包进行合并发送(缓冲区数据发送堆压);(如果过大,取的时候纷乱了,就是拆包。)
这个合并过程就是在发送缓冲区中进行的,也就是说数据发送出来它已经是粘包的状态了。 -
接收方产生粘包
接收方采用 TCP 协议接收数据时的过程是这样的:数据到运输层,TCP 协议处理是将其放置接收缓冲区,然后由应用层来主动获取);这时会出现一个问题,应用层程序不能及时的把缓冲区中的数据拿出来,而下一个数据又到来并有一部分放入的缓冲区末尾,等我们读取数据时就是一个粘包。(放数据的速度 > 应用层拿数据速度)(同理拆包也会发生)
tips:
TCP的短连接一般只会在 client/serv