本发明公开了用于通信设备持续极速收包解包的单缓冲区断包拼接算法,适用于通过网络套接字进行持续收包解包的互联网领域、大数据领域及网络通信系统研发领域,也适用于所有需要接收并解析以太网报文的有线或无线通信,也适用于需要持续对被测设备进行数据报文采集解析并综合各数据指标分析被测设备各项功性能指标的的测控领域,也适用于需要与上位机交互并随时接收解析上位机发送的使用了任意应用层交互协议格式命令包的嵌入式工控领域和电子信息领域,以及需要进行实时地持续接收并进行音视帧解码或视频帧解码的流媒体领域,具体涉及一种用于通信设备持续极速收包解包的单缓冲区断包拼接算法。
背景技术:
1、收包解包是所有通信领域最常见的需求之一,包即协议包或叫报文,本质上是由负载数据加上协议包头和包尾所构成的该协议的基本传输单元即pdu,此添加包头包尾构成基本传输单元的过程叫做组包或成包,接收方接收到指定长度数据流后从缓冲区中还原出各包边界并根据需求选择拆解使用包括负载数据在内各字段的过程叫做解包。绝大部分协议包头含有用作起始标识作用的起始标识符字段,一些常用协议的包头还会有指示负载数据长度或总包长的字段。包尾一般为校验字段,用以帮助接收方在收包后核对校验结果是否与传输方一致以保证包地正确接收,避免因传输过程中字节丢失等传输误码情况或解包算法本身的不严谨性导致错误收包或解包,如crc循环冗余校验、和校验、奇偶校验等;接收方无法提前预知传输的各协议包的数量、长度、边界,故一般会指定接收数据量以流形式快速接收缓存传输的各协议包,多包被同时接收缓存并粘在一起的现象叫做粘包;此外因为通信设备所指定的接收数据量很可能不恰好等于按序传输的各协议包中的“其中一包或多包长度之和”,导致有较大可能缓存的末尾是一个未被完整接收的格式缺失的包,即断包,该包未被接收的缺失部分在通信设备下次接收足够长的数据流时恰好以其所指定的缓存首址为起点存放;绝大多数通信协议为避免传输的单包过长,规定了协议包的最大传输单元mtu,当组包过程中因负载数据过长导致总包长超出mtu时会按具体协议规则分成多个小于mtu的包,将负载拆成了多个部分作为分出的各包的负载字段,此过程称为分包或分片。以太帧为例,当以太帧长超过对应的mtu即1500字节时,会在网络层按规则将ip数据包分片后再将各分片经由网线按序传输。有些协议还规定了最小传输单元,即最小包长限制,以避免负载数据已远小于包头或包尾长度时还使用协议包的方式传输浪费信道资源。故即使不分包,传输的各协议包的长度也可以是在最小包长限制和最大传输单元之间的任何长度,即各包长短不一,增加了接收方在解包过程中定位各包边界即起点和终点位置的难度。上述粘包、分包、断包以及各包长度不一在内的现象是解包技术难题的根源所在。而其中断包又是接收方在持续首包解包过程中最难处理的部分,是通信技术领域最为头痛的解包难题。因为持续解包的程序代码往往是一个循环,循环的每一轮即一轮解包过程,而若在整个接收缓冲区做越界检查避免解包时越界访问,意味着在移动遍历指针匹配查找包起始标识符的过程中,要逐字节检查判断以此为起点的剩余未解包部分是否足够一包长,这还仅仅是循环体的一轮,此大量冗余判断的过程极大的增加了持续解包程序的时间复杂度。这导致要满足低时间复杂度和低空间复杂度,且适用于osi七层网络模型框架结构中任何一层协议报文的通用解包算法可以说是寥寥无几。而涉及解包的领域范围极广,既可以是源于以太网中的网卡发送的或由路由器转发的tcp/ip数据报,也可以是收到的来自上位机的通过网线、串口线、spi、iic或其它任何数据总线传输的命令包或握手信号,也可以是为了监测被测对象而持续采集抓取的任何类型的数据包,还可以是流媒体领域中任何需要高效快速接收并解码的音视频帧,或是直接通过流套接字收到的来自客户端的私有协议数据包。有些协议甚至允许包头的起始标识符字段与负载部分重复,这也就导致了一些解包方法在解包时的匹配定位包起点过程中误把负载当包起点而错误解包。且通信传输过程本身就存在一定的误码率,若解包算法还增加了数据接收的错误率,这是高精尖通信技术领域所不能容忍的。故现有通信技术领域对低时间复杂度、空间复杂度、不增加数据接收错误率且多协议通用性的解包算法孜孜以求。
技术实现思路
1、本发明克服了上述的现有通信解包技术难题,公开了用于通信设备持续极速收包解包的单缓冲区断包拼接算法,给出了适用于“任何包头含包起始标识符字段的协议报文”的通用的持续解包算法以及断包的识别和拼接方法。本发明仅使用单线程、单个存储空间连续的接收缓冲区,不开辟任何辅助空间,通过kmp字符串匹配算法在待解包区域查找各包起始标识符降低包起点定位过程的时间复杂度,通过划分出可能断包区,缩小对剩余部分是否够一包长的解包前越界检查的范围,通过在可能断包区进行此越界检查快速识别出断包,通过搬运长度为n断包至缓冲区首址buf开始存放并在下轮收包时指定buf+n为缓存起点实现快速拼接断包,本发明所述算法满足了通信业对于解包程序低空间复杂度、低时间复杂度、不增加接收错误率等严苛需求,且同时保证了所述算法适用于多种协议类型和搭载各种类型的处理器的通信设备。
2、为实现以上目的,本发明提供如下技术方案:
3、用于通信设备持续极速收包解包的单缓冲区断包拼接算法,,应用于进行持续收包解包的通信设备中,其算法步骤包括:
4、1)创建一个存储空间连续的接收缓冲区,其首地址为buf、大小为size;所述变量n用于保存在所述接收缓冲区中待解包区域的待解包数据量,所述待解包区域是指缓存有数据等待解包的区域,第一次收包之前所述待解包数据量n等于0;创建指针变量char*p用于遍历所述待解包区域查找定位缓存的各包的起始地址;
5、2)通信设备以流形式接收协议包后以buf+n为首地址缓存当前此次实际接收到的数据量recv,并更新待解包数据量(n=n+recv);
6、3)根据协议规定的最大单包长度m与所述待解包数据量n的大小关系划分待解包区域[buf,buf+n-1],若n<m,则待解包区域全部被划分为可能断包区,若n≥m,则待解包区域被划分为包完整区[buf,buf+n-m]和可能断包区[buf+n-m+1,buf+n-1];
7、4)通过kmp字符串匹配算法在所述待解包区域中移动指针p依次从左往右匹配查找协议规定的包起始标识符字段,每当找到一包的起始标识符后以此为该包起点依据协议的各字段格式、长度向右解包,解完一包后先使所述指针p等于此包末地址加1,再以此为新的查找起点继续向右定位拆解下一包,若指针p从新的查找起点右移匹配下一包起始标识符的过程中已进入可能断包区,则需先依据协议格式对剩余未解包部分[p,buf+n-1]做越界检查,以确认剩余未解包部分足够一包长才能继续解包,,若剩余未解包部分不足一包长时,则剩余未解包部分缓存的是未被完整接收的断包无法继续解包,此时调用函数memcpy(buf,p,n)搬运此断包至缓冲区起点开始存放,然后更新待解包数据量n等于断包长度(buf+n-p)后,结束本轮解包,而若直至p指向的新查找起点已离开待解包区域仍未发现断包,则将待解包数据量n清零并结束本轮解包;
8、5)回到步骤2)继续下一轮收包解包,此时若待解包数据量n非0,则其为上一轮解包过程遗留并搬运的断包长度,该轮以buf+n为接收缓存的起点恰好实现了断包与新数据的快速拼接。
9、一些实施例中,用于通信设备持续极速收包解包的单缓冲区断包拼接算法,其算法步骤所述的解包是通信解包,即通信设备以流形式接收传输的各协议包后,根据传输方所使用的协议格式从缓存的数据流中还原出各包的边界,包括各包的在缓冲区中的起点、终点位置,并根据实际需求进行至少包括“以包起始标识符字段为该包起点位置向右拆解使用包头各字段、拆解并保存负载数据、当包尾含校验字段时以此检查该包是否被正确接收”在内的一个或多个过程;所述断包是指通信设备所指定的接收数据量不恰好等于按序传输的各协议包中的“其中一包或多包长度之和”,所导致的缓存在指定的接收缓冲区的末尾部分的一个因未被完整接收而格式缺失的协议包,该包未被接收的缺失部分在通信设备下次接收足够长的数据流时缓存于此次指定的接收缓存首地址开始的起始部分区域中。
10、一些实施例中,所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,所述持续极速收包解包的单缓冲区断包拼接算法是适用于osi七层网络模型框架结构中任何一层协议的报文的通用通信解包算法,而非只适用于单个特定协议的特定解包方法,任何包头含有包起始标识作用的字段的协议报文均可使用所述算法持续收包解包及识别和处理断包,其至少包括“应用层的snmp或tftp或http协议报文”、“传输层的tcp或udp报文”、“网络层的ip数据报”、“数据链路层的ppp协议包”以及其它包头含有用作起始标识符字段的公有或私有协议报文。
11、一些实施例中,所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,其所述算法持续收包、解包以及断包拼接的过程中仅使用单个存储空间连续的接收缓冲区,不开辟任何辅助空间以实现极低的空间复杂度。
12、一些实施例中,所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,其完成任何一轮收包、解包以及断包拼接的过程均只左到右遍历了一次接收缓冲区,以实现算法较低的时间复杂度,也为了保证对个别“允许包头字段与负载部分重复”的协议报文在匹配查找包起始标识符的过程中不会“先遇到与包头字段重复的负载字段”而误把负载部分当作包起始位置而导致错误解包,还为了保证使用单线程能够完成持续收包、解包以及断包拼接的过程,使所述算法的适用范围不局限于搭载多核处理器的通信设备,也可用于只有单核处理器和单线程处理能力的通信设备。
13、作为优选,所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,其将接收缓存的数据流视作主串、将协议规定的包起始标识符视作目的串,通过使用kmp字符串匹配算法在接收缓冲区中从左到右移动所述指针p来匹配查找定位包起始标识符字段的位置,以所述指针p为起点的主串和包起始标识符这个子串在逐字符匹配失败时指针p继续右移查找,利用kmp算法生成的nextval数组去掉不必要地回退查找和重复比较的过程,以降低所述解包算法定位各包起点位置过程的时间复杂度,但所述解包算法也支持使用暴力匹配算法或其它手段代替kmp算法匹配查找各包起始标识符的位置;
14、作为优选,所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,其使用c标准库提供的memcpy函数来实现将断包搬运至缓冲区首地址为起点存放的目的,以保证高效率地实现对连续存储区域的数据搬运,但所述算法也支持调用其它函数或使用其它替代方法搬运断包;
15、所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,其依据协议格式对剩余未解包部分[p,buf+n-1]做越界检查的过程仅在“长度必定小于协议规定的最大单包长度m”的可能断包区内进行,以避免在全部待解包区域中反复检查未解包部分是否够一包长而增加大量的冗余判断时间;而对于所述指针p若“在包完整区”成功匹配定位包起始标识符后在解包过程中发现任意字段缺失或错误,均统计传输的错误包数量加1并使“指针p等于此错误包的起始标识符地址加1”从而直接跳过此错误包继续匹配查找下一包;所述在“可能断包区”匹配包起点标识符及解包前对剩余未解包部分做越界检查发现此部分为断包的情形至少包括:
16、协议规定了最小单包长度,且所述剩余未解包部分已小于该长度,或;
17、协议规定了包头字段长度固定为h字节,且所述剩余未解包部分不足h字节,或;
18、协议的包头中包含有指示负载数据长度的字段,且所述剩余未解包部分已长度小于包头长度与负载数据长度之和,或;
19、所述剩余未解包部分长度已小于“任何由协议格式可确定的已知长度的各字段长度和”。
20、作为优选,对于所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,若协议规定包头字段长度固定为h字节且所述可能断包区的长度≥h,可细分该可能断包区的[buf+n-h+1,buf+n-1]部分为包头可能缺失区,其余部分为包头完整区;从而在所述包头完整区匹配查找定位包起始标识符之前的越界检查中不再计算剩余未解包部分是否已小于包头长度h,以进一步加快在可能断包区中查找包起始标识符的速度。
21、本发明还提供所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法的适用场景,适用此算法的通信场景及通信设备至少包括:
22、使用所述算法通过网络流套接字持续接收并解析应用层协议包的通用计算机或嵌入式计算机;
23、使用所述持算法接收解析以太网报文的网卡、端系统卡、网络芯片;
24、使用所述算法的接收tcp/ip数据包并解析各包的源ip地址和目的ip地址,并根据此ip地址管理和转发报文的路由器;
25、使用所述算法的接收以太帧并解析各帧的源mac地址和目的mac地址,并根据此mac地址管理和转发数据帧的交换机;
26、使用所述算法解析工控上位机发送的私有交互协议格式命令包的下位机;
27、使用所述算法持续从被测对象采集数据报文、解析报文并综合各数据指标分析被测对象的各项功性能指标的测控设备;
28、使用所述算法持续进行音频帧接收及解码的音频帧解码器;
29、使用所述算法持续进行视频帧接收及解码的视频帧解码器。
30、本发明至少包括以下有益效果:
31、(1)算法仅使用单个存储空间连续的接收缓冲区,不开辟任何辅助空间用于解包和处理断包,空间复杂度极低;(2)算法使用单线程持续收包解包,算法程序可运行于单核或多核在内的任何类型的通信设备处理器;(3)算法具有通用性,可用于任何在包头给出起始标识符的协议报文的持续收包解包,可适用于osi七层网络模型框架结构中任何一层协议。(4)算法通过使用kmp字符串匹配算法在待解包区域查找各包起始标识符降低了包起点定位过程的时间复杂度;(5)算法根据协议规定的单包最大长度和待解包数据量的大小关系提前划分出可能断包区,缩小了对剩余部分是否够一包长的解包前越界检查的范围;(6)算法通过在小于最大单包长度的可能断包区进行的越界检查快速识别出了接收缓存的断包;(7)算法通过搬运长度为n断包至缓冲区首址buf开始存放并在下轮收包时指定buf+n为缓存起点的方式,提供了快速巧妙的断包拼接处理方法,并顺序实现了持续收包解包;(8)算法在每一轮定位包起始标识符和解包过程中仅从左到右遍历过一次接收缓冲区,规避了对个别允许包头起始标识符和负载部分重复的协议在定位包起点过程中误把负载当做起点解包出错的情况。
1.用于通信设备持续极速收包解包的单缓冲区断包拼接算法,应用于进行持续收包解包的通信设备中,其特征在于,包括:
2.如权利要求1所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,其特征在于,所述下一轮收包解包的过程具体包括:通信设备以流形式接收传输的各协议包后,根据传输方所使用的协议格式从缓存的数据流中还原出各包的边界,所述各包的边界包括各包在缓冲区中的起点和终点位置,并根据需求进行至少包括以包起始标识符字段为该包起点位置向右拆解使用包头各字段,拆解并保存负载数据字段,以及当包尾含校验字段时以此检查该包是否被正确接收在内的一个或多个过程;所述断包为通信设备所指定的接收数据量不恰好等于按序传输的各协议包中的其中一包或多包长度之和所导致的缓存在指定的接收缓冲区的末尾部分的一个因未被完整接收而格式缺失的协议包,该包未被接收的缺失部分在通信设备下轮收包过程中接收足够长的数据流时缓存于此次指定的接收缓存首地址开始的起始部分区域中。
3.如权利要求1所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,其特征在于,所述持续极速收包解包的单缓冲区断包拼接算法是适用于osi七层网络模型框架结构中任何一层协议的报文的通用通信解包算法,任何包头含有包起始标识作用的字段的协议报文均可使用所述算法持续收包解包及识别和处理断包,其中,适用于所述算法的协议报文至少包括应用层的snmp、tftp或http协议报文,传输层的tcp或udp报文,网络层的ip数据报,数据链路层的ppp协议包,以及其它包头含有用作起始标识符字段的公有或私有协议报文。
4.如权利要求1所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,其特征在于,所述算法持续收包解包以及断包拼接的过程中仅使用单个存储空间连续的接收缓冲区,无需辅助空间以实现极低的空间复杂度。
5.如权利要求1所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,其特征在于,所述算法完成任何一轮收包解包以及断包拼接的过程均只左到右遍历了一次接收缓冲区,以实现算法较低的时间复杂度,同时保证对其他允许包头字段与负载部分重复的协议报文在匹配查找包起始标识符的过程中不会先遇到与包头字段重复的负载字段而误把负载部分当作包起始位置而导致错误解包。
6.如权利要求5所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,其特征在于,所述算法将接收缓存的数据流作为主串,将协议规定的包起始标识符作为目的串,通过使用kmp字符串匹配算法在接收缓冲区中从左到右移动所述指针p来匹配查找定位包起始标识符字段的位置,以所述指针p为起点的主串和包起始标识符这个子串在逐字符匹配失败时指针p继续右移查找,利用kmp算法生成的nextval数组去掉不必要地回退查找和重复比较的过程,以降低所述解包算法定位各包起点位置过程的时间复杂度,其中,所述解包算法支持使用暴力匹配算法代替kmp算法匹配查找各包起始标识符的位置。
7.如权利要求1所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,其特征在于,所述算法使用c标准库提供的memcpy函数来实现将断包搬运至缓冲区首地址为起点存放的目的,以保证高效率地实现对连续存储区域的数据搬运,其中,所述解包算法支持调用strncpy函数或sprintf函数代替memcpy函数搬运断包。
8.如权利要求1所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,其特征在于,所述依据协议格式对剩余未解包部分[p,buf+n-1]做越界检查的过程仅在长度小于协议规定的最大单包长度m的可能断包区内进行,以避免在全部待解包区域中反复检查未解包部分是否够一包长而增加大量的冗余判断时间;对于所述指针p若在包完整区成功匹配定位包起始标识符后在解包过程中发现任意字段缺失或错误,均统计传输的错误包数量加1并使指针p等于此错误包的起始标识符地址加1从而直接跳过此错误包继续匹配查找下一包;其中,所述在可能断包区匹配包起点标识符及解包前对剩余未解包部分做越界检查发现此部分为断包的情形至少包括:
9.如权利要求1所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,其特征在于,若协议规定包头字段长度固定为h字节且所述可能断包区的长度≥h字节,则可能断包区的[buf+n-h+1,buf+n-1]部分为包头可能缺失区,其余部分为包头完整区,从而在所述包头完整区匹配查找定位包起始标识符之前的越界检查中不再计算剩余未解包部分是否已小于包头长度h,以进一步加快在可能断包区中查找包起始标识符的速度。
10.如权利要求1所述的用于通信设备持续极速收包解包的单缓冲区断包拼接算法,其特征在于,应用于进行持续收包解包的通信设备至少包括:
