一种TCP流重组方法和装置与流程

文档序号:12037766阅读:326来源:国知局
一种TCP流重组方法和装置与流程

本申请涉及计算机技术领域,特别是涉及一种tcp流重组方法和一种tcp流重组装置。



背景技术:

随着网络犯罪手段不断趋于复杂化和多样化,传统方法无法检测出某些特殊的新型入侵行为,例如利用tcp(transmissioncontrolprotocol,传输控制协议)协议缺陷,发送大量伪造的tcp连接请求,从而使得被攻击方资源耗尽的synflood(拒绝服务)攻击。若敏感信息分片到几个不同的数据包中,数据包特征就会消失从而无法检测出恶意行为,无法满足网络安全防护和打击网络犯罪的实际需要。为了提高恶意数据流检测的准确性,不能只是运用数据包级的处理,必须将每条tcp流的所有数据包重组为完整的会话流,以进行应用级分析。由于tcp流在ip层被切分成多个ip(internetprotocol,网络协议)分片来传输,使得整个数据传输过程中可能存在tcp报文段失序、重复,甚至还会有丢包的情况。

针对上述情况,在获取tcp数据包之后,如何通过有效的tcp流重组方法实现对tcp连接上传输信息的恢复是一种核心的网络技术。tcp流重组技术是一种将网络包恢复成原始数据流的技术。当前最通用、最常见的tcp流重组方法是采用链表实现的队列缓存tcp包的方式实现的,具体步骤如下:

1、系统创建一个按序到达包队列和一个乱序包队列,用于存储按序到达和提前到达的数据包。其中,按序到达的数据包是指当前到达的数据包是与已经到达的数据包相连的后续报文,提前到达的数据包是指当前到达的数据包不是与已经到达的数据包相连的后续报文,而是提前到来的报文,此时应该将这个数据包放置到乱序包队列存储起来,以备后续重组使用。

2、在一个新数据包到达之后,先判断该数据包是否为提前到达的数据包,若是提前到达的数据包则存入乱序包队列,若不是提前到达的数据包则 存入按序到达包队列。

3、在tcp流结束时则进行合并、组装等一系列较为复杂的运算,完成tcp流重组。

另外,对于每个到达的数据包,都需要对数据包的边界进行多次判断,决定对该数据包做何种处理,例如是拆解还是丢弃。而且对于拆解后保留的部分还需要插入到按序到达队列或者提前到达队列指定的位置。以按序到达的数据包为例。首先需要判断新到达的数据包与已经存入按序到达包队列中的数据包,对应在按序到达包队列中的存储空间是否有重叠的部分,若没有重叠的部分,则直接将新到达的数据包存入按序到达包队列中,而若有重叠的部分,则进一步判断重叠的部分是否对应整个新到达的数据包,若是则可以直接将该新到达的数据包丢弃,若不是则对新到达的数据包进行拆解,丢弃其中重叠的部分,并将保留的部分存入按序到达包队列。

因此可见,现有的流重组方法操作比较复杂,导致效率较低,往往很难满足系统性能方面的需求。



技术实现要素:

鉴于上述问题,提出了本申请实施例以便提供一种克服上述问题或者至少部分地解决上述问题的一种tcp流重组方法和相应的一种tcp流重组装置。

为了解决上述问题,本申请公开了一种tcp流重组方法,包括:

针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组;

针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度;

当所述有效数据包属于客户端时,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组存储;

当所述有效数据包属于服务器时,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于服务器的第二数组存储。

可选地,所述针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组的步骤,包括:

在所述tcp连接建立成功之后,创建属于客户端的第一数组,和/或属于服务器的第二数组。

可选地,所述针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组的步骤,包括:

在接收所述tcp连接的数据包时,判断所接收到的数据包是否为含有tcp载荷的有效数据包;

如果所接收到的数据包是含有tcp载荷的有效数据包,判断所述有效数据包是否为第一个有效数据包;

如果所述有效数据包是第一个有效数据包,则判断所述有效数据包是否属于客户端;

如果所述有效数据包属于客户端,创建属于客户端的第一数组;

如果所述有效数据包不属于客户端,创建属于服务器的第二数组。

可选地,所述针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度的步骤,包括:

计算所述有效数据包中有效数据的长度作为数据长度;

当所述有效数据包属于客户端,则根据有效数据包的tcp序列号和预先记录的第一纠偏值之差,确定所述有效数据包的偏移量;所述第一纠偏值为属于客户端的syn包的初始序列号+1;

当所述有效数据包属于服务器,则根据有效数据包的tcp序列号和预先记录的第二纠偏值之差,确定所述有效数据包的偏移量;所述第二纠偏值为属于服务器的syn包的初始序列号+1。

可选地,在针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度之后,还包括:

当所述有效数据包属于客户端,则判断所述有效数据包的偏移量和数据长度之和,是否大于第一数组的数组长度;

如果所述有效数据包的偏移量和数据长度之和,大于第一数组的数组长 度,则创建一个新的第一数组,所述新的第一数组的数组长度超过原来的第一数组第一阈值;

将原来的第一数组中存储的数据复制到新的第一数组中,并将未存储过的有效数据包的有效数据存储至新的第一数组中。

可选地,在针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度之后,还包括:

当所述有效数据包属于服务器,则判断所述有效数据包的偏移量和数据长度之和,是否大于第二数组的数组长度;

如果所述有效数据包的偏移量和数据长度之和,大于第二数组的数组长度,则创建一个新的第二数组,所述新的第二数组的数组长度超过原来的第一数组第二阈值;

将原来的第二数组中存储的数据复制到新的第二数组中,并将未存储过的有效数据包的有效数据存储至新的第二数组中。

可选地,还包括:

在将原来的第一数组中存储的数据复制到新的第一数组中之后,将原来的第一数组释放。

可选地,还包括:

在将原来的第二数组中存储的数据复制到新的第二数组中之后,将原来的第二数组释放。

可选地,针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组的步骤之前,还包括:

当接收到syn包时,判断所述syn包是来自客户端还来自服务器;

如果syn包是来自客户端,则记录客户端的初始序列号isn(c);

如果syn包是来自服务器,则记录服务器的初始序列号isn(s)。

可选地,所述针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组的步骤,包括:

针对一tcp连接,在内存中创建属于客户端的第一数组,和/或属于服务器的第二数组。

可选地,所述在当前tcp连接结束后,输出第一数组和/或第二数组中的数据的步骤,包括:

当在所述tcp连接下接收到任一个非指示关闭连接的数据包后,判断出所述tcp连接的空闲时间超过第一时间周期,则结束所述tcp连接,输出第一数组中的数据;

和/或,当在所述tcp连接下接收到指示关闭连接的数据包后,判断出所述tcp连接的空闲时间超过第二时间周期,则结束所述tcp连接,输出第一数组中的数据。

可选地,所述当所述有效数据包属于客户端时,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组存储的步骤,包括:

根据所述有效数据包的偏移量和数据长度,判断所述有效数据包的有效数据与第一数组的有效数据的重叠情况;

如果第一数组中存在与所述有效数据包全部重叠的有效数据,则将所述有效数据包中重叠部分的有效数据丢弃;

如果第一数组中存在与所述有效数据部分重叠的有效数据,将所述有效数据包中重叠部分的有效数据丢弃,并计算不重叠部分的有效数据的第一偏移量和第一数据长度,再将不重叠部分的有效数据在第一数组的第一偏移量位置开始存储,直至存储长度为所述第一数据长度;

如果第一数组中不存在与所述有效数据重叠的有效数据,则将所述有效数据包的有效数据在第一数组的偏移量位置开始存储,直至存储长度为所述数据长度。

可选地,所述当所述有效数据包属于服务器时,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于服务器的第二数组存储的步骤,包括:

根据所述有效数据包的偏移量和数据长度,判断所述有效数据包的有效数据与第二数组的有效数据的重叠情况;

如果第二数组中存在与所述有效数据包全部重叠的有效数据,则将所述 有效数据包中重叠部分的有效数据丢弃,

如果第二数组中存在与所述有效数据部分重叠的有效数据,将所述有效数据包中重叠部分的有效数据丢弃,并计算不重叠部分的有效数据的第二偏移量和第二数据长度,再将不重叠部分的有效数据在第二数组的第二偏移量位置开始存储,直至存储长度为所述第二数据长度;

如果第二数组中不存在与所述有效数据重叠的有效数据,则将所述有效数据包的有效数据在第二数组的偏移量位置开始存储,直至存储长度为所述数据长度。

可选地,还包括:在当前tcp连接结束后,输出第一数组和/或第二数组中的数据。

本申请还公开了一种tcp流重组装置,包括:

第一创建模块,适于针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组;

计算模块,适于针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度;

第一存储模块,适于当所述有效数据包属于客户端时,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组存储;

第二存储模块,适于当所述有效数据包属于服务器时,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于服务器的第二数组存储。

可选地,所述第一创建模块,包括:

第一创建子模块,适于在所述tcp连接建立成功之后,创建属于客户端的第一数组,和/或属于服务器的第二数组。

可选地,所述第一创建模块,包括:

tcp判断子模块,适于在接收所述tcp连接的数据包时,判断所接收到的数据包是否为含有tcp载荷的有效数据包;如果所接收到的数据包是含有tcp载荷的有效数据包,则进入第一判断子模块;

第一判断子模块,适于判断所述有效数据包是否为第一个有效数据包;如果所述有效数据包是第一个有效数据包,则进入客户端判断子模块;

客户端判断子模块,适于判断所述有效数据包是否属于客户端;如果所述有效数据包属于客户端,则进入第一数组创建子模块;如果所述有效数据包不属于客户端,则进入第二数组创建子模块;

第一数组创建子模块,适于创建属于客户端的第一数组;

第二数组创建子模块,创建属于服务器的第二数组。

可选地,所述计算模块,包括:

数据长度计算子模块,适于计算所述有效数据包中有效数据的长度作为数据长度;

第一偏移量计算子模块,适于当所述有效数据包属于客户端,则根据有效数据包的tcp序列号和预先记录的第一纠偏值之差,确定所述有效数据包的偏移量;所述第一纠偏值为属于客户端的syn包的初始序列号+1;

