CN109347825A - 一种基于tcp协议数据分包黏包的处理方法 - Google Patents
一种基于tcp协议数据分包黏包的处理方法 Download PDFInfo
- Publication number
- CN109347825A CN109347825A CN201811221767.1A CN201811221767A CN109347825A CN 109347825 A CN109347825 A CN 109347825A CN 201811221767 A CN201811221767 A CN 201811221767A CN 109347825 A CN109347825 A CN 109347825A
- Authority
- CN
- China
- Prior art keywords
- data
- length
- packet
- read
- real
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L69/00—Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
- H04L69/16—Implementation or adaptation of Internet protocol [IP], of transmission control protocol [TCP] or of user datagram protocol [UDP]
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/50—Network services
- H04L67/56—Provisioning of proxy services
- H04L67/568—Storing data temporarily at an intermediate stage, e.g. caching
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Computer Security & Cryptography (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
- Communication Control (AREA)
Abstract
本发明公开了一种基于TCP协议数据分包黏包的处理方法,包括:在接收数据时计算每次读取的数据长度Length_every;获取所接收数据类型的完整长度Length;获取上一次接收的缓存数据,计算实际已读取的数据长度Length_real;判断实际已读取的数据长度Length_real是否与所接收数据类型的标准完整长度Length是否相等,本方法在通过TCP协议进行数据传输时,可以有效解决传输过程中出现的数据分包、黏包问题,适用于不同类型的数据传输,没有过多繁琐的计算判断,不会对传输速度造成影响,适用范围广。
Description
技术领域
本发明涉及数据传输技术领域,尤其涉及一种基于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。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (5)
1.一种基于TCP协议数据分包黏包的处理方法,其特征在于,包括以下步骤:
S1、TCP通信服务端接收来自客户端的数据,计算每次接收的数据长度Length_every;
S2、TCP通信服务端获取所接收数据类型的标准完整长度Length;
S3、TCP通信服务端获取上一次接收的缓存数据,若获取到缓存数据,则计算实际已读取的数据长度Length_real;若未获取到缓存数据,则Length_real赋值为0;
S4、判断实际已读取的数据长度Length_real与所接收数据类型的标准完整长度Length是否相等,若是,则一次完整数据接收结束;若否,则将实际已读取的数据进行缓存,重新执行步骤S1。
2.根据权利要求1所述的一种基于TCP协议数据分包黏包的处理方法,其特征在于,步骤S4中,若判断实际已读取的数据长度Length_real是否与所接收数据类型的标准完整长度Length不相等,还包括步骤:
S41、判断所接收数据类型的标准完整长度Length是否大于实际已读取的数据长度Length_real,若是,则表示所接收数据分包,缓存已读取数据,并返回执行步骤S1,若否,则表示数据黏包,执行下一步骤;
S42、判断实际已读取数据长度Length_real是否为所接收数据类型的标准完整长度Length的倍数,若是,则表示一次接受多条完整数据结束;若否,缓存已读取数据,并返回执行步骤S1。
3.根据权利要求1所述的一种基于TCP协议数据分包黏包的处理方法,其特征在于,通过为各种不同类型不同长度的数据引入固定标识位,在TCP通信服务端接收数据时实现对不同类型数据的分包、黏包处理,具体包括:
S21、为不同类型的数据设置对应的固定标识位以识别其长度,在TCP通信服务端每次接收来自客户端的数据时,还对获取数据的标识位进行识别判断其是否与相应数据类型的固定标识位相同,若不相同则执行S22步骤;若相同则执行S23步骤;
S22、获取缓存的完整长度Length,判断Length是否为0,若为0则表示该数据不是源数据或者是丢包数据,将数据丢弃并执行S1步骤;若不为0,则表示该数据分包或黏包,执行步骤S3;
S23、计算获取到每条数据的完整长度Length,在每次获取不同长度的类型数据都重新计算完整长度Length,执行步骤S3。
4.根据权利要求1所述的一种基于TCP协议数据分包黏包的处理方法,其特征在于,步骤S3中,通过公式(1)计算实际已读取的数据长度Length_real,公式(1)如下所示。
Length_real=Length_every+Length_real公式(1)
5.根据权利要求1所述的一种基于TCP协议数据分包黏包的处理方法,其特征在于,对实际已读取的数据进行缓存时,通过其IP、端口进行缓存,在获取上一次所接收的缓存数据时,通过IP、端口获取相应数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811221767.1A CN109347825B (zh) | 2018-10-19 | 2018-10-19 | 一种基于tcp协议数据分包黏包的处理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811221767.1A CN109347825B (zh) | 2018-10-19 | 2018-10-19 | 一种基于tcp协议数据分包黏包的处理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109347825A true CN109347825A (zh) | 2019-02-15 |
CN109347825B CN109347825B (zh) | 2020-01-14 |
Family
ID=65310464
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811221767.1A Active CN109347825B (zh) | 2018-10-19 | 2018-10-19 | 一种基于tcp协议数据分包黏包的处理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109347825B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110311808A (zh) * | 2019-06-06 | 2019-10-08 | 厦门亿联网络技术股份有限公司 | 一种通用型协议网络的稳定性验证方法及系统 |
CN111447110A (zh) * | 2020-03-24 | 2020-07-24 | 北京润科通用技术有限公司 | 一种数据监控方法及系统 |
CN112702322A (zh) * | 2020-12-17 | 2021-04-23 | 中国电子科技集团公司第四十一研究所 | 一种用于产线智能管理的通信数据包异常处理方法 |
CN113364790A (zh) * | 2021-06-12 | 2021-09-07 | 四川虹美智能科技有限公司 | 数据传输方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102984253A (zh) * | 2012-11-27 | 2013-03-20 | 山东中创软件工程股份有限公司 | 一种传输控制协议粘包处理方法及装置 |
CN105991223A (zh) * | 2015-02-13 | 2016-10-05 | Tcl集团股份有限公司 | 一种tcp网络传输数据中防粘包的方法及系统 |
CN107135167A (zh) * | 2017-04-19 | 2017-09-05 | 畅捷通信息技术股份有限公司 | 数据传输方法、数据传输装置和服务器 |
-
2018
- 2018-10-19 CN CN201811221767.1A patent/CN109347825B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102984253A (zh) * | 2012-11-27 | 2013-03-20 | 山东中创软件工程股份有限公司 | 一种传输控制协议粘包处理方法及装置 |
CN105991223A (zh) * | 2015-02-13 | 2016-10-05 | Tcl集团股份有限公司 | 一种tcp网络传输数据中防粘包的方法及系统 |
CN107135167A (zh) * | 2017-04-19 | 2017-09-05 | 畅捷通信息技术股份有限公司 | 数据传输方法、数据传输装置和服务器 |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110311808A (zh) * | 2019-06-06 | 2019-10-08 | 厦门亿联网络技术股份有限公司 | 一种通用型协议网络的稳定性验证方法及系统 |
CN111447110A (zh) * | 2020-03-24 | 2020-07-24 | 北京润科通用技术有限公司 | 一种数据监控方法及系统 |
CN111447110B (zh) * | 2020-03-24 | 2023-03-10 | 北京润科通用技术有限公司 | 一种数据监控方法及系统 |
CN112702322A (zh) * | 2020-12-17 | 2021-04-23 | 中国电子科技集团公司第四十一研究所 | 一种用于产线智能管理的通信数据包异常处理方法 |
CN113364790A (zh) * | 2021-06-12 | 2021-09-07 | 四川虹美智能科技有限公司 | 数据传输方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN109347825B (zh) | 2020-01-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109347825A (zh) | 一种基于tcp协议数据分包黏包的处理方法 | |
TWI486042B (zh) | 對資料中心環境最佳化之通信傳輸 | |
US20120102136A1 (en) | Data caching system | |
KR100716184B1 (ko) | 네트워크 프로세서에서의 큐 관리 방법 및 그 장치 | |
CN108881056A (zh) | 一种拥塞控制方法、网络设备及其网络接口控制器 | |
CN105100142B (zh) | 软件定义网络协议报文的传输控制方法及装置 | |
CN106209775B (zh) | 一种ssl加密网络流的应用类型识别方法与装置 | |
CN105556916B (zh) | 网络流的信息统计方法和装置 | |
WO2017206763A1 (zh) | 一种终端设备及数据处理方法、存储介质 | |
CN108429701A (zh) | 网络加速系统 | |
CN105099938B (zh) | 网络中拥塞窗口的确定方法和装置 | |
CN103685058B (zh) | 控制流数据的服务质量的方法和OpenFlow控制器 | |
CN108667733A (zh) | 一种网络设备及报文处理方法 | |
US8111700B2 (en) | Computer-readable recording medium storing packet identification program, packet identification method, and packet identification device | |
CN106302016A (zh) | 小流量快速获取网络物理带宽的方法及系统 | |
CN106656966A (zh) | 一种拦截业务处理请求的方法和装置 | |
CN105357071A (zh) | 一种网络复杂流量识别方法及识别系统 | |
CN103746768B (zh) | 一种数据包的识别方法及设备 | |
CN101803303A (zh) | 用于管理分段数据分组传输的方法和系统 | |
CN107896141A (zh) | 一种fc‑ae‑asm网络数据冗余方法 | |
CN106330386B (zh) | 一种传输层参数调整方法和装置 | |
US20120002683A1 (en) | Method and apparatus for compressing frame | |
CN105915930A (zh) | 一种视频文件发送方法及装置 | |
US7512780B1 (en) | Packet-parallel high performance cryptography systems and methods | |
CN105763484B (zh) | 基于流组合压缩的信令流汇聚装置及其方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |