一种tcp网络传输数据中防粘包的方法及系统的利记博彩app

文档序号:10626530阅读:436来源:国知局
一种tcp网络传输数据中防粘包的方法及系统的利记博彩app
【专利摘要】本发明所提供的一种TCP网络传输数据防粘包的方法及系统,通过采用循环队列缓存网络数据,并提供操作接口,对数据进行处理。由于数据是循环存储的,当循环队列存储到结尾处以后,接下来接收的数据,会循环存储在循环队列开始处,而读取过的循环队列中数据会被清除,因此,接收到的数据会循环存储到队列中,且使用该方法及系统,调用者不必维护很多的参数,在不降低传输效率的同时,减少了TCP网络传输数据时,发生数据包之间的粘包,导致数据传输错误的可能。
【专利说明】
一种TCP网络传输数据中防粘包的方法及系统
技术领域
[0001]本发明涉及信息通信领域,尤其涉及的是一种TCP传输数据时防粘包的方法及系统。
【背景技术】
[0002]TCP是面向连接的传输层协议,其目标是提供可靠的端到端连接,保证信息有序无误的传输,它除了提供基本的数据传输功能外,还采用了数据编号、校验和计算、数据确认等一系列措施来保证可靠性。
[0003]TCP粘包是指发送方发送的若干数据包在接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。造成粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。粘包情况有两种,一种是粘在一起的包都是完整的数据包,另一种情况是粘在一起的包有不完整的包。
[0004]不是所有的粘包现象都需要处理,若传输的数据是不带结构的连续流数据(如文件传输),则不必把粘连的包分开。但在实际应用中,传输的数据一般是带结构的数据,这时就需要做分包处理。
[0005]但在实际应用中,传输的数据一般是带结构的数据,这时就需要做分包处理。
[0006]通常情况下,为了避免数据粘包,现有技术中采用一些方法避免:一是通过设置socket参数,强制立即发送数据,而不是等到缓冲区满后才发送;二是对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免粘包现象;三是由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。以上提到的三种措施,都有其不足之处。第一种编程设置方法虽然可以避免发送方引起的粘包,但却取消了优化算法,降低了网络发送效率,影响应用程序的性能。第二种方法只能减少粘包的可能性,但并不能完全避免粘包,当发送频率较高时,或由于网络突发可能使某个时间段数据包到达接收方较快,接收方还是有可能来不及接收,从而导致粘包。第三种方法虽然避免了粘包,但应用程序的效率较低,对实时应用的场合不适合。
[0007]现有使用的一种比较周全的解决方法是:接收方创建一个预处理线程,对接收到的数据包进行预处理,将粘连的包分开。具体的:将接收的网络数据存储在数组中,从数组的开始位置,读取长度字段L,如果数组中的有效数据大于等于L,则根据L,从数组中提取出一个数据包P,然后,将数组的剩余数据,重新移动到数组的开始位置,再继续接收数据或者分析剩余数据是否满足提取一个数据包的条件。此方法的缺点是,当处理完数据后,必须将数据重新移动到数组的开始位置,否则在继续接收数据时,可能因数组剩余空间不足而无法完全接收网络数据,另外,数组的有效数据长度,需要额外的参数维护。
[0008]因此,现有技术存在缺陷,有待于改进和发展。

【发明内容】