第二偏移量计算子模块,适于当所述有效数据包属于服务器,则根据有效数据包的tcp序列号和预先记录的第二纠偏值之差,确定所述有效数据包的偏移量;所述第二纠偏值为属于服务器的syn包的初始序列号+1。

可选地,在所述计算模块之后,还包括:

第一判断模块,适于当所述有效数据包属于客户端,则判断所述有效数据包的偏移量和数据长度之和,是否大于第一数组的数组长度;如果所述有效数据包的偏移量和数据长度之和,大于第一数组的数组长度,则进入第一新数组创建模块;

第一新数组创建模块,适于创建一个新的第一数组,所述新的第一数组的数组长度超过原来的第一数组第一阈值;

第一复制存储模块,适于将原来的第一数组中存储的数据复制到新的第一数组中,并将未存储过的有效数据包的有效数据存储至新的第一数组中。

可选地,在所述计算模块之后,还包括:

第二判断模块,适于当所述有效数据包属于服务器,则判断所述有效数据包的偏移量和数据长度之和,是否大于第二数组的数组长度;如果所述有 效数据包的偏移量和数据长度之和,大于第二数组的数组长度,则进入第二新数组创建模块;

第二新数组创建模块,适于创建一个新的第二数组,所述新的第二数组的数组长度超过原来的第二数组第一阈值;

第二复制存储模块,适于将原来的第二数组中存储的数据复制到新的第二数组中,并将未存储过的有效数据包的有效数据存储至新的第二数组中。

可选地,还包括:

第一释放模块,适于在将原来的第一数组中存储的数据复制到新的第一数组中之后,将原来的第一数组释放。

可选地,还包括:

第二释放模块,适于在将原来的第二数组中存储的数据复制到新的第二数组中之后,将原来的第二数组释放。

可选地,在所述第一创建模块之前,还包括:

syn包判断模块,适于当接收到syn包时,判断所述syn包是来自客户端还来自服务器;如果syn包是来自客户端,则进入第一记录模块;如果syn包是来自服务器,则进入第二记录模块;

第一记录模块,适于记录客户端的初始序列号isn(c);

第二记录模块,适于记录服务器的初始序列号isn(s)。

可选地,所述第一创建模块,包括:

第一内存创建子模块,适于针对一tcp连接,在内存中创建属于客户端的第一数组,和/或属于服务器的第二数组。

可选地,所述输出模块,包括:

第一输出子模块,适于当在所述tcp连接下接收到任一个非指示关闭连接的数据包后,判断出所述tcp连接的空闲时间超过第一时间周期,则结束所述tcp连接,输出第一数组中的数据;

和/或,第二输出子模块,适于当在所述tcp连接下接收到指示关闭连接的数据包后,判断出所述tcp连接的空闲时间超过第二时间周期,则结束所述tcp连接,输出第一数组中的数据。

可选地,所述第一存储模块,包括:

第一重叠判断子模块,适于根据所述有效数据包的偏移量和数据长度,判断所述有效数据包的有效数据与第一数组的有效数据的重叠情况;

第一丢弃子模块,适于如果第一数组中存在与所述有效数据包全部重叠的有效数据,则将所述有效数据包中重叠部分的有效数据丢弃;

第一丢弃存储子模块,适于如果第一数组中存在与所述有效数据部分重叠的有效数据,将所述有效数据包中重叠部分的有效数据丢弃,并计算不重叠部分的有效数据的第一偏移量和第一数据长度,再将不重叠部分的有效数据在第一数组的第一偏移量位置开始存储,直至存储长度为所述第一数据长度;

第一存储子模块,适于如果第一数组中不存在与所述有效数据全部重叠的有效数据,则将所述有效数据包的有效数据在第一数组的偏移量位置开始存储,直至存储长度为所述数据长度。

可选地,所述第二存储模块,包括:

第二重叠判断子模块,适于根据所述有效数据包的偏移量和数据长度,判断所述有效数据包的有效数据与第二数组的有效数据的重叠情况;

第二丢弃子模块,适于如果第二数组中存在与所述有效数据包全部重叠的有效数据,则将所述有效数据包中重叠部分的有效数据丢弃,

第二丢弃存储子模块,适于如果第二数组中存在与所述有效数据部分重叠的有效数据,将所述有效数据包中重叠部分的有效数据丢弃,并计算不重叠部分的有效数据的第二偏移量和第二数据长度,再将不重叠部分的有效数据在第二数组的第二偏移量位置开始存储,直至存储长度为所述第二数据长度;

第二丢弃存储子模块,适于如果第二数组中不存在与所述有效数据全部重叠的有效数据,则将所述有效数据包的有效数据在第二数组的偏移量位置开始存储,直至存储长度为所述数据长度。

可选地,还包括:

输出模块,适于在当前tcp连接结束后,输出第一数组和/或第二数组 中的数据。

本申请实施例包括以下优点:

本申请实施例,针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组,然后针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度,进一步根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组存储。本申请简化了流重组过程中的判断逻辑以及运算过程,从而有效降低了现有tcp流重组方法的复杂度,提高了流重组的效率,更容易满足系统性能方面的需求。

附图说明

图1是本申请的一种tcp流重组方法实施例的步骤流程图;

图1a是本申请的一种tcp连接从开始建立过程到连接关闭的状态变化示意图;

图1b是本申请的一种延迟分配内存的方法示意图;

图1c是本申请的一种将多个有效数据包的有效数据存储至第一数组的相应位置的过程示意图;

图2是本申请的一种tcp流重组方法实施例的步骤流程图;

图2a是本申请的一种tcp数据包结构示意图;

图3是本申请的一种tcp流重组方法实施例的步骤流程图;

图4是本申请的一种tcp流重组方法实施例的步骤流程图;

图5是本申请的一种tcp流重组装置实施例的结构框图;

图6是本申请的一种tcp流重组装置实施例的结构框图;

图7是本申请的一种tcp流重组装置实施例的结构框图;

图8是本申请的一种tcp流重组装置实施例的结构框图。

具体实施方式

为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图 和具体实施方式对本申请作进一步详细的说明。

本申请实施例的核心构思之一在于,针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组,然后针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度,进一步根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组存储,在当前tcp连接结束后,输出第一数组和/或第二数组中的数据。本申请简化了流重组过程中的判断逻辑以及运算过程,从而有效降低了现有tcp流重组方法的复杂度,提高了流重组的效率,更容易满足系统性能方面的需求。

实施例一

参照图1,示出了本申请的一种tcp流重组方法实施例的步骤流程图,具体可以包括如下步骤:

步骤110,针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组。

tcp(transmissioncontrolprotocol,传输控制协议)是一种面向连接的,基于字节流的运输层通信协议。tcp保证了传送数据包的顺序。顺序是用一个序列号来保证的。响应包内也包括一个序列号,表示接收方准备好这个序列号的包。在tcp传送一个数据包时,它会把这个数据包放入重发队列中,同时启动计时器,如果收到了关于这个包的确认信息,便将此数据包从队列中删除,如果在计时器超时的时候仍然没有收到确认信息,则需要重新发送该数据包。另外,tcp通过数据分段中的序列号来保证所有传输的数据可以按照正常的顺序进行重组,从而保障数据传输的完整。tcp连接具有请求和返回两个对应的方向,每个tcp包具有tcp序列号(sequencenumber)、tcp确认号(acknowledgmentnumber)及数据包长度(len)等参数。tcp是一种可靠的面向连接的协议。

其中,tcp序列号为32位,表示数据流中的字节数。是tcp协议中首字节在整个数据流中的位置。

tcp确认号为32位,tcp协议中用于表示序号为确认号减去1的数据包及其以前的所有数据包已经正确接收,对应于期望收到的下一个序列号。

如图1a为tcp连接从开始建立过程到连接关闭的状态变化示意图。在实际应用中,tcp建立连接,首先需要经过“三次握手”的过程。这里以客户端向服务器发起连接来说明,具体步骤如下:

第一次握手:客户端向服务器发送一个同步数据包(syn,synchronous)请求建立连接,该数据包中,初始序列号(initialsequencenumber,isn)是客户端随机产生的一个值,确认号是0;其中,初始序列号为32位,是tcp建立连接阶段的初始序列号。

第二次握手:服务器收到这个同步请求数据包后,会对客户端进行一个同步确认。这个同步确认数据包中,序列号(sequencenumber,sn)是服务器随机产生的一个值,确认号是客户端的初始序列号+1;

第三次握手:客户端收到这个同步确认数据包后,再对服务器进行一个确认。该数据包中,序列号是上一个同步请求数据包中的确认号值,确认号是服务器的初始序列号+1。

完成三次握手后,客户端与服务器可以开始传送数据。

在tcp建立连接后,就可以开始传输数据了。tcp工作在全双工模式,它可以同时进行双向数据传输。这里为了简化,我们只谈服务器向客户端发送数据的情况,而客户端向服务器发送数据的原理和它是类似的,这里便不重复说明。

服务器向客户端发送一个数据包后,客户端收到这个数据包后,会向服务器发送一个确认数据包。

传输数据的简要过程如下:

1)发送数据:服务器向客户端发送一个带有数据的数据包,该数据包中的序列号和确认号与建立连接第三步的数据包中的序列号和确认号相同;

2)确认收到:客户端收到该数据包,向服务器发送一个确认数据包,该数据包中,序列号是为上一个数据包中的确认号值,而确认号为服务器发送的上一个数据包中的序列号+所该数据包中所带数据的大小。

数据分段中的序列号可以保证所有传输的数据按照正常的次序进行重组,而且通过确认保证数据传输的完整性。

前面我们提到,建立一个连接需要3个步骤,但是关闭一个连接需要经过4个步骤。因为tcp连接是全双工的工作模式,所以每个方向上需要单独关闭。在tcp关闭连接时,首先关闭的一方(即发送第一个终止数据包的)将执行主动关闭,而另一方(收到这个终止数据包的)再执行被动关闭。关闭连接的4个步骤如下:

1、服务器完成它的数据发送任务后,会主动向客户端发送一个终止(fin)数据包,以关闭在这个方向上的tcp连接。该数据包中,序列号为客户端发送的上一个数据包中的确认号值,而确认号为服务器发送的上一个数据包中的序列号+该数据包所带的数据的大小;

