粘包

粘包

1、粘包的概念

多个数据包被连续存储于连续的缓存中,在数据包进行读取时由于无法确认发生方的发送边界,而采用某一估测值大小来进行数据读出,若双方的size不一致时就会使发送方的若干包数据在接收方接收时粘成一个包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾,如发送方第一次发送"hello",第二次"world",正常接收是第一次"hello",第二次"world",实际上读出来的是"helloworld"

2、出现粘包的原因

出现粘包的现象是多方面的,它即可由发送方造成,也可由接收方造成

  • 发送方引起的粘包是由TCP本身造成的,TCP为了提高传输效率,发送方往往要收集足够多的数据后才发送一包数据,若连续几次发送数据都很少,通常TCP会根据优化算法把这些数据合成一包后发送出去,这样接收方就收到了粘包数据
  • 接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。

3、粘包的处理方式

(1)当时短连接的情况下,不用考虑粘包的情况
(2)如果发送数据无结构,如文件传输,这样发送方只管发送,接收方只管接收存储就ok,也不用考虑粘包
(3)如果双方建立长连接,需要在连接后一段时间内发送不同结构数据

接收方创建预处理线程,对接收到的数据包进行预处理,将粘连的包分开;

分包是指在出现粘包的时候我们的接收方要进行分包处理。(在长连接中都会出现) 数据包的边界发生错位,导致读出错误的数据分包,进而曲解原始数据含义。

粘包情况有两种,一种是粘在一起的包都是完整的数据包,另一种情况是粘在一起的包有不完整的包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值