【发明内容】
本发明能够实现一种高效的TCP乱序重组方法,不用过多的去考虑TCP序列号是否乱序和是否跨过0xffffffff的问题。
本发明采用如下技术方案:
第一方面,本发明提出了一种TCP乱序重组的方法,方法包括:
在监听到第一IP地址的第一TCP报文时,获取所述第一TCP报文的序列号字段值seq1;
用预设的set0减去seq1得到一个偏移值offset0;其中,所述第一TCP报文的重组用的序号设定为所述预设的set0;
在监听到对应所述第一IP地址的其它TCP报文后,提取各自的序列号字段值,并和所述偏移值offset0求和,相应的求和结果作为对应第一IP地址的各TCP报文重组用的序号。
优选的,所述预设的set0,是根据历史上监听到的对应所述第一IP地址的,且一次完整的TCP会话中,所完成发送最大体积的数据对象而定。
优选的,所述预设的set0大小为10M字节-2G字节。
优选的,在所述预设的set0大小为2G字节。
优选的,所述获取所述第一TCP报文的序列号字段值seq1后,方法还包括:
判断所述seq1若处于第一预设阈值和第二预设阈值之间,则直接根据各TCP报文的序列号字值进行排序重组;
判断所述seq1若处于第一预设阈值和第二预设阈值之外,则执行所述获取所述第一TCP报文的序列号字段值seq1之后的方法内容。
优选的,所述在监听到第一IP地址的TCP报文中,处理负载长度大于0的数据报文,没有负载的则跳过相应求和计算得到重组用的序号过程。
优选的,所述对应所述第一IP地址的其它TCP报文的序列号字段的内容分别加上所述offset0,各自取得一个四字节的相对offset0_seq;作为各TCP报文重组用的序号;其中,若第二TCP报文的序列号字段值比第一TCP报文的大或者第二TCP报文的序列号字段值发生溢出,则对应第二TCP报文的offset0_seq2比set0大;若第二TCP报文的序列号字段值比第一TCP报文的小,则对应第二TCP报文的offset0_seq2比set0小。
优选的,对TCP会话的一个方向的TCP报文按照offset0_seq由大到小挂双向链表。
优选的,在TCP会话收到fin报文或rst报文或者流会话超时,从链尾向链首遍历,便可通过offset0_seq重组TCP会话数据。
第二方面,本发明还提供了一种TCP乱序重组的方法和装置,用于实现第一方面所述的TCP乱序重组的方法,所述装置包括:
至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被程序设置为执行第一方面所述的TCP乱序重组的方法。
第三方面,本发明还提供了一种非易失性计算机存储介质,所述计算机存储介质存储有计算机可执行指令,该计算机可执行指令被一个或多个处理器执行,用于完成第一方面所述的TCP乱序重组的方法。
本发明能够高效的解决TCP重组过程中的报文乱序和seq序列跨最大值的问题,判断逻辑更省更快捷,相对与以前通过建立乱序链表实现乱序处理,处理速度更快,更省内存。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在本发明的描述中,术语“内”、“外”、“纵向”、“横向”、“上”、“下”、“顶”、“底”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明而不是要求本发明必须以特定的方位构造和操作,因此不应当理解为对本发明的限制。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
实施例1:
本发明实施例1提供了一种TCP乱序重组的方法,如图1所示,包括:
在步骤201中,在监听到第一IP地址的第一TCP报文时,获取所述第一TCP报文的序列号字段值seq1。
在本发明实施例中,所述第一TCP报文没有特殊的限定含义,主要是为了与其它TCP报文描述区别开来。但是,在本发明实施例的可选方案中,所述第一TCP报文可以指代就是接收到的第一个TCP报文。
在步骤202中,用预设的set0减去seq1得到一个偏移值offset0;其中,所述第一TCP报文的重组用的序号设定为所述预设的set0。
例如:所述对应所述第一IP地址的其它TCP报文的序列号字段的内容分别加上所述offset0,各自取得一个四字节的相对offset0_seq;作为各TCP报文重组用的序号;其中,若第二TCP报文的序列号字段值比第一TCP报文的大或者第二TCP报文的序列号字段值发生溢出,则对应第二TCP报文的offset0_seq2比set0大;若第二TCP报文的序列号字段值比第一TCP报文的小,则对应第二TCP报文的offset0_seq2比set0小。
在步骤203中,在监听到对应所述第一IP地址的其它TCP报文后,提取各自的序列号字段值,并和所述偏移值offset0求和,相应的求和结果作为对应第一IP地址的各TCP报文重组用的序号。
这样不管第一报文的的初始随机seq(在TCP报文进行三次握手协议中规定了,所述序列号字段值seq是随机生成的)是多少,得到的offset0_seq都等于N,如果有第一个报文之后有seq在它前面的乱序报文后到来(首包乱序),通过seq+offset0后offset0_seq也在0-N这个范围内,并且只要TCP流量传输数据在N-0xffffffff这个大小范围内,非首包乱序的报文都在的offset0_seq都在N-0xffffffff内,不用考虑seq跨过0xffffffff的问题。
本发明能够高效的解决TCP重组过程中的报文乱序和seq序列跨最大值的问题,判断逻辑更省更快捷,相对与以前通过建立乱序链表实现乱序处理,处理速度更快,更省内存。
结合本发明实施例还存在一种优选的方法,能够进一步提高排序速度和最终的重组效率,具体的,对TCP会话的一个方向的报文按照offset0_seq由大到小挂双向链表(即可以前向或者反向进行追溯),因为,offset0_seq大的放链首是为了添加快速(每次新TCP报文来的时候,进行比较都会以链首作为第一个比较对象),客观情况通常是乱序报文比较少,正常报文顺序一般都是offset0_seq越来越大,这样的排序方式能够提高排序速度。而重组过程则正好要反过来进行组合,此时,双向链表便能起到重要的作用。一般的,若采用单向链表,将offset0_seq大的放链尾,则的确可以在重组过程中直接沿用相应顺序,但是,在收到包对比offset0_seq进行排序的时候,则可能每次都需要对已经存储的TCP包的offset0_seq进行一轮比较,会浪费较大的计算资源。
在实际实现过程中,在TCP会话收到fin报文或rst报文或者流会话超时,从链尾向链首遍历即可通过offset0_seq重组TCP会话数据。
在本发明实施例中,所述预设的set0,是根据历史上监听到的对应所述第一IP地址的,且一次完整的TCP会话中,所完成发送最大体积的数据对象而定。这是为了能够保证本发明实施例所提出的方法能够有效的涵盖数据对象,不至于在实施本发明实施例方法过程中,再次因为数据总量过大,造成二次乱序问题。因此,在本发明实施例中,也凭借经验给予了所述预设的set0较合适的大小,具体为10M字节-2G字节。而作为最保险的处理方式,在所述序列号字段值的区间为4G时,则所述预设的set0大小为2G字节。这是考虑到有可能发生特殊情况,最先接收到的首包可能是该TCP会话的最后一个TCP报文,此时,在第一TCP报文重组用的序号设定为所述预设的set0后,其它报文的在通过各自的序列号字段值,并和所述偏移值offset0得到结果均比所述set0小,因此,采用中间值既可以满足最先接收到的首包可能是该TCP会话第一个TCP报文的情况,也可以满足最先接收到的首包可能是该TCP会话最后一个TCP报文的情况。
实际网络传输过程中,数据对象通常会被拆分成一个或者多个TCP报文进行传输,而作为各TCP报文来说,都会携带上一序列号字段赋值seqi,相应的seqi是根据每一个TCP报文携带数据大小进行累加的。
为了进一步保证本发明实施例实现过程中的执行效率,优选的,在监听到第一IP地址的TCP报文中,处理负载长度大于0的数据报文,没有负载的则跳过相应求和计算得到重组用的序号过程。
结合本发明实施例,还存在一种优选的实现方案,其中,所述获取所述第一TCP报文的序列号字段值seq1后,方法还包括:
判断所述seq1若处于第一预设阈值和第二预设阈值之间,则直接根据各TCP报文的序列号字值进行排序重组;即利用现有的序列号字值直接进行TCP报文重组,而无需采用本发明实施例1中所描述的方法步骤。
判断所述seq1若处于第一预设阈值和第二预设阈值之外,则执行所述获取所述第一TCP报文的序列号字段值seq1之后的方法内容。
其中,第一预设阈值和第二预设阈值可以根据经验进行设定,而其设定所考虑的是序列号字自身有拥有的区间大小,以及TCP会话中所涉及的数据包总大小;以使得第一TCP报文中序列号字段值seq1在落入所述第一预设阈值和第二预设阈值之间时,可以保证后续的其它报文的序列号字段值不会发生溢出。这是可以凭借上述历史经验中得出的最大数据包大小和当前序列号字自身有拥有的区间大小两个因素确定的。
实施例2:
本发明实施例以一个直观的实例展示本发明实施例1中的主体方法过程,如图所示,如图2所示,方法包括:
在步骤401中,对于同一五元组的TCP流重组,处理负载长度大于0的数据报文,没有负载的TCP报文不需要重组。
在步骤402中,以处理的第一个TCP报文做参照(不管此报文是否是乱序报文),取得seq序列号A。
在步骤403中,用固定四字节N-A得到一个偏移值offset0。其中,关于N(即本发明实施例1和2中的预设的set)取值:如果两个报文乱序的seq的差值的最大值为M,N取值比M要大,这个差值M一般不会太大,为保证N一定比M大,我们这个N值可以取大点以保证一定大于M,比如2^31(2G),毕竟不可能乱序2G的数据。
在步骤404中,对所有处理的TCP报文的seq都加上这个offset0,取得一个四字节的相对offset0_seq。这样不管第一报文的的初始随机seq是多少,得到的offset0_seq都等于N,如果有第一个报文之后有seq在它前面的乱序报文后到来(首包乱序),通过seq+offset0后offset0_seq也在0-n这个范围内,并且只要TCP流量传输数据在N-0xffffffff这个大小范围内,非首包乱序的报文都在的offset0_seq都在N-0xffffffff内,不用考虑seq跨过0xffffffff的问题。变换过程如图3所示:可以看到经过每个报文都加上同一偏移之后,seq由原来的2<3<1变成了真实的数据序列3<1<2。除此以外,本发明实施例还列举了N取2G时的实例(报文中其它参数与图3一致),效果如图4所示。其中,例子中报文收到的顺序是1,2,3,seq的顺序由于跨零了,为1,3,2,实际顺序是3,1,2,3为乱序报文,3,1,2之间依次相差1460字节。
在步骤405中,对TCP会话的一个方向的报文按照offset0_seq由大到小挂双向链表,offset0_seq大的放链首是为了添加快速,因为乱序报文毕竟比较少,正常报文顺序一般都是offset0_seq越来越大。
在步骤406中,在TCP会话收到fin报文或rst报文或者流会话超时,从链尾向链首遍历即可通过offset0_seq重组TCP会话数据。
实施例3:
如图5所示,是本发明实施例的TCP乱序重组的装置的架构示意图。本实施例的TCP乱序重组的装置包括一个或多个处理器21以及存储器22。其中,图5中以一个处理器21为例。
处理器21和存储器22可以通过总线或者其他方式连接,图5中以通过总线连接为例。
存储器22作为一种TCP乱序重组的方法和装置非易失性计算机可读存储介质,可用于存储非易失性软件程序和非易失性计算机可执行程序,如实施例1中的TCP乱序重组的方法。处理器21通过运行存储在存储器22中的非易失性软件程序和指令,从而执行TCP乱序重组的方法。
存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器22可选包括相对于处理器21远程设置的存储器,这些远程存储器可以通过网络连接至处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例1中的TCP乱序重组的方法,例如,执行以上描述的图1-图2所示的各个步骤。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,Random AccessMemory)、磁盘或光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。