2、客户端收到服务器发送的终止数据包后,将对服务器发送确认信息,以关闭该方向上的tcp连接。这时的数据包中,序列号为第1步中的确认号值,而确认号为第1步的数据包中的序列号+1;

3、同理,客户端完成它的数据发送任务后,就也会向服务器发送一个终止数据包,以关闭在这个方向上的tcp连接,该数据包中,序列号为服务器发送的上一个数据包中的确认号值,而确认号为客户端发送的上一个数据包中的序列号+该数据包所带数据的大小;

4、服务器收到客户端发送的终止数据包后,将对客户端发送确认信息,以关闭该方向上的tcp连接。这时在数据包中,序列号为第3步中的确认号值,而确认号为第3步数据包中的序列号+1;

在本申请实施例中,服务器侧会针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组,用以重组在连接中传输的数据包中的数据。其中,第一数组的大小可以根据需求灵活设定,对此本申请不加以限定;可以在任何可以创建数组的存储空间中创建第一数组和/或第二数组,例如内存、云存储空间等。

在实际应用中,针对一tcp连接,客户端与服务器之间是可以互相通信的,因此客户端可以发送数据包,服务器也可以向客户端响应的数据包, 此时,若要针对该tcp连接进行数据流重组,可以分别将来自客户端的数据流重组和/或来自服务器的数据流重组。如果要同时针对一tcp连接下客户端发送的数据包重组,以及服务器为客户端响应的数据包重组,则分别创建属于客户端的第一数组,和属于服务器的第二数组,其中第一数组用以重组来自客户端的数据流,第二数组用以重组来自服务器的数据流。比如,如果只需要针对一tcp连接下客户端发送的数据包进行重组,则此时只需在内容中创建属于客户端的第一数组;如果只需要针对一tcp连接下服务器为客户端响应的数据包重组,则此时只需在内容中创建属于服务器的第二数组。具体地,可以根据实际需求,创建属于客户端的第一数组,和/或属于服务器的第二数组,对此本申请实施例不加以限定。

在本申请实施例中,针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组的过程中,可以在新建连接的过程中创建第一数组,和/或第二数组,也可以在连接创建之后,再创建第一数组和/或第二数组。本申请可以根据实际设置选择创建时机。

在本申请的另一个优选地实施例中,所述步骤110,包括:

子步骤a111,在所述tcp连接建立成功之后,创建属于客户端的第一数组,和/或属于服务器的第二数组。

如图1b为延迟分配内存的方法示意图。此时,是在tcp连接建立成功之后,再创建属于客户端的第一数组,和/或属于服务器的第二数组,相对于在tcp连接还未成功建立之前,在创建属于客户端的第一数组,和/或属于服务器的第二数组,延迟了创建用以进行数据流重组的第一数组和/或第二数组。

在实际应用中,若是在tcp连接建立过程中,例如在服务器接收到客户端发送的syn包时,就创建第一数组和/或第二数组,那么,如果此时受到synflood(拒绝服务)攻击,即黑客发送大量的syn包,则相应地,会创建大量的第一数组和/或第二数组,从而耗费大量的系统内存,影响系统的正常运行。

所以,在本申请中,可以延迟创建第一数组和/或第二数组,即在tcp 连接建立成功之后,再创建属于客户端的第一数组,和/或属于服务器的第二数组。从而可以有效地避免上述的问题。

另外,在本申请实施例中,第一数组可以为普通数组,在创建时即确定数组的大小,也可以为动态数组,所谓动态数组,是指在创建时没有确定数组大小的数组,当使用该动态数组时,可随时用函数重新定义该动态数组的大小。

在本申请的另一个优选地实施例中,所述步骤110,包括:

子步骤b111,针对一tcp连接,在内存中创建属于客户端的第一数组,和/或属于服务器的第二数组。

在本申请实施例中,为了方便将客户端和/或服务器的有效数据包快速地发送至第一数组和/或第二数组,可以直接在服务器的内存中创建属于客户端的第一数组,和/或属于服务器的第二数组。

步骤120,针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度。

其中,tcp载荷是指tcp数据包中除去tcp报头信息以外的部分。载荷数据是变长字段,它包含下一个头字段描述的数据。有效载荷数据字段是强制性的,它的长度是字节的整数倍。该有效数据包还是tcp包。

在发明实施例中,若数据包含有tcp载荷,则说明该数据包为有效数据包。

在本申请实施例中,有效数据包的偏移量(offset)为该有效数据包的序列号与前述的syn数据包的初始序列号加1的差值,即该有效数据包与syn数据包之间的距离。因为一个初始序列号将占用一个序号,所以要加1。数据长度(length,len)是指有效数据包中的数据所占内存的空间,一般以字节(byte)为单位。

另外,在本申请实施例中,可以采用现有的任何一种可用技术计算有效数据包的数据长度,对此,本申请实施例不加以限定。

步骤130,当所述有效数据包属于客户端时,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组 存储。

在本申请实施例中,有效数据包属于客户端是指该有效数据包是由客户端发送的有效数据包。当所述有效数据包属于客户端时,可以根据有效数据包的偏移量以及和数据长度,在第一数组中查找用以存储该有效数据包中的有效数据的存储空间,然后按照一定顺序将有效数据包中的有效数据存储至第一数组的相应偏移量和数据长度的位置。其中,可以按照各有效数据在对应有效数据包中的存储顺序,也可以按照相反的顺序或者其他设定的顺序,将效数据包中的有效数据存储至第一数组的相应偏移量和数据长度的位置,对此,本申请实施例不加以限定。

例如,假设第一数组的长度为20,存储空间位置为1-20,当前接收到的一个有效数据包的偏移量为5,数据长度为10。则会将该有效数据包中的有效数据存储于第一数组中的选择6-15的存储空间位置,也即从存储空间位置6开始存储该有效数据,一直存储到存储空间位置15,则该数据包的有效数据存储完毕。

在实际应用中,根据各有效数据包的偏移量以及数据长度,可以将各有效数据包分为三类:按序到达的有效数据包,提前到达的有效数据包、重叠的有效数据包,其中重叠的有效数据包同时可能为按序到达的有效数据包或提前到达的有效数据包。其中,假设当前已到达的有序数据包已经存储到数组的第n个元素,按序到达的有效数据包是指偏移量等于n+1的有效数据包;提前到达的有效数据包是指指偏移量大于n+1的有效数据包;重叠的有效数据包是指其数据在第一数组中的位置与已经存储于第一数组的数据有重合的部分的有效数据包。

在本申请实施例中,无论按序到达,提前到达,重叠,都可以首先计算到达包的偏移位置(offset)和长度(len),然后将有效数据包的数据存储到第一数组对应的位置。

如图1c为针对6个不同有效数据包(case1、case2、case3、case4、case5、case6),将各有效数据包的有效数据存储至第一数组的相应位置的过程。其中case1、case2是按序到达第一数组的有效数据包,case5是提前到达第一 数组的有效数据包,case3、case4、case6是重叠的有效数据包。

在第一个带载荷数据包到达之前,即第一个有效数据包到达之前,第一数组的数组空间未开辟。

在case1的情况下:第一个带载荷包到达,即第一个有效数据包到达,则此时开辟第一数组的数组空间,该第一个有效数据包的有效数据的偏移值offset=0,长度len=100,则从第一数组的数组空间的0偏移位置开始按序存储该有效数据,存储到偏移99的位置,则该第一数组的有效数据包重组完毕。

在case2的情况下,第二个有效数据包按序到达,此时的第一数组中存储了case1中的第一个有效数据包的有效数据。第二个有效数据包的偏移offset=100,长度len=100,那么则查找第一数组的偏移100的位置,找到之后,则在第一数组的偏移100位置开始将第二个有效数据包的有效数据按序存储,一直存储到偏移199的位置,则第二个有效数据包的有效数据重组完毕。

在case3的情况下,接收到了第三个有效数据包,但是该数据包的偏移offset=50,长度len=100,由于case1第一个有效数据包的偏移offset=0,长度len=100,第二个有效数据包的偏移offset=100,长度len=100,那么该第三个数据包的有效数据在前两个有效数据包的有效数据之内。那么找到第一个数据包的偏移50的位置开始,将第一个有效数据包的有效数据按序进行覆盖,直到偏移149的位置,则该有效数据包的有效数据重组完毕。

在case4的情况下,第四个有效数据包按序到达,但是该有效数据包的偏移offset=150,长度len=100,由于第二个有效数据包的偏移offset=100,长度len=100,那么该第四个有效数据包与第二个有效数据包由重叠的部分,此时从第二个数据包的偏移150的位置开始,利用第四个有效数据包将第二个有效数据包的有效数据按序进行覆盖,直到偏移199的位置,然后继续从偏移200的位置开始,将第四个有效数据包剩下的部分按序存储,直到偏移249的位置,则该有效数据包的有效数据重组完毕。

在case5的情况下,第五个有效数据包到达,该有效数据包的偏移 offset=300,长度len=100,可见其偏移量大于之前接收到的任一个有效数据包的偏移量与长度之和,即其不与接收到有效数据包相连,是提前到达的数据包,此时直接从偏移300的位置开始,按序存储第五有效数据包,直到偏移399的位置为止,则该有效数据包的有效数据重组完毕。

在case6的情况下,第七个有效数据包到达,该有效数据包的偏移offset=450,长度len=100,在其之前已经接收到偏移offset=500,长度len=100的第六个有效数据包,可见第七个有效数据包的偏移小于第六个有效数据包的偏移,但是两者之间的差值小于第七个有效数据包的长度,所以第七个有效数据包和第六个有效数据包存在重叠的部分,此时从偏移450的位置开始将第七个有效数据包不与第六个有效数据包不重叠的部分按序存储,直到偏移499的位置结束,然后从偏移500的位置开始,利用第七个数据包还未存储的部分将第六个有效数据包按序进行覆盖,直至偏移549的位置结束,则该有效数据包的有效数据重组完毕。

可以看出,即使两个有效数据包对应的在第一数组中的位置有重叠的部分,仍然会按照两个有效数据包到达的顺序分别将两个有效数据包中的有效数据存储至第一数组对应的位置,对于其中重叠的部分,后存储的有效数据可以覆盖之前存储的有效数据。从而保证对于重复接收到的数据,在第一数组中不会重复存储。

