一种TCP网络传输数据中防粘包的方法及系统技术方案

技术编号:13793058 阅读:41 留言:0更新日期:2016-10-06 05:39
本发明专利技术所提供的一种TCP网络传输数据防粘包的方法及系统,通过采用循环队列缓存网络数据,并提供操作接口,对数据进行处理。由于数据是循环存储的,当循环队列存储到结尾处以后,接下来接收的数据,会循环存储在循环队列开始处,而读取过的循环队列中数据会被清除,因此,接收到的数据会循环存储到队列中,且使用该方法及系统,调用者不必维护很多的参数,在不降低传输效率的同时,减少了TCP网络传输数据时,发生数据包之间的粘包,导致数据传输错误的可能。

【技术实现步骤摘要】

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

【技术保护点】
一种TCP传输数据时防粘包的方法,其特征在于,应用于数据接收方,所述方法包括:A、预先在传输数据的缓冲区域中建立循环队列;B、接收来自发送方的数据,并将接收的数据依次排列存储到循环队列中,并从存储数据的开始位置判断循环队列中存储的数据是否含有完整的数据包,若含有则执行步骤C,否则重复本步骤;C、提取该完整的数据包,并清除所述循环队列中已提取的该完整的数据包所对应的数据;同时对所述循环队列中接收到的数据是否排列到循环队列的结尾处进行判断,若排列到结尾处,则执行步骤D,否则返回步骤B;D、将后续接收到的数据从循环队列的开始位置进行下一循环的存储。

【技术特征摘要】
1.一种TCP传输数据时防粘包的方法,其特征在于,应用于数据接收方,所述方法包括:A、预先在传输数据的缓冲区域中建立循环队列;B、接收来自发送方的数据,并将接收的数据依次排列存储到循环队列中,并从存储数据的开始位置判断循环队列中存储的数据是否含有完整的数据包,若含有则执行步骤C,否则重复本步骤;C、提取该完整的数据包,并清除所述循环队列中已提取的该完整的数据包所对应的数据;同时对所述循环队列中接收到的数据是否排列到循环队列的结尾处进行判断,若排列到结尾处,则执行步骤D,否则返回步骤B;D、将后续接收到的数据从循环队列的开始位置进行下一循环的存储。2.根据权利要求1所述TCP传输数据时防粘包的方法,其特征在于,在上述步骤A还包括步骤A1:A1、在循环队列中设置用于对其中存储数据的开始位置和结束位置进行定位的开始定位标识和结束定位标识。3.根据权利要求2所述TCP传输数据时防粘包的方法,其特征在于,所述步骤C中还包括:清除所述循环队列中完整数据包所对应的数据之后,所述开始定位标识自动移动到下一完整数据包所对应存储位置的开始端;所述步骤B中还包括:将接收的数据依次排列存储到循环队列中以后,所述结束定位标识自动移动到数据存储的结束位置。4.根据权利要求2所述TCP传输数据时防粘包的方法,其特征在于,在上述步骤C中还包括:判断循环队列中存储的数据是否含有完整的数据包的方法为:判断预定数据长度是否小于等于循环队列中存储的有效数据长度,若小于等于则判定为含有完整的数据包,否则判定为不含有;所述有效数据长度为:当开始定位标识在结束定位标识之前时,位于所述开始定位标识和结束定位标识之间的队列长度,当开始定位标识在结束定位标识之后时,则位于所述开始定位标识之后和位于结束定位标识之前的队列长度。5.根据权利要求1所述TCP传...

【专利技术属性】
技术研发人员:朱锦华
申请(专利权)人:TCL集团股份有限公司
类型:发明
国别省市:广东;44

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1