一种基于TCP协议数据分包黏包的处理方法与流程

文档序号:16887532发布日期:2019-02-15 22:46阅读:668来源:国知局
一种基于TCP协议数据分包黏包的处理方法与流程

本发明涉及数据传输技术领域,尤其涉及一种基于tcp协议数据分包黏包的处理方法。



背景技术:

tcp作为常用的网络传输协议,数据流解析是网络应用开发人员永远绕不开的一个问题,数据在传输过程中可能会产生分包、黏包、丢包,分包产生的原因,可能是因为数据过大分成了两次或者多次传输,也可能是传输过程中丢失部分包导致出现半包,也有可能是ip分片传输导致。另一方面,tcp需要尽可能高效和可靠,所以tcp默认采用nagle算法,合并相连的数据包,达到一定的数量再一次性发送,以达到提升网络传输效率的目的。而数据包的合并在tcp协议中是没有分界线的,所以这就会导致接收方不能还原其本来的数据包,这就是黏包。



技术实现要素:

鉴以此,本发明的目的在于提供一种基于tcp协议数据分包黏包的处理方法,以至少解决以上问题。

一种基于tcp协议数据分包黏包的处理方法,包括以下步骤:

s1、tcp通信服务端接收来自客户端的数据,计算每次接收的数据长度length_every;

s2、tcp通信服务端获取所接收数据类型的标准完整长度length;

s3、tcp通信服务端获取上一次接收的缓存数据,若获取到缓存数据,则计算实际已读取的数据长度length_real;若未获取到缓存数据,则length_real赋值为0;

s4、判断实际已读取的数据长度length_real与所接收数据类型的标准完整长度length是否相等,若是,则一次完整数据接收结束;若否,则将实际已读取的数据进行缓存,重新执行步骤s1。

进一步的,步骤s4中,若判断实际已读取的数据长度length_real是否与所接收数据类型的标准完整长度length不相等,还包括步骤:

s41、判断所接收数据类型的标准完整长度length是否大于实际已读取的数据长度length_real,若是,则表示所接收数据分包,缓存已读取数据,并返回执行步骤s1,若否,则表示数据黏包,执行下一步骤;

s42、判断实际已读取数据长度length_real是否为所接收数据类型的标准完整长度length的倍数,若是,则表示一次接受多条完整数据结束;若否,缓存已读取数据,并返回执行步骤s1。

进一步的,通过为各种不同类型不同长度的数据引入固定标识位,在tcp通信服务端接收数据时实现对不同类型数据的分包、黏包处理,具体包括:

s21、为不同类型的数据设置对应的固定标识位以识别其长度,在tcp通信服务端每次接收来自客户端的数据时,还对获取数据的标识位进行识别判断其是否与相应数据类型的固定标识位相同,若不相同则执行s22步骤;若相同则执行s23步骤;

s22、获取缓存的完整长度length,判断length是否为0,若为0则表示该数据不是源数据或者是丢包数据,将数据丢弃并执行s1步骤;若不为0,则表示该数据分包或黏包,执行步骤s3;

s23、计算获取到的每条数据的完整长度length,在每次获取不同长度的数据类型都重新计算完整长度length,执行步骤s3。

进一步的,步骤s3中,通过公式(1)计算实际已读取的数据长度length_real,公式(1)如下所示。

length_real=length_every+length_real(1)

进一步的,对实际已读取的数据进行缓存时,通过其ip、端口进行缓存,在获取上一次所接收的缓存数据时,通过ip、端口获取相应数据。

与现有技术相比,本发明的有益效果是:

本发明提供的一种基于tcp协议数据分包黏包的处理方法,在通过tcp协议进行数据传输时,可以有效解决传输过程中出现的数据分包、黏包问题,适用于不同类型的数据传输,没有过多繁琐的计算判断,不会对传输速度造成影响,适用范围广。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的优选实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明实施例一的处理方法流程示意图。

图2是本发明实施例二的处理方法流程示意图。

图3是本发明实施例三的处理方法流程示意图。

具体实施方式

以下结合附图对本发明的原理和特征进行描述,所列举实施例只用于解释本发明,并非用于限定本发明的范围。

实施例1

参照图1,本发明提供一种基于tcp协议数据分包的处理方法,包括以下步骤:

s1、tcp通信服务端接收来自客户端的数据,计算每次接收的数据长度length_every。

tcp通信服务端与客户端进行实时的数据传输交互,并在每次接收数据时,计算所接收数据的长度length_every。

s2、tcp通信服务端获取所接收数据类型的标准完整长度length。

tcp通信服务端与客户端进行数据交互时所传输的各种数据类型的标准完整长度length预先按照数据类型进行存储,tcp通信服务端在接收客户端上传的数据后,从数据库中获取所接收数据类型的标准完整长度length。

s3、tcp通信服务端获取上一次接收的缓存数据,若获取到缓存数据,则计算实际已读取的数据长度length_real;若未获取到缓存数据,则length_real赋值为0。

执行步骤s2后,tcp通信服务端获取上一次所接收的缓存数据,若获取到相应的缓存数据,则根据缓存数据长度计算实际已读取的数据长度length_real;若未获取到相应的缓存数据,说明实际已读取数据长度为0,则将length_real置为0,并根据公式(1)再次计算实际已读取的数据长度。