可以理解,对于不同类型的case的情况下,对有效数据包都可以无需判断是否有重复的部分,可以直接按照偏移量和长度将各有效数据包中的有效数据存储至第一数组,从而更节省计算量,提高流重组的效率。

但是,对于重叠到达的有效数据包,也可以将重叠到达的有效数据包中重叠的有效数据直接丢弃,然后按照其中未重叠的有效数据的偏移量和长度,将重叠到达的有效数据包中未重叠的有效数据存储至第一数组,本申请实施例不加以限定。相对于直接将重叠到达的有效数据包的全部有效数据存储至第一数组,若需要判断重叠到达的有效数据包具体的重叠情况,然后相应地丢弃或存储,计算量会稍大一点。

优选地,在本申请另一个优选的实施例中,步骤130包括:

子步骤131,根据所述有效数据包的偏移量和数据长度,判断所述有效数据包的有效数据与第一数组的有效数据的重叠情况。

如前述,在实际应用中,还未存储至第一数组的有效数据包可能会与第一数组中的有效数组有重叠,而且对于有重叠的有效数据包,根据具体的重叠部分,又可以分为全部重叠和部分重叠。其中,全部重叠是指有效数据包中的有效数据对应在第一数组中的存储空间已经全部存储过有效数据,例如图1c中的有效数据包case3;部分重叠是指有效数据包中的有效数据对应在第一数组中的部分存储空间已经存储过有效数据,例如图1c中的有效数据包case6。对于不重叠的有效数据包、全部重叠的有效数据包以及部分重叠的有效数据包,本申请实施例只需要将其中未存储至第一数组的有效数据存储至第一数组。因此,首先需要根据有效数据包的偏移量和数据长度,判断所述有效数据包的有效数据与第一数组的有效数据的重叠情况。

子步骤132,如果第一数组中存在与所述有效数据包全部重叠的有效数据,则将所述有效数据包中重叠部分的有效数据丢弃。

如果第一数组中存在与有效数据包全部重叠的有效数据,说明第一数组中对应该有效数据包的存储空间已经存有该有效数据包中的有效数据,则不需要将有效数据包中的有效数据再次存储至对应存储空间,因此可以直接将有效数据包中重叠部分的有效数据丢弃,也即可以直接将该有效数据包丢弃。例如,对于图1c中的有效数据包case3,则可以将其直接丢弃。

子步骤133,如果第一数组中存在与所述有效数据部分重叠的有效数据,将所述有效数据包中重叠部分的有效数据丢弃,并计算不重叠部分的有效数据的第一偏移量和第一数据长度,再将不重叠部分的有效数据在第一数组的第一偏移量位置开始存储,直至存储长度为所述第一数据长度。

如果第一数组中存在与有效数据包部分重叠的有效数据,说明第一数组中对应该有效数据包的存储空间中的部分存储空间已经存有该有效数据包中的对应的部分有效数据,那么对于重叠部分的有效数据,则不需要将重叠部分的有效数据再次存储至对应存储空间,可以直接将有效数据包中的重叠部分的有效数据丢弃;而对于不重叠的有效数据,仍需要按照不重叠的有效 数据的偏移量和数据长度,将其存储至第一数组对应存储空间。

例如,对于图1c中的有效数据包case6,偏移量offset=450,数据长度len=100。此时,第一数组中偏移0到偏移249、偏移300到偏移399、偏移500到偏移599的存储空间位置已经存储数据,可以看出,对于case6而言,其对应偏移500至偏移549存储空间位置的有效数据已经存在于之前的有效数据包中,被存储至第一数值,对于此部分重叠的有效数据,可以直接丢弃;而对于另外的对应偏移450至499的存储空间位置的有效数据,则可以按照此不重叠部分的有效数据的偏移量和数据长度,按序依次将其存储至第一数组对应存储空间。

子步骤134,如果第一数组中不存在与所述有效数据重叠的有效数据,则将所述有效数据包的有效数据在第一数组的偏移量位置开始存储,直至存储长度为所述数据长度。

而如果第一数组中不存在与所述有效数据重叠的有效数据,例如图1c中的有效数据包case1、case2、case5,则可以直接将有效数据包的有效数据在第一数组的对应有效数据包的偏移量位置开始存储,直至存储长度为所述数据长度。

步骤140,当所述有效数据包属于服务器时,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于服务器的第二数组存储。

本步骤是针对将服务器侧有效数据包中的有效数据向属于服务器的第二数组存储,与前述的步骤130类似,在此不再赘述。其中,有效数据包属于服务器,是指该有效数据包是由服务器响应的有效数据包。

在本申请的另一个优选地实施例中,步骤140,包括:

子步骤141,根据所述有效数据包的偏移量和数据长度,判断所述有效数据包的有效数据与第二数组的有效数据的重叠情况。

子步骤142,如果第二数组中存在与所述有效数据包全部重叠的有效数据,则将所述有效数据包中重叠部分的有效数据丢弃。

子步骤143,如果第二数组中存在与所述有效数据部分重叠的有效数 据,将所述有效数据包中重叠部分的有效数据丢弃,并计算不重叠部分的有效数据的第二偏移量和第二数据长度,再将不重叠部分的有效数据在第二数组的第二偏移量位置开始存储,直至存储长度为所述第二数据长度。

子步骤144,如果第二数组中不存在与所述有效数据重叠的有效数据,则将所述有效数据包的有效数据在第二数组的偏移量位置开始存储,直至存储长度为所述数据长度。

子步骤141至子步骤14是针对将服务器侧有效数据包中的有效数据向属于服务器的第二数组存储,与前述的子步骤131至子步骤134类似,在此不再赘述。

在本申请另一个优选地实施例中,在步骤130、步骤140之后,还包括:

步骤150,在当前tcp连接结束后,输出第一数组和/或第二数组中的数据。

在本申请实施例中,经过前述步骤110-140之后,第一数组和/或第二数组中的数据已经是完成流重组的流数据,因此在输出第一数组和/或第二数组中的数据的过程中,只需要将第一数组和/或第二数组的首地址和数据长度传递出来,即可以依次获取第一数组和/或第二数组中的流数据。

其中tcp连接结束判断的主要依据是tcp流正常结束(如步骤110中所述的tcp关闭连接)、被rst(tcp首部中的6个标志比特之一,表示重置连接、复位连接)中断或者链接超时释放三种情况。

在本申请实施例中,对于上述三种方式导致的tcp连接结束的情况,都可以输出第一数组和/或第二数组中的数据。当然,也可以根据需求设定只在上述的三种方式中的任意一种或多种方式导致的tcp连接结束的情况下,输出第一数组和/或第二数组中的数据,对此,本申请实施例不加以限定。

在本申请实施例中,首先针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组,然后针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度,进一步根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组存储。简化了流重组过程中的判断逻辑以及运算过程,从 而有效降低了现有tcp流重组方法的复杂度,提高了流重组的效率,更容易满足系统性能方面的需求。

另外,在本申请又一个优选地实施例中,在tcp连接建立成功之后,再创建属于客户端的第一数组,和/或属于服务器的第二数组,从而可以有效地避免因为受到synflood(拒绝服务)攻击,而耗费大量的系统内存,影响系统的正常运行的问题。

实施例二

本申请实施例对客户端发送的数据包的重组过程进行介绍。

参照图2,示出了本申请的一种tcp流重组方法实施例的步骤流程图,具体可以包括如下步骤:

步骤208,当接收到syn包时,判断所述syn包是来自客户端还来自服务器;如果syn包是来自客户端,则进入步骤210;

步骤210记录客户端的初始序列号isn(c)。

当然,记录了客户端的isn(c)后,可以计算第一纠偏值isn(c)+1。如果syn包是来自服务器,可以不处理。

在实际应用中,tcp是面向连接的传输协议,即在利用tcp进行数据传输之前,必须首先建立连接关系。如实施例一步骤110中所述的客户端与服务器之间,tcp连接的第一次握手过程,是客户端先发送syn包至服务器。然后服务器返回一个syn包和ack包。

当然,实际应用中对于第一纠偏值,可以在如图1b的过程中,在收到客户端的ack包时,直接从ack包中提取isn(c)+1作为纠偏值。也可以在收到第一个客户端的有效数据包时,从该有效数据包中提取tcp序列号isn(c)+1作为第一纠偏值。

步骤212,在接收所述tcp连接的属于客户端的数据包时,判断所接收到的数据包是否为含有tcp载荷的有效数据包;如果所接收到的数据包是含有tcp载荷的有效数据包,则进入步骤214。

在实际应用中,对于tcp连接下,接收到的数据包,其中包括含有tcp载荷的数据包,不含有tcp载荷数据包。其中,含有tcp载荷的数据包, 称为有效数据包,而对于本申请而言,针对的是含有tcp载荷的有效数据包的流重组,所以,在本申请实施例中,在接收tcp连接的数据包时,会判断所接收到的数据包是否为含有tcp载荷的有效数据包;如果所接收到的数据包是含有tcp载荷的有效数据包,则继续执行后续的步骤,而若接收到的数据包不是含有tcp载荷的有效数据包,则可以忽略本数据。

步骤214,判断所述有效数据包是否为第一个有效数据包;如果所述有效数据包是第一个有效数据包,则进入步骤216。

在本申请实施例中,在一次tcp建立连接到结束连接的过程中,接收到客户端侧的数据包,可以分为以下四种情况:1)建立连接的syn包;2)第一个含有tcp载荷的数据包;3)其他含有tcp载荷的数据包;4)终止连接的fin/rst包。

其中,若接收到的有效数据包是第一个含有tcp载荷的数据包,即第一个有效数据包,则此时需要创建第一数组,存储该有效数据包中的有效数据,从而在本次tcp连接,对于以后接收到的其他含有tcp载荷的数据包,将其中的有效数据都存储于该以创建的第一数组中。而对于建立连接的syn包,其作用只是为了建立tcp连接,其中的数据并不是必须要存储于第一数组中,所以若接收的数据包是建立连接的tcp包,此时并不需要创建第一数组,同样对于终止连接的fin/rst包,也不需要创建第一数组。