[0009]本发明的目的在于针对上述现有技术中的TCP网络传输数据时由于TCP网络传输本身或者接收方不能及时接收数据的原因,导致传输的数据包之间发生粘包的缺陷,提供一种TCP传输数据时防粘包的方法及系统。
[0010]本发明的技术方案如下:
一种TCP传输数据时防粘包的方法,其中,应用于数据接收方,所述方法包括:
A、预先在传输数据的缓冲区域中建立循环队列;
B、接收来自发送方的数据,并将接收的数据依次排列存储到循环队列中,并从存储数据的开始位置判断循环队列中存储的数据是否含有完整的数据包,若含有则执行步骤C,否则重复本步骤;
C、提取该完整的数据包,并清除所述循环队列中已提取的该完整的数据包所对应的数据;同时对所述循环队列中接收到的数据是否排列到循环队列的结尾处进行判断,若排列到结尾处,则执行步骤D,否则返回步骤B ;
D、将后续接收到的数据从循环队列的开始位置进行下一循环的存储。
[0011]所述TCP传输数据时防粘包的方法,其中,在上述步骤A还包括步骤Al:
Al、在循环队列中设置用于对其中存储数据的开始位置和结束位置进行定位的开始定位标识和结束定位标识。
[0012]所述TCP传输数据时防粘包的方法,其中,所述步骤C中还包括:
清除所述循环队列中完整数据包所对应的数据之后,所述开始定位标识自动移动到下一完整数据包所对应存储位置的开始端;
所述步骤B中还包括:
将接收的数据依次排列存储到循环队列中以后,所述结束定位标识自动移动到数据存储的结束位置。
[0013]所述TCP传输数据时防粘包的方法,其中,在上述步骤C中还包括:判断循环队列中存储的数据是否含有完整的数据包的方法为:判断预定数据长度是否小于等于循环队列中存储的有效数据长度,若小于等于则判定为含有完整的数据包,否则判定为不含有;
所述有效数据长度为:当开始定位标识在结束定位标识之前时,位于所述开始定位标识和结束定位标识之间的队列长度,当开始定位标识在结束定位标识之后时,则位于所述开始定位标识之后和位于结束定位标识之前的队列长度。
[0014]所述TCP传输数据时防粘包的方法,其中,所述步骤A之前还包括步骤:
预先在用于传输数据的缓冲区域中设置用于建立循环队列的内存空间。
[0015]一种TCP传输数据时防粘包的系统,其中,应用于数据接收方,所述系统包括: 循环队列建立模块,用于预先在传输数据的缓冲区域中建立循环队列;数据存储判断模块,用于接收来自发送方的数据,并将接收的数据依次排列存储到循环队列中,并从存储数据的开始位置判断循环队列中存储的数据是否含有完整的数据包;数据提取及清除模块,用于提取该完整的数据包,并清除所述循环队列中已提取的该完整的数据包所对应的数据;同时对所述循环队列中接收到的数据是否排列到循环队列的结尾处进行判断;
循环存储模块,用于当所述循环队列中接收到的数据排列到循环队列的结尾处,则将后续接收到的数据从循环队列的开始位置进行下一循环的存储。
[0016]所述TCP传输数据时防粘包的系统,其中,所述循环队列建立模块包括标识定位单元;
所述标识定位单元,用于在循环队列中设置用于对其中存储数据的开始位置和结束位置进行定位的开始定位标识和结束定位标识。
[0017]所述TCP传输数据时防粘包的系统,其中,所述数据存储判断模块包括结束定位标识移动单元;所述数据提取及清除模块包括开始定位标识移动单元;
所述开始定位标识移动单元,用于当清除所述循环队列中完整数据包所对应的数据之后,将所述开始定位标识自动移动到下一完整数据包所对应存储位置的开始端;
所述结束定位标识移动单元,用于将接收的数据依次排列存储到循环队列中以后,所述结束定位标识自动移动到数据存储的结束位置。
[0018]所述TCP传输数据时防粘包的系统,其中,所述系统还包括:内存设置模块;
所述内存设置模块,用于预先在用于传输数据的缓冲区域中设置用于建立循环队列的内存空间。
[0019]有益效果:本发明所提供的一种TCP网络传输数据防粘包的方法及系统,通过采用循环队列缓存网络数据,并提供操作接口,对数据进行处理。由于数据是循环存储的,当循环队列存储到结尾处以后,接下来接收的数据,会循环存储在循环队列开始处,而读取过的循环队列中数据会被清除,因此,接收到的数据会循环存储到队列中,且使用该方法及系统,调用者不必维护很多的参数,在不降低传输效率的同时,减少了 TCP网络传输数据时,发生粘包现象导致数据传输错误的可能。
【附图说明】
[0020]图1为本发明提供的一种TCP网络传输数据防粘包的方法的步骤流程图。
[0021]图2a-图2e为本发明提供的一种TCP网络传输数据防粘包的方法中循环队列存储数据的排列示意图。
[0022]图3为本发明提供的一种TCP网络传输数据防粘包的方法具体实施例示意图。
[0023]图4为本发明提供的一种TCP网络传输数据防粘包的系统结构原理示意图。
【具体实施方式】
[0024]本发明提供了一种TCP网络传输数据防粘包的方法及系统,以下结合附图本发明的实施例对所述方法及系统进行详细说明。
[0025]基于在现有技术中通过在接收方缓冲内存中创建一个预处理线程,首先将接收到的数据包进行预处理,其中,由于需要在每次提取出数组中的存储的完整数据包后,剩下存储的数据需要重新移动到数组的开始位置,然后再继续接收数据和从剩下存储的数据中提取完整数据包,从带来每次提起数据都必须移动剩下的存储数据和数值中存储的数据需要额外的维护等诸问题,本发明提供了一种使用循环队列进行数据存储防止数据包之间发生粘包的方法。
[0026]本发明提供了一种TCP传输数据时防粘包的方法,应用于数据接收方,如图1所示,所述方法包括以下步骤:
S1、预先在传输数据的缓冲区域中建立循环队列。
[0027]为了防止发送方发出的,而接收方不能及时接收的数据包发生粘包的情况,在本步骤中首先在用于存储传输数据的缓冲区域中建立循环队列,所述循环队列用于对缓冲区域内保持的数据进行循环存储。
[0028]S2、接收来自发送方的数据,并将接收的数据依次排列存储到循环队列中,并从存储数据的开始位置判断循环队列中存储的数据是否含有完整的数据包,若含有则执行步骤C,否则重复本步骤。
[0029]接收发送方发出的数据,将接收到的数据按照接收的先后顺序依次排列到循环队列中。从存储队列的开始位置对队列中是否已经接收到完整的数据包进行判断,若接收到则执行步骤S3,否则继续接收数据。
[0030]S3、提取该完整的数据包,并清除所述循环队列中已提取的该完整的数据包所对应的数据;同时对所述循环队列中接收到的数据是否排列到循环队列的结尾处进行判断,若排列到结尾处,则执行步骤S4,否则返回步骤S2。
[0031]提取上述步骤S2中检测到的完整的数据包,复制所述数据包中包含的内容,并清除循环队列中包含的所述数据包所对应的数据,从而是循环队列中所述数据包所占用的位置空闲,便于下一数据包的存储。
[0032]S4、将后续接收到的数据从循环队列的开始位置进行下一循环的存储
将接下来接收到的数据从循环队列的开始位置进行下一循环的存储,即从循环队列的开始位置重新开始进行数据的存储。
[0033]本发明为时数据在循环队列中循环存储,即读取数据时,从每次均从循环队列中保存数据的有效开始端进行读取,并将读取后的数据清除,则存储数据的开始位置随着数据包的清除也移动到下一个存储数据包的开始位置,而当接收到的数据排列存储到循环队列的结尾处时,则自动从循环队列的开始端进行存储,从而实现了在存储的数据的存储位置不变的前提下,防止数据包之间的粘包问题,提高了传输数据的效率。
[0034]为了能更好的对循环队列中存储数据的开始端和结束端进行定位,在上述步骤SI还包括步骤Sll:
S11、在循环队列中设置用于对其中存储数据的开始位置和结束位置进行定位的开始定位标识和结束定位标识。
[0035]如图2a中所示,在循环队列未开始存储数据之前,在循环队列的存储数据的位置标示有数据存储的开始位置和结束位置,如图中以begin标识存储数据的开始处,以end标识存储数据的结束处。由于图2a中循环队列中未存储数据,因此其上显示的begin标识和end标识位于循环队列同一位置。
[0036]如图2b为循环队列中存储有数据包Pl和P2的示意图,如图所示,循环队列中从接收方接收到数据包Pl和P2,并使用开始定位标识和结束定位标识对其中存储的数据的位置进行标识,如图所示,begin标识表示为开始定位标识,其位于数据包Pl存储位置之前,所述end标识表示结束定位标识,其位于数据包P2存储位置之后。
[0037]图2c为当从开始定位标识处开始进行完整数据包的检测,当检测到循环队列中存储有完整数据包P1,将完整数据包Pl提取并清除后,循环队列中存储数据的结构示意图。如图所示,当数据包被清除后,其中存储数据包Pl的位置空闲,因此开始定位标识移动中其中存储的数据包P2的开始处,对循环队列中存储数据的开始位置进行定位。
[0038]图2d为在上述图2c中表述的状态下循环队列中再次接收到数据包P3时,将其进行存储,则结束定位标识自动移动到数据包P3之后,即图中所示的end标识根据循环队列中存储数据发生了改变,发生了移动。
[0039]图2e为当循环队列存储的数据已经到的队列的结尾处,则结束定位标识自动返回到循环队列的开始端,对接收到的数据所存储的位置进行定位,也即是当数据包P5保存在循环队列的开始端时,则将数据包P5结束段标识为数据存储的结束位置,并将其新接收到的数据包存储在end位置后面的空闲缓存区域,并从begin标识位置检测是否存储有完整数据包,并提取完整的数据包后,清除相对应的数据,从而实现对接收到的数据进行循环存储。
[0040]如上述图2b-图2c所述,步骤S4中还包括:
清除所述循环队列中完整数据包所对应的数据之后,所述开始定位标识自动移动到下一完整数据包所对应存储位置的开始端;
如上述所述图2a_图2b所述,步骤S2中还包括:
将接收的数据依次排列存储到循环队列中以后,所述结束定位标识自动移动到数据存储的结束位置。
[0041]为了能更加准确的对循环队列中是否含有完整的数据包,在上述步骤S3中判断循环队列中存储的数据是否含有完整的数据包的方法为:判断预定数据长度是否小于等于循环队列中存储的有效数据长度,若小于等于则判定为含有完整的数据包,否则判定为不含有完整的数据包;
所述有效数据长度为:当开始定位标识在结束定位标识之前时,位于所述开始定位标识和结束定位标识之间的队列长度,当开始定位标识在结束定位标识之后时,则位于所述开始定位标识之后和位于结束定位标识之前的队列长度。例如图2d中循环队列中存储数据的有效数据长度为begin标识(即开始定位标识)与end标识(即结束定位标识)之间的数据长度,而图2e中循环队列中存储数据的有效数据长度为begin标识(即所述开始定位标识)之后和位于end标识(即结束定位标识)之前的数据长度。
[0042]为了能缓存区域中建立循环队列,在所述步骤SI之前还包括步骤:
SO、预先在用于传输数据的缓冲区域中设置用于建立循环队列的内存空间。
[0043]如图3所示为本发明所提供的一种TCP传输数据时防粘包的方法在具体实施例时的步骤流程图,如图所示,在具体进行实施时,所述方法包括以下步骤:
H1、开始时,首先建立用于对发送方发送的数据进行预先存储的循环队列。
[0044]H2、接收TCP传输的数据,并将数据写入循环队列中,并实时根据循环队列中存储的数据处于的位置移动结束定位标识。
[0045]H3、在将接收到的数据存储入循环队列的同时,数据的接收方从开始定位标识位置读取长度为I的字段,并判断该字段长度是否小于等于有效数据长度,若小于等于则将其判定在循环队列中存在至少一个完整的数据包,则执行步骤H5,否则,返回到步骤H2继续接收数据,说明循环队列中不存在完整的数据包。
[0046]H5、提取检测到的完整的数据包,并清空该数据包在循环队列中的数据,并移动开始定位标识到下一个数据包存储的开始位置。
[0047]以c++语言为例,循环队列提供的接口如下:
1、long init(long size)
循环队列开辟大小为size的内存空间。
[0048]2、long writeBuffer (const char *pData, long len)
TCP接收到长度为len的网络数据,写入到循环队列。
[0049]3、long readBuffer (char *pBuf, long len)
从循环队列begin位置开始,取出长度为Ien的数据。
[0050]4、long readBytes (char *pBuf, long len)
从循环队列begin位置开始,读取长度为Ien的数据。
[0051]5、long getDataLengthO 返回循环队列中有效数据的长度。
[0052]6、1nggetBufferSize O 返回循环队列的大小。
[0053]的区别是,readBuffer读取数据后,会移动begin游标的位置,即取出了网络数据,而readBytes仅将数据拷贝一份,也即是仅仅用于对预设的数据长度是否小于等于存储数据的有效长度,小于等于,则通过readBuffer读取数据,否则并不通过readBuffer读取数据。
[0054]在上述方法的基础上,本发明还提供了一种TCP传输数据时防粘包的系统,如图4所示,所述系统包括:
循环队列建立模块10,用于预先在传输数据的缓冲区域中建立循环队列;其功能如上述步骤SI所述。
[0055]数据接收存储模块20,用于接收来自发送方的数据,并将接收的数据依次排列存储到循环队列中;其功能如上述步骤S2所述。
[0056]数据包判断模块30,用于从存储数据的开始位置判断循环队列中存储的数据是否含有完整的数据包;其功能如上述步骤S3所述。
[0057]数据提取及清除模块40,用于当所述数据包判断模块中判定出含有完整的数据包时,则提取该完整的数据包,并清除该数据包所对应的数据;其功能如上述步骤S4所述。
[0058]循环存储模块50,用于当检测所述循环队列中接收到的数据排列到循环队列的结尾处,则自动将后续接收到的数据从循环队列的开始位置进行下一循环的存储。其功能如上述步骤S5所述。
[0059]所述循环队列建立模块包括标识定位单元;
所述标识定位单元,用于在循环队列中设置用于对其中存储数据的开始位置和结束位置进行定位的开始定位标识和结束定位标识。
[0060]所述数据提取及清除模块包括结束定位标识移动单元;所述数据接收存储模块包括开始定位标识移动单元;
所述开始定位标识移动单元,用于当清除所述循环队列中完整数据包所对应的数据之后,将所述开始定位标识自动移动到下一完整数据包所对应存储位置的开始端;
所述结束定位标识移动单元,用于将接收的数据依次排列存储到循环队列中以后,所述结束定位标识自动移动到数据存储的结束位置。
[0061]所述系统还包括:内存设置模块;
所述内存设置模块,用于预先在用于传输数据的缓冲区域中设置用于建立循环队列的内存空间。
[0062]本发明所提供的一种TCP网络传输数据防粘包的方法及系统,通过采用循环队列缓存网络数据,并提供操作接口,对数据进行处理。由于数据是循环存储的,当循环队列存储到结尾处以后,接下来接收的数据,会循环存储在循环队列开始处,而读取过的循环队列中数据会被清除,因此,接收到的数据会循环存储到队列中,且使用该方法及系统,调用者不必维护很多的参数,在不降低传输效率的同时,减少了 TCP网络传输数据时,发生数据包粘包的现象,导致数据传输错误的可能。
[0063]应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。
【主权项】
1.一种TCP传输数据时防粘包的方法,其特征在于,应用于数据接收方,所述方法包括: A、预先在传输数据的缓冲区域中建立循环队列; B、接收来自发送方的数据,并将接收的数据依次排列存储到循环队列中,并从存储数据的开始位置判断循环队列中存储的数据是否含有完整的数据包,若含有则执行步骤C,否则重复本步骤; C、提取该完整的数据包,并清除所述循环队列中已提取的该完整的数据包所对应的数据;同时对所述循环队列中接收到的数据是否排列到循环队列的结尾处进行判断,若排列到结尾处,则执行步骤D,否则返回步骤B ; D、将后续接收到的数据从循环队列的开始位置进行下一循环的存储。2.根据权利要求1所述TCP传输数据时防粘包的方法,其特征在于,在上述步骤A还包括步骤Al: Al、在循环队列中设置用于对其中存储数据的开始位置和结束位置进行定位的开始定位标识和结束定位标识。3.根据权利要求2所述TCP传输数据时防粘包的方法,其特征在于,所述步骤C中还包括: 清除所述循环队列中完整数据包所对应的数据之后,所述开始定位标识自动移动到下一完整数据包所对应存储位置的开始端; 所述步骤B中还包括: 将接收的数据依次排列存储到循环队列中以后,所述结束定位标识自动移动到数据存储的结束位置。4.根据权利要求2所述TCP传输数据时防粘包的方法,其特征在于,在上述步骤C中还包括:判断循环队列中存储的数据是否含有完整的数据包的方法为:判断预定数据长度是否小于等于循环队列中存储的有效数据长度,若小于等于则判定为含有完整的数据包,否则判定为不含有; 所述有效数据长度为:当开始定位标识在结束定位标识之前时,位于所述开始定位标识和结束定位标识之间的队列长度,当开始定位标识在结束定位标识之后时,则位于所述开始定位标识之后和位于结束定位标识之前的队列长度。5.根据权利要求1所述TCP传输数据时防粘包的方法,其特征在于,所述步骤A之前还包括步骤: 预先在用于传输数据的缓冲区域中设置用于建立循环队列的内存空间。6.一种TCP传输数据时防粘包的系统,其特征在于,应用于数据接收方,所述系统包括: 循环队列建立模块,用于预先在传输数据的缓冲区域中建立循环队列;数据存储判断模块,用于接收来自发送方的数据,并将接收的数据依次排列存储到循环队列中,并从存储数据的开始位置判断循环队列中存储的数据是否含有完整的数据包;数据提取及清除模块,用于提取该完整的数据包,并清除所述循环队列中已提取的该完整的数据包所对应的数据;同时对所述循环队列中接收到的数据是否排列到循环队列的结尾处进行判断; 循环存储模块,用于当所述循环队列中接收到的数据排列到循环队列的结尾处,则将后续接收到的数据从循环队列的开始位置进行下一循环的存储。7.根据权利要求6所述TCP传输数据时防粘包的系统,其特征在于,所述循环队列建立模块包括标识定位单元; 所述标识定位单元,用于在循环队列中设置用于对其中存储数据的开始位置和结束位置进行定位的开始定位标识和结束定位标识。8.根据权利要求7所述TCP传输数据时防粘包的系统,其特征在于, 所述数据存储判断模块包括结束定位标识移动单元;所述数据提取及清除模块包括开始定位标识移动单元; 所述开始定位标识移动单元,用于当清除所述循环队列中完整数据包所对应的数据之后,将所述开始定位标识自动移动到下一完整数据包所对应存储位置的开始端; 所述结束定位标识移动单元,用于将接收的数据依次排列存储到循环队列中以后,所述结束定位标识自动移动到数据存储的结束位置。9.根据权利要求6所述TCP传输数据时防粘包的系统,其特征在于,所述系统还包括:内存设置模块; 所述内存设置模块,用于预先在用于传输数据的缓冲区域中设置用于建立循环队列的内存空间。
【文档编号】H04L1/00GK105991223SQ201510077379
【公开日】2016年10月5日
【申请日】2015年2月13日
【发明人】朱锦华
【申请人】Tcl集团股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1