length_real=length_every+length_real(1)

s4、判断实际已读取的数据长度length_real与所接收数据类型的标准完整长度length是否相等,若是,则一次完整数据接收结束;若否,则将实际已读取的数据进行缓存,重新执行步骤s1。

步骤s4中,通过对比实际已读取的数据长度length_real是否与tcp通信服务端所接收的数据类型的标准完整长度是否相等,判断一次完整的数据接收是否结束,若相等,则说明一次完整的数据传输接收完毕,tcp通信服务端将所接收的缓存数据以及本次所接收数据组成完整的数据包,一同发送至业务逻辑处理单元以便对数据进行进一步处理;若不相等,则说明分包数据尚未全部接收,tcp通信服务端将已经读取的数据进行缓存,以便与下一次所接收的数据组成完整的数据包,并返回执行步骤s1。

在上述实施例的基础上,tcp通信服务端通过ip、端口对已接收的数据进行缓存,所述ip、端口为客户端与tcp通信服务端进行数据交互所使用的ip和端口,当tcp通信服务端同时与多个客户端进行数据交互时,通过ip、端口识别数据由哪个客户端上传,并通过ip、端口获取缓存数据。

本实施例的一种基于tcp协议数据分包黏包的处理方法,接收数据快,没有繁琐的计算判断,有效解决了在通过tcp协议进行数据传输时数据的分包问题。

实施例2

参照图2,本实施例提供一种基于tcp协议数据分包黏包处理方法,与实施例1的区别在于,还解决了在通过tcp协议进行数据传输时数据的黏包问题,具体包括以下步骤:

s1、tcp通信服务端接收来自客户端的数据,计算每次接收的数据长度length_every。

s2、tcp通信服务端获取所接收数据类型的标准完整长度length。

s3、tcp通信服务端获取上一次接收的缓存数据,若获取到缓存数据,则计算实际已读取的数据长度length_real;若未获取到缓存数据,则length_real赋值为0。

s4、判断实际已读取的数据长度length_real与所接收数据类型的标准完整长度length是否相等。

s41、判断所接收数据类型的标准完整长度length是否大于实际已读取的数据长度length_real,若是,则表示所接收数据分包,缓存已读取数据,并返回执行步骤s1,若否,则表示数据黏包,执行步骤s42。

步骤s41中,通过判断所接收数据类型的标准完整长度length是否大于实际已读取的数据长度length_real检测在传输过程中数据分包或黏包。若length大于length_real,说明tcp通信服务端所接收数据分包,缓存已读取数据,并返回执行步骤s1;若length小于length_real,则说明tcp通信服务端所接收数据黏包,继续执行步骤s42。

s42、判断实际已读取数据长度length_real是否为所接收数据类型的标准完整长度length的倍数,若是,则表示一次接受多条完整数据结束;若否,缓存已读取数据,并返回执行步骤s1。

步骤s42中,通过判断实际已读取数据长度length_real是否为所接收数据类型的标准完整长度length的倍数,检测tcp通信服务端是否完整接收了客户端上传的多条数据,例如,若length_real的长度为length的2倍,则说明tcp通信服务端一次接收了2个完整的数据包,可将已接收数据一同发送至业务逻辑处理单元以便对数据进行进一步处理;若length_real不为length的倍数,则tcp通信服务端将已读取数据进行缓存,以便与下一次所接收数据进行组合,并返回执行步骤s1。

实施例3

参照图3,本实施例提供的一种基于tcp协议数据分包黏包的处理方法,与实施例1、2的区别在于,能够对所接收的多种不同长度的数据类型的分包、黏包进行处理,具体包括以下步骤:

s1、tcp通信服务端接收来自客户端的数据,计算每次接收的数据长度length_every。

s21、为不同类型的数据设置对应的固定标识位以识别其长度,在tcp通信服务端每次接收来自客户端的数据时,还对获取数据的标识位进行识别判断其是否与相应数据类型的固定标识位相同,若不相同则执行s22步骤;若相同则执行s23步骤。

s22、获取缓存的完整长度length,判断length是否为0,若为0则表示该数据不是源数据或者是丢包数据,将数据丢弃并执行s1步骤;若不为0,则表示该数据分包或黏包,执行步骤s3。

s23、计算获取到的每条数据的完整长度length,在每次获取不同长度的数据类型都重新计算其完整长度length,执行步骤s3。

s3、tcp通信服务端获取上一次接收的缓存数据,若获取到缓存数据,则计算实际已读取的数据长度length_real;若未获取到缓存数据,则length_real赋值为0。

s4、判断实际已读取的数据长度length_real与所接收数据类型的标准完整长度length是否相等。

s41、判断所接收数据类型的标准完整长度length是否大于实际已读取的数据长度length_real,若是,则表示所接收数据分包,缓存已读取数据,并返回执行步骤s1,若否,则表示数据黏包,执行步骤s42。

s42、判断实际已读取数据长度length_real是否为所接收数据类型的标准完整长度length的倍数,若是,则表示一次接受多条完整数据结束;若否,缓存已读取数据,并返回执行步骤s1。

以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1