步骤218,创建属于客户端的第一数组。

本申请实施例是针对客户端侧的数据包,进行数据流重组。所以,此时可以只需创建属于客户端的第一分组,用以存储来自客户端的有效数据包中的有效数据。

在本申请实施例中,若接收的客户端的数据包是第一个有效数据包,则创建第一数组,此时是创建第一数组的最佳时机。但是需要说明的是,第一数组并不是必须在接收到第一个有效数据包之后才可以创建的,其也可以在本步骤之前的任一步骤之前预先创建,对此本申请实施例不加以限定。

步骤220,计算所述有效数据包中有效数据的长度作为数据长度。

如图3所示tcp数据包的结构示意图。其中红色框中部分加上可选选 项、填充可以认为是tcp报头信息,用户数据则可认为是tcp载荷,而用户数据中的数据部分可认为是本申请所述的有效数据。

在本申请实施例中,有效数据包中有效数据的长度为数据长度。在实际应用中,有效数据包中的有效数据可能为多种数据结构,此时需要针对性地利用不同的方法计算有效数据的长度。在本申请实施例中,可以利用任何一种现有的可利用技术计算有效数据包中有效数据的长度,对此本申请实施例不加以限定。

步骤222,根据有效数据包的tcp序列号和预先记录的第一纠偏值之差,确定所述有效数据包的偏移量;所述第一纠偏值为属于客户端的syn包的初始序列号+1。

在本申请实施例中,可以设定有效数据的偏移量为有效数据包的tcp序列号和第一纠偏值之差。其中tcp序列号是已知的,存储于tcp数据包中,即为图2a中的数据序号。第一纠偏值为syn包的初始序列号加1,因为一个初始序列号将占用一个序号,所以要加1。其中初始序列号(isn(c))随时间而变化的,而且不同的操作系统也会有不同的实现方式,所以每个连接的初始序列号是不同的。如实施例一所述的tcp连接过程可知,第一纠偏值在tcp连接过程中即可获得并预先记录。

由tcp建立连接的过程可知,客户端发送syn包给服务器时,会在syn包中写入一个初始序列号,其中在本申请中,客户端发送的syn包可以称为属于客户端的syn包,然后服务器返回syn/ack包,服务器的syn/ack包实际上是一个syn包,此时服务器会将客户端的syn的isn(c)+1作为确定序列号返回客户端,同时服务器的响应的syn包中也会有一个服务器的初始序列号isn(s)。客户端在发送ack时会携带客户端的syn的isn(c)+1的序列号以及isn(s)+1返回服务器,然后建立连接。建立连接成功后,则客户端会开始进行数据传输,有效数据包则中则会在tcp序列号中以isn(c)+1为开始字节,记录客户端发送的字节数,每发送一个有效数据包,则在tcp序列号中记录该次发送的有效数据的开头字节。服务器开始响应有效数据包时,则会在有效数据包中以isn(s)+1为开始字节, 记录服务器响应的字节数,每发送一个有效数据包,则在tcp序列号中记录该次发送的有效数据的开头字节。

因此,本申请实施例如果要对客户端的数据包重组,则可以在接收到客户端发送的syn数据包时,获取syn包中的isn(c),然后计算第一纠偏差值isn(c)+1并记录。或者在接收到客户端发送的ack数据包时,获取该ack包中的确认序列号isn(c)+1,并记录其为第一纠偏差值。或者在建立连接后,接收到的第一个有效数据包时,获取其tcp序列号,因为其是从第0字节开始发送数据,其应该也为isn(c)+1,可以记录为针对客户端的第一纠偏差值。

需要说明的是,在本申请实施例中步骤222也可以在步骤220之前执行,或者是与步骤220同时执行,对此本申请实施例不加以限定。

步骤224,判断所述有效数据包的偏移量和数据长度之和,是否大于第一数组的数组长度;如果所述有效数据包的偏移量和数据长度之和,大于第一数组的数组长度,则进入步骤226。

在本申请实施例中,因为有效数据包具有偏移量,所以在将接收到的有效数据包中的有效数据存储至第一数组之前,还需要考虑的是,当前的第一数组的数组长度是否足够存储接收到的有效数据。

例如,假设第一数组的长度为20,按序标号为1-20,接收到的有效数据包的偏移量为11,数据长度为10。则对于该有效数据包中的有效数据,会从第一数组中第12个位置开始记录,此时第一数组的长度只可以存储数据长度为9的有效数据,无法完整存储接收到的该偏移量为11,数据长度为10的有效数据包的有效数据。

所以,在本申请实施例中,会判断接收到的有效数据包的偏移量和数据长度之和,是否大于第一数组的数组长度,若有效数据包的偏移量和数据长度之和,大于第一数组的数组长度,则需要新建一个比原来的第一数组更长的第一数组;而若有效数据包的偏移量和数据长度之和,不大于第一数组的数组长度,则继续使用原来的第一数组,不需要新建第一数组。

步骤230,创建一个新的第一数组,所述新的第一数组的数组长度超过 原来的第一数组第一阈值。

由步骤224所述,创建的新的第一数组的数组长度必然要超过原来的第一数组。在本申请实施例中,设定新的第一数组的数组长度超过原来的第一数组的数组长度第一阈值。其中第一阈值可以为原来的第一数组的数组长度的整数倍,例如,原来的第一数组的数组长度为20,创建的新的第一数组的数组长度为40,此时新的第一数组的数组长度超过原来的第一数组的数组长度20,即为此时的第一阈值,该第一阈值为原来的第一数组的数组长度的1倍。当然第一阈值也可以为其他取值,可以根据需求灵活设定,对此本申请实施例不加以限定。

另外,若原来的第一数组为前述的动态数组,则此时可以不另外创建一个新的第一数组,而可以利用函数(如redim函数)重新指出原来的第一数组的大小,将其数组长度修改为超过其原来数组长度第一阈值。此时相对于原来数组长度的第一数组,可以称修改过数据长度的第一数组为新的第一数组。

步骤226,将原来的第一数组中存储的数据复制到新的第一数组中,并将未存储过的有效数据包的有效数据存储至新的第一数组中。

为了保证重组数据的完整性,在本申请实施例中,在创建了新的第一数组后,会将原来的第一数组中存储的数据复制到新的第一数组中,然后继续利用该新的第一数组,存储接收到的还未存储过的有效数据包的有效数据。

其中,将原来的第一数组中存储的数据复制到新的第一数组中,可以理解为,保持第一数组中存储的数据所属的有效数据包的偏移量和数据长度不变,将其相应地存储于新的第一数组中。

另外,若该新的第一数组为步骤230中所述的修改了数组长度的动态数组,则此时不需要复制的过程,直接继续将未存储过的有效数据包的有效数据存储至新的第一数组中。

步骤228,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组存储。

需要说明的是,若经过步骤230后创建一个新的第一数组,则针对接收 到的未存储的有效数据包,此时本步骤中的第一数组是指步骤230创建的新的第一数组。若未创建一个新的第一数组,则本步骤中的第一数组仍然为步骤218创建的第一数组。

在本申请另一个优选地实施例中,还包括:

步骤230,在当前tcp连接结束后,输出第一数组中的数据。

那么在当前tcp连接后,可以将内存的第一数组中的数据输出至指定存储空间,比如输出至硬盘中进行存储。

在本申请另一个优选的实施例中,在本申请实施例中,步骤230包括:

子步骤2301,当在所述tcp连接下接收到任一个非指示关闭连接的数据包后,判断出所述tcp连接的空闲时间超过第一时间周期,则结束所述tcp连接,输出第一数组中的数据。

在实际应用中,在tcp连接情况下,若接收到任一个非指示关闭连接的数据包后,在一定时间内都未执行任何操作,即tcp连接的空闲时间超过一定时间,则此时可判定结束当前的tcp连接。在本申请实施例中,设定tcp连接的空闲时间超过第一时间周期,则结束所述tcp连接。其中,第一时间周期可以根据需求灵活设定,对此本申请实施例不加以限定。

在tcp连接结束后,即将第一数组中的数据输出。同样,若经过步骤230后创建一个新的第一数组,则此时本步骤中的第一数组是指步骤230创建的新的第一数组。若未创建一个新的第一数组,则本步骤中的第一数组仍然为步骤216创建的第一数组。

而在tcp连接下,接收到任一个非指示关闭连接的数据包后,若判断出所述tcp连接的空闲时间未超过第一时间周期,则不结束tcp连接,此时也不会输出第一数组中的数据。

和/或,子步骤2302,当在所述tcp连接下接收到指示关闭连接的数据包后,判断出所述tcp连接的空闲时间超过第二时间周期,则结束所述tcp连接,输出第一数组中的数据。

还有另外一种情况,在tcp连接情况下,若接收到指示关闭连接的数据包后,判断出tcp连接的空闲时间超过第二时间周期,则结束tcp连接, 输出第一数组中的数据。而若tcp连接的空闲时间未超过第二时间周期,则不结束tcp连接,也不会输出第一数组中的数据。其中的第二时间周期也可以根据需求灵活设定,对比本申请实施例也不加以限定。而且,同样若经过步骤230后创建一个新的第一数组,则此时本步骤中的第一数组是指步骤230创建的新的第一数组。若未创建一个新的第一数组,则本步骤中的第一数组仍然为步骤216创建的第一数组。

另外,在本申请实施例中,也可以在tcp连接下接收到指示关闭连接的数据包后,直接结束tcp连接,输出第一数组中的数据,而不需要判断tcp连接的空闲时间是否超过第二时间周期,即相当于此时的第二时间周期为零。

在本申请一优选的实施例中,在本申请实施例中,还包括:

步骤232,在将原来的第一数组中存储的数据复制到新的第一数组中之后,将原来的第一数组释放。

在本申请实施例中,在将原来的第一数组中存储的数据复制到新的第一数组中之后,此时原来的第一数组就不再具有任何作用,此时为了避免占用内存,可以将原来的第一数组释放,例如删除第一数组。该步骤可以在步骤226之后执行,或者在步骤226之后的任一步骤之后执行,对此本申请实施例不加以限定。

另外,需要说明的是,若该新的第一数组为步骤230中所述的修改了数组长度的动态数组,则此时不需要将原来的第一数组释放。

本申请实施例是针对一tcp连接,对由客户端发送的有效数据包中的有效数据进行重组。具体执行过程为,首先针对一tcp连接,创建属于客户端的第一数组,然后针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度,进一步根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组存储。从而简化了对于客户端的流重组过程中的判断逻辑以及运算过程,从而有效降低了现有tcp流重组方法的复杂度,提高了流重组的效率,更容易满足系统性能方面的需求。

而且,在本申请实施例中,还会在接收到的有效数据包的偏置量和数据长度之和超出第一数组长度时,利用新的第一数组替换原有的第一数组。在保证流重组的效率的同时,提高了流重组的准确性,从而使其更容易满足系统性能方面的需求。

实施例三

本申请实施例对服务器响应的数据包的重组过程进行介绍。

参照图3,示出了本申请的一种tcp流重组方法实施例的步骤流程图,具体可以包括如下步骤:

步骤308,接收到syn包时,判断所述syn包是来自客户端还来自服务器;如果syn包是来自服务器,则进入步骤310。

步骤310,记录服务器的初始序列号isn(s);

当然,在记录了服务器的初始序列号isn(s)后,可以计算第二纠偏值isn(s)+1。

在本申请实施例中,如果syn包是来自客户端,可以不出来。

步骤312,在接收所述tcp连接的属于服务器的数据包时,判断所接收到的数据包是否为含有tcp载荷的有效数据包;如果所接收到的数据包是含有tcp载荷的有效数据包,则进入步骤312。

步骤314,判断所述有效数据包是否为第一个有效数据包;如果所述有效数据包是第一个有效数据包,则进入步骤314。

步骤316,创建属于服务器的第二数组。

本申请实施例是针对服务器侧的数据包,进行数据流重组。所以,此时可以只需创建属于服务器的第一分组,用以存储来自服务器的有效数据包中的有效数据。

步骤318,计算所述有效数据包中有效数据的长度作为数据长度。

步骤320,根据有效数据包的tcp序列号和预先记录的第二纠偏值之差,确定所述有效数据包的偏移量;所述第二纠偏值为属于服务器的syn包的初始序列号+1。

本申请实施例如果要对服务器的数据包重组,则可以在获取到服务器响 应的syn数据包时,获取syn包中的isn(s),然后计算第二纠偏差值isn(s)+1并记录。或者在接收到客户端发送的ack数据包时,获取该ack包中的确认序列号isn(s),并记录其为第二纠偏差值。或者在建立连接后,接收到的第一个服务器响应的有效数据包时,获取其tcp序列号,因为其是从第0字节开始发送数据,其应该也为isn(s)+1,可以记录为针对服务器的第二纠偏差值。

步骤322,判断所述有效数据包的偏移量和数据长度之和,是否大于第二数组的数组长度;如果所述有效数据包的偏移量和数据长度之和,大于第二数组的数组长度,则进入步骤324。

步骤324,创建一个新的第二数组,所述新的第二数组的数组长度超过原来的第一数组第二阈值。

步骤326,将原来的第二数组中存储的数据复制到新的第二数组中,并将未存储过的有效数据包的有效数据存储至新的第二数组中。

步骤328,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于服务器的第二数组存储。

在本申请另一个优选地实施例中,还包括:

步骤330,在当前tcp连接结束后,输出第二数组中的数据。

在本申请另一个优选地实施例中,还包括:

步骤332,在将原来的第二数组中存储的数据复制到新的第二数组中之后,将原来的第二数组释放。

本步骤可以在步骤326之后的任意时刻执行,对此本申请实施例不加以限定。

本申请实施例对服务器侧的有效数据包的重组原理与实施例二对客户端侧的数据包的重组原理基本类似,参照实施例一类似的步骤即可,在此不再详述。

本申请实施例是针对一tcp连接,对由服务器发送的有效数据包中的有效数据进行重组。具体执行过程为,首先针对一tcp连接,创建属于服务器的第二数组,然后针对所述tcp连接下的含有tcp载荷的有效数据包, 计算所述有效数据包的偏移量和数据长度,进一步根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于服务器的第二数组存储。从而简化了对于服务器侧的流重组过程中的判断逻辑以及运算过程,从而有效降低了现有tcp流重组方法的复杂度,提高了流重组的效率,更容易满足系统性能方面的需求。

而且,在本申请实施例中,还会在接收到的有效数据包的偏置量和数据长度之和超出第一数组长度时,利用新的第二数组替换原有的第二数组。在保证流重组的效率的同时,提高了流重组的准确性,从而使其更容易满足系统性能方面的需求。

实施例四

本实施例介绍同时对客户端的数据包和对服务器的数据包进行重组的一种优选的过程。

参照图4,示出了本申请的一种tcp流重组方法实施例的步骤流程图,具体可以包括如下步骤:

步骤410,当接收到syn包时,判断所述syn包是来自客户端还来自服务器;如果syn包是来自客户端,则进入步骤412;如果syn包是来自服务器,则进入步骤414;

步骤412,记录客户端的初始序列号isn(c);

步骤414,记录服务器的初始序列号isn(s)。

而且在实际应用中,客户端和服务器的初始序列号isn都是随机产生的,客户端的isn和服务器的初始序列号isn相同的可能性非常小。

所以,在本申请实施例中,对于接收到的syn包,先判断syn包是来自客户端发送还来自服务器,进而确定是记录客户端的初始序列号isn(c)还是服务器的初始序列号isn(s)。

结合图1b的描述,本申请实施例如果要对客户端的数据包重组,则可以在接收到客户端发送的syn数据包时,获取syn包中的isn(c),然后计算第一纠偏差值isn(c)+1并记录。或者在接收到客户端发送的ack数据包时,获取该ack包中的确认序列号isn(c)+1,并记录其为第一纠 偏差值。或者在建立连接后,接收到的第一个客户端的有效数据包时,获取其tcp序列号,因为其是从第0字节开始发送数据,其应该也为isn(c)+1,可以记录为针对客户端的第一纠偏差值。

本申请实施例如果要对服务器响应的数据包重组,则可以在获取到服务器响应的syn数据包时,获取服务器的syn包中的isn(s),然后计算第二纠偏差值isn(s)+1并记录。或者在接收到客户端发送的ack数据包时,获取该ack包中的确认序列号isn(s)+1,并记录其为第二纠偏差值。或者在建立连接后,接收到的服务器的第一个有效数据包时,获取其tcp序列号,因为其是从第0字节开始发送数据,其应该也为isn(s)+1,可以记录为针对客户端的第二纠偏差值。

步骤416,在获取到所述tcp连接的数据包时,判断所接收到的数据包是否为含有tcp载荷的有效数据包;如果所接收到的数据包是含有tcp载荷的有效数据包,则进入步骤418。

如果所接收到的数据包不是含有tcp载荷的有效数据包,则不进行处理。

步骤418,判断所述有效数据包是否为第一个有效数据包;如果所述有效数据包是第一个有效数据包,则进入步骤420。

步骤420,判断所述有效数据包是否属于客户端;如果所述有效数据包属于客户端,则进入步骤422;如果所述有效数据包属于服务器,则进入步骤424。

步骤422,创建属于客户端的第一数组。进入步骤426。

步骤424,创建属于服务器的第二数组。进入步骤426。

在本申请实施例中,在一次tcp建立连接到结束连接的过程中,接收到的数据包,可以分为以下四种情况:1)建立连接的syn包;2)第一个含有tcp载荷的数据包;3)其他含有tcp载荷的数据包;4)终止连接的fin/rst包。

其中,若接收到的有效数据包是第一个含有tcp载荷的数据包,即第一个有效数据包,则此时需要创建第一数组,存储该有效数据包中的有效数 据,从而在本次tcp连接,对于以后接收到的其他含有tcp载荷的数据包,将其中的有效数据都存储于该以创建的第一数组中。而对于建立连接的syn包,其作用只是为了建立tcp连接,其中的数据并不是必须要存储于第一数组中,所以若接收的数据包是建立连接的tcp包,此时并不需要创建第一数组,同样对于终止连接的fin/rst包,也不需要创建第一数组。

步骤426,计算所述有效数据包中有效数据的长度作为数据长度。根据有效数据包所属的客户端进入步骤428或者步骤430。

步骤428,当所述有效数据包属于客户端,则根据有效数据包的tcp序列号和预先记录的第一纠偏值之差,确定所述有效数据包的偏移量;所述第一纠偏值为属于客户端的syn包的初始序列号+1。进入步骤432。

本申请实施例如果要对客户端的数据包重组,则可以在接收到客户端发送的syn数据包时,获取syn包中的isn(c),然后计算第一纠偏差值isn(c)+1并记录。或者在接收到客户端发送的ack数据包时,获取该ack包中的确认序列号isn(c)+1,并记录其为第一纠偏差值。或者在建立连接后,接收到的第一个有效数据包时,获取其tcp序列号,因为其是从第0字节开始发送数据,其应该也为isn(c)+1,可以记录为针对客户端的第一纠偏差值。

本申请实施例如果要对服务器的数据包重组,则可以在获取到服务器响应的syn数据包时,获取syn包中的isn(s),然后计算第二纠偏差值isn(s)+1并记录。或者在接收到客户端发送的ack数据包时,获取该ack包中的确认序列号isn(s),并记录其为第二纠偏差值。或者在建立连接后,接收到的第一个服务器响应的有效数据包时,获取其tcp序列号,因为其是从第0字节开始发送数据,其应该也为isn(s)+1,可以记录为针对服务器的第二纠偏差值。

步骤430,当所述有效数据包属于服务器,则根据有效数据包的tcp序列号和预先记录的第二纠偏值之差,确定所述有效数据包的偏移量;所述第二纠偏值为属于服务器的syn包的初始序列号+1。进入步骤438。

步骤432,当所述有效数据包属于客户端,则判断所述有效数据包的偏 移量和数据长度之和,是否大于第一数组的数组长度;如果所述有效数据包的偏移量和数据长度之和,大于第一数组的数组长度,则进入步骤434,然后进入步骤436;如果所述有效数据包的偏移量和数据长度之和,不大于第一数组的数组长度,则进入步骤446。

步骤434,创建一个新的第一数组,所述新的第一数组的数组长度超过原来的第一数组第一阈值。

步骤436,将原来的第一数组中存储的数据复制到新的第一数组中,并将未存储过的有效数据包的有效数据存储至新的第一数组中。

步骤438,当所述有效数据包属于服务器,则判断所述有效数据包的偏移量和数据长度之和,是否大于第二数组的数组长度;如果所述有效数据包的偏移量和数据长度之和,大于第二数组的数组长度,则进入步骤440,然后进入步骤442;如果所述有效数据包的偏移量和数据长度之和,不大于第二数组的数组长度,则进入步骤448。

步骤440,创建一个新的第二数组,所述新的第二数组的数组长度超过原来的第一数组第二阈值。

步骤442,将原来的第二数组中存储的数据复制到新的第二数组中,并将未存储过的有效数据包的有效数据存储至新的第二数组中。

步骤446,当所述有效数据包属于客户端时,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组存储。

步骤448,当所述有效数据包属于服务器时,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于服务器的第二数组存储。

在本申请另一个优选地实施例中,还包括:

步骤450,在当前tcp连接结束后,输出第一数组和第二数组中的数据。

本申请实施例是针对一tcp连接,分别对由客户端和服务器发送的有效数据包中的有效数据进行重组。具体执行过程为,首先针对一tcp连接,创建属于客户端的第一数组,和属于服务器的第二数组,然后针对所述tcp 连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度,进一步根据所述有效数据包的偏移量和数据长度,将所述客户端的有效数据包中的有效数据存储至属于客户端的第二数组,将所述服务器的有效数据包中的有效数据存储至属于服务器的第二数组。从而实现了同时分别对于客户端以及服务器侧的数据流的重组,而且简化了对于客户端侧以及服务器侧的流重组过程中的判断逻辑以及运算过程,从而有效降低了现有tcp流重组方法的复杂度,提高了流重组的效率,更容易满足系统性能方面的需求。

而且,在本申请实施例中,在建立tcp连接时会判断接收到的syn包是来自客户端发送还来自服务器,进而决定记录客户端的初始序列号isn还是服务器的初始序列号isn;在接收tcp连接的数据包时,还会判断接收到的数据包种类,并且针对接收到的数据包的种类不同,执行不同的操作;同时还会分别在接收到的有效数据包的偏置量和数据长度之和超出第一数组和第二数组长度时,分别利用新的第一数组和第二数组替换原有的第一数组和第二数组。在保证流重组的效率的同时,提高了流重组的准确性,从而使其更容易满足系统性能方面的需求。

并且,是在tcp连接建立成功之后,再创建属于客户端的第一数组,和/或属于服务器的第二数组,相对于在tcp连接还未成功建立之前,在创建属于客户端的第一数组,和属于服务器的第二数组,延迟了创建用以进行数据流重组的第一数组和第二数组。可以有效避免synflood(拒绝服务)攻击导致的资源被耗用过度的问题。

需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请实施例并不受所描述的动作顺序的限制,因为依据本申请实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本申请实施例所必须的。

实施例五

参照图5,示出了本申请的一种tcp流重组装置实施例的结构框图,具 体可以包括如下模块:

第一创建模块510,适于针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组。

在本申请另一个优选地实施例中,所述第一创建模块510,包括:

第一创建子模块,适于在所述tcp连接建立成功之后,创建属于客户端的第一数组,和/或属于服务器的第二数组。

在本申请另一个优选地实施例中,所述第一创建模块510,包括:

第一内存创建子模块,适于针对一tcp连接,在内存中创建属于客户端的第一数组,和/或属于服务器的第二数组。

计算模块520,适于针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度。

第一存储模块530,适于根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组存储。

在本申请另一个优选的实施例中,第一存储模块530,包括:

第一重叠判断子模块,适于根据所述有效数据包的偏移量和数据长度,判断所述有效数据包的有效数据与第一数组的有效数据的重叠情况。

第一丢弃子模块,适于如果第一数组中存在与所述有效数据包全部重叠的有效数据,则将所述有效数据包中重叠部分的有效数据丢弃。

第一丢弃存储子模块,适于如果第一数组中存在与所述有效数据部分重叠的有效数据,将所述有效数据包中重叠部分的有效数据丢弃,并计算不重叠部分的有效数据的第一偏移量和第一数据长度,再将不重叠部分的有效数据在第一数组的第一偏移量位置开始存储,直至存储长度为所述第一数据长度。

第一存储子模块,适于如果第一数组中不存在与所述有效数据全部重叠的有效数据,则将所述有效数据包的有效数据在第一数组的偏移量位置开始存储,直至存储长度为所述数据长度。

第二存储模块540,适于当所述有效数据包属于服务器时,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于服务 器的第二数组存储。

在本申请另一个优选的实施例中,第二存储模块540,包括:

第二重叠判断子模块,适于根据所述有效数据包的偏移量和数据长度,判断所述有效数据包的有效数据与第二数组的有效数据的重叠情况。

第二丢弃子模块,适于如果第二数组中存在与所述有效数据包全部重叠的有效数据,则将所述有效数据包中重叠部分的有效数据丢弃。

第二丢弃存储子模块,适于如果第二数组中存在与所述有效数据部分重叠的有效数据,将所述有效数据包中重叠部分的有效数据丢弃,并计算不重叠部分的有效数据的第二偏移量和第二数据长度,再将不重叠部分的有效数据在第二数组的第二偏移量位置开始存储,直至存储长度为所述第二数据长度。

第二丢弃存储子模块,适于如果第二数组中不存在与所述有效数据全部重叠的有效数据,则将所述有效数据包的有效数据在第二数组的偏移量位置开始存储,直至存储长度为所述数据长度。

在本申请另一个优选地实施例中,在第一存储模块530、第二存储模块540之后,还包括:

输出模块550,适于在当前tcp连接结束后,输出第一数组和/或第二数组中的数据。

在本申请实施例中,首先针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组,然后针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度,进一步根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组存储,最后在当前tcp连接结束后,输出第一数组和/或第二数组中的数据。简化了流重组过程中的判断逻辑以及运算过程,从而有效降低了现有tcp流重组方法的复杂度,提高了流重组的效率,更容易满足系统性能方面的需求。

在本申请实施例中,首先针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组,然后针对所述tcp连接下的含有tcp载 荷的有效数据包,计算所述有效数据包的偏移量和数据长度,进一步根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组存储。简化了流重组过程中的判断逻辑以及运算过程,从而有效降低了现有tcp流重组方法的复杂度,提高了流重组的效率,更容易满足系统性能方面的需求。

另外,在本申请又一个优选地实施例中,在tcp连接建立成功之后,再创建属于客户端的第一数组,和/或属于服务器的第二数组,从而可以有效地避免因为受到synflood(拒绝服务)攻击,而耗费大量的系统内存,影响系统的正常运行的问题。

实施例六

参照图6,示出了本申请的一种tcp流重组装置实施例的结构框图,具体可以包括如下模块:

syn包判断模块610,适于当接收到syn包时,判断所述syn包是来自客户端还来自服务器;如果syn包是来自客户端,则进入第一记录模块620;如果syn包是来自服务器,则可以不处理。

第一记录模块620,适于记录客户端的初始序列号isn(c);

第一创建模块630,适于针对一tcp连接,创建属于客户端的第一数组。具体包括:

tcp判断子模块631,适于在接收所述tcp连接的属于客户端的数据包时,判断所接收到的数据包是否为含有tcp载荷的有效数据包;如果所接收到的数据包是含有tcp载荷的有效数据包,则进入第一判断子模块632;

第一判断子模块632,适于判断所述有效数据包是否为第一个有效数据包;如果所述有效数据包是第一个有效数据包,则进入第一数组创建子模块633;

第一数组创建子模块633,适于创建属于客户端的第一数组。

计算模块640,适于针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度。具体包括:

数据长度计算子模块641,适于计算所述有效数据包中有效数据的长 度作为数据长度;

第一偏移量计算子模块642,适于根据有效数据包的tcp序列号和预先记录的第一纠偏值之差,确定所述有效数据包的偏移量;所述第一纠偏值为属于客户端的syn包的初始序列号+1。

第一判断模块650,适于判断所述有效数据包的偏移量和数据长度之和,是否大于第一数组的数组长度;如果所述有效数据包的偏移量和数据长度之和,大于第一数组的数组长度,则进入第一新数组创建模块660;如果所述有效数据包的偏移量和数据长度之和,不大于第一数组的数组长度,则直接进入第一存储模块680。

第一新数组创建模块660,适于创建一个新的第一数组,所述新的第一数组的数组长度超过原来的第一数组第一阈值。

第一复制存储模块670,适于将原来的第一数组中存储的数据复制到新的第一数组中,并将未存储过的有效数据包的有效数据存储至新的第一数组中。

第一存储模块680,适于当所述有效数据包属于客户端时,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组存储。

在本申请另一个优选地实施例中,还包括:

输出模块690,适于在当前tcp连接结束后,输出第一数组中的数据。

在本申请一优选的实施例中,在本申请实施例中,输出模块690,包括:

第一输出子模块,适于当在所述tcp连接下接收到任一个非指示关闭连接的数据包后,判断出所述tcp连接的空闲时间超过第一时间周期,则结束所述tcp连接,输出第一数组中的数据。

和/或,第二输出子模块,适于当在所述tcp连接下接收到指示关闭连接的数据包后,判断出所述tcp连接的空闲时间超过第二时间周期,则结束所述tcp连接,输出第一数组中的数据。

在本申请一优选的实施例中,在本申请实施例中,还包括:

第一释放模块,适于在将原来的第一数组中存储的数据复制到新的第一 数组中之后,将原来的第一数组释放。

将所述有效数据包中的有效数据向属于客户端的第一数组存储本申请实施例是针对一tcp连接,对由客户端发送的有效数据包中的有效数据进行重组。具体执行过程为,首先针对一tcp连接,创建属于客户端的第一数组,然后针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度,进一步根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组存储。从而简化了对于客户端的流重组过程中的判断逻辑以及运算过程,从而有效降低了现有tcp流重组方法的复杂度,提高了流重组的效率,更容易满足系统性能方面的需求。

而且,在本申请实施例中,还会判断接收到的数据包种类,并且针对接收到的数据包的种类不同,执行不同的操作;同时还会在接收到的有效数据包的偏置量和数据长度之和超出第一数组长度时,利用新的第一数组替换原有的第一数组。在保证流重组的效率的同时,提高了流重组的准确性,从而使其更容易满足系统性能方面的需求。

实施例七

参照图7,示出了本申请的一种tcp流重组装置实施例的结构框图,具体可以包括如下模块:

syn包判断模块710,适于当接收到syn包时,判断所述syn包是来自客户端还来自服务器;如果syn包是来自服务器,则进入第二记录模块720;如果syn包是来自客户端,则可以不处理;

第二记录模块720,适于则记录服务器的初始序列号isn(s)。

第一创建模块730,适于针对一tcp连接,创建属于客户端的第一数组,和/或属于服务器的第二数组。具体包括:

tcp判断子模块731,适于在接收所述tcp连接的数据包时,判断所接收到的数据包是否为含有tcp载荷的有效数据包;如果所接收到的数据包是含有tcp载荷的有效数据包,则进入第一判断子模块732。

第一判断子模块732,适于判断所述有效数据包是否为第一个有效数 据包;如果所述有效数据包是第一个有效数据包,则进入第二数组创建子模块733。

第二数组创建子模块733,适于创建属于服务器的第二数组。

计算模块740,适于针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度。具体包括:

数据长度计算子模块741,适于计算所述有效数据包中有效数据的长度作为数据长度;

第二偏移量计算子模块742,适于根据有效数据包的tcp序列号和预先记录的第二纠偏值之差,确定所述有效数据包的偏移量;所述第二纠偏值为属于服务器的syn包的初始序列号+1。

第二判断模块750,适于判断所述有效数据包的偏移量和数据长度之和,是否大于第二数组的数组长度;如果所述有效数据包的偏移量和数据长度之和,大于第二数组的数组长度,则进入第二新数组创建模块760;如果所述有效数据包的偏移量和数据长度之和,不大于第二数组的数组长度,则直接进入第二存储模块780。

第二新数组创建模块760,适于创建一个新的第二数组,所述新的第二数组的数组长度超过原来的第二数组第一阈值。

第二复制存储模块770,适于将原来的第二数组中存储的数据复制到新的第二数组中,并将未存储过的有效数据包的有效数据存储至新的第二数组中。

第二存储模块780,适于当所述有效数据包属于服务器时,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于服务器的第二数组存储。

在本申请另一个优选地实施例中,还包括:

输出模块790,适于在当前tcp连接结束后,输出第二数组中的数据。

在本申请另一个优选的实施例中,还包括:

第二释放模块,适于在将原来的第二数组中存储的数据复制到新的第二数组中之后,将原来的第二数组释放。

其中,第二释放模块,可以在第二复制存储模块770之后,或者是在第二复制存储模块770之后的任一模块之后,对此本申请不加以限制。

本申请实施例是针对一tcp连接,对由服务器发送的有效数据包中的有效数据进行重组。具体执行过程为,首先针对一tcp连接,创建属于服务器的第二数组,然后针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度,进一步根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于服务器的第二数组存储。从而简化了对于服务器侧的流重组过程中的判断逻辑以及运算过程,从而有效降低了现有tcp流重组方法的复杂度,提高了流重组的效率,更容易满足系统性能方面的需求。

而且,在本申请实施例中,同时还会在接收到的有效数据包的偏置量和数据长度之和超出第一数组长度时,利用新的第二数组替换原有的第二数组。在保证流重组的效率的同时,提高了流重组的准确性,从而使其更容易满足系统性能方面的需求。

实施例八

参照图8,示出了本申请的一种tcp流重组装置实施例的结构框图,具体可以包括如下模块:

syn包判断模块800,适于当接收到syn包时,判断所述syn包是来自客户端还来自服务器;如果syn包是来自客户端,则进入第一记录模块802;如果syn包是来自服务器,则进入第二记录模块804;

第一记录模块,适于记录客户端的初始序列号isn(c);

第二记录模块,适于记录服务器的初始序列号isn(s)。

第一创建模块810,适于针对一tcp连接,创建属于客户端的第一数组,和属于服务器的第二数组。具体包括:

tcp判断子模块811,适于在接收所述tcp连接的数据包时,判断所接收到的数据包是否为含有tcp载荷的有效数据包;如果所接收到的数据包是含有tcp载荷的有效数据包,则进入第一判断子模块812。

第一判断子模块812,适于判断所述有效数据包是否为第一个有效数 据包;如果所述有效数据包是第一个有效数据包,则进入客户端判断子模块813。

客户端判断子模块813,适于判断所述有效数据包是否属于客户端;如果所述有效数据包属于客户端,则进入第一数组创建子模块814;如果所述有效数据包不属于客户端,则进入第二数组创建子模块815。

第一数组创建子模块814,适于创建属于客户端的第一数组。进入计算模块820。

第二数组创建子模块815,适于创建属于服务器的第二数组。进入计算模块820。

计算模块820,适于针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度。具体包括:

数据长度计算子模块821,适于计算所述有效数据包中有效数据的长度作为数据长度。

第一偏移量计算子模块822,适于当所述有效数据包属于客户端,则根据有效数据包的tcp序列号和预先记录的第一纠偏值之差,确定所述有效数据包的偏移量;所述第一纠偏值为属于客户端的syn包的初始序列号+1。进入第一判断模块830。

第二偏移量计算子模块823,适于根据有效数据包的tcp序列号和预先记录的第二纠偏值之差,确定所述有效数据包的偏移量;所述第二纠偏值为属于服务器的syn包的初始序列号+1。进入第二判断模块860。

第一判断模块830,适于当所述有效数据包属于客户端,则判断所述有效数据包的偏移量和数据长度之和,是否大于第一数组的数组长度;如果所述有效数据包的偏移量和数据长度之和,大于第一数组的数组长度,则进入第一新数组创建模块840,然后进入第一复制存储模块850;如果所述有效数据包的偏移量和数据长度之和,不大于第一数组的数组长度,则直接进入第一存储模块890。

第一新数组创建模块840,适于创建一个新的第一数组,所述新的第一数组的数组长度超过原来的第一数组第一阈值。

第一复制存储模块850,适于将原来的第一数组中存储的数据复制到新的第一数组中,并将未存储过的有效数据包的有效数据存储至新的第一数组中。

第二判断模块860,适于判断所述有效数据包的偏移量和数据长度之和,是否大于第二数组的数组长度;如果所述有效数据包的偏移量和数据长度之和,大于第二数组的数组长度,则进入第二新数组创建模块870;如果所述有效数据包的偏移量和数据长度之和,不大于第二数组的数组长度,则直接进入第二存储模块8110。

第二新数组创建模块870,适于创建一个新的第二数组,所述新的第二数组的数组长度超过原来的第二数组第一阈值。

第二复制存储模块880,适于将原来的第二数组中存储的数据复制到新的第二数组中,并将未存储过的有效数据包的有效数据存储至新的第二数组中。

第一存储模块890,适于当所述有效数据包属于客户端时,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于客户端的第一数组存储。

第二存储模块8110,适于当所述有效数据包属于服务器时,根据所述有效数据包的偏移量和数据长度,将所述有效数据包中的有效数据向属于服务器的第二数组存储。

在本申请另一个优选地实施例中,还包括:

输出模块8120,适于在当前tcp连接结束后,输出第一数组和第二数组中的数据。

在本申请另一个优选的实施例中,还包括:

第一释放模块,适于在将原来的第一数组中存储的数据复制到新的第一数组中之后,将原来的第一数组释放。

第二释放模块,适于在将原来的第二数组中存储的数据复制到新的第二数组中之后,将原来的第二数组释放。

其中,第一释放模块可以在第一复制存储模块之后,或者是在第一复制 存储模块之后的任一模块之后;第二释放模块可以在第二复制存储模块之后,或者是在第二复制存储模块之后的任一模块之后,对此本申请不加以限制。

本申请实施例是针对一tcp连接,分别对由客户端和服务器发送的有效数据包中的有效数据进行重组。具体执行过程为,首先针对一tcp连接,创建属于客户端的第一数组,和属于服务器的第二数组,然后针对所述tcp连接下的含有tcp载荷的有效数据包,计算所述有效数据包的偏移量和数据长度,进一步根据所述有效数据包的偏移量和数据长度,将所述客户端的有效数据包中的有效数据存储至属于客户端的第二数组,将所述服务器的有效数据包中的有效数据存储至属于服务器的第二数组。从而实现了同时分别对于客户端以及服务器侧的数据流的重组,而且简化了对于客户端侧以及服务器侧的流重组过程中的判断逻辑以及运算过程,从而有效降低了现有tcp流重组方法的复杂度,提高了流重组的效率,更容易满足系统性能方面的需求。

而且,在本申请实施例中,在建立tcp连接时会判断接收到的syn包是来自客户端发送还来自服务器,进而决定记录客户端的初始序列号isn还是服务器的初始序列号isn;在接收tcp连接的数据包时,还会判断接收到的数据包种类,并且针对接收到的数据包的种类不同,执行不同的操作;同时还会分别在接收到的有效数据包的偏置量和数据长度之和超出第一数组和第二数组长度时,分别利用新的第一数组和第二数组替换原有的第一数组和第二数组。在保证流重组的效率的同时,提高了流重组的准确性,从而使其更容易满足系统性能方面的需求。

并且,是在tcp连接建立成功之后,再创建属于客户端的第一数组,和/或属于服务器的第二数组,相对于在tcp连接还未成功建立之前,在创建属于客户端的第一数组,和属于服务器的第二数组,延迟了创建用以进行数据流重组的第一数组和第二数组。可以有效避免synflood(拒绝服务)攻击导致的资源被耗用过度的问题。

对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较 简单,相关之处参见方法实施例的部分说明即可。

本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。

本领域内的技术人员应明白,本申请实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本申请实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

在一个典型的配置中,所述计算机设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非持续性的电脑可读媒体(transitorymedia),如调制的数据信号和载波。

本申请实施例是参照根据本申请实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框 图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本申请实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请实施例范围的所有变更和修改。

最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。

以上对本申请所提供的一种tcp流重组方法和一种tcp流重组装置, 进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1