CN101841545B - 一种tcp流重组拼包方法和装置 - Google Patents
一种tcp流重组拼包方法和装置 Download PDFInfo
- Publication number
- CN101841545B CN101841545B CN2010101759548A CN201010175954A CN101841545B CN 101841545 B CN101841545 B CN 101841545B CN 2010101759548 A CN2010101759548 A CN 2010101759548A CN 201010175954 A CN201010175954 A CN 201010175954A CN 101841545 B CN101841545 B CN 101841545B
- Authority
- CN
- China
- Prior art keywords
- data
- message
- load data
- tcp stream
- buffering area
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明公开了一种TCP流重组拼包方法和装置。所述方法包括:接收当前处理报文和记录当前处理报文信息的TCP流记录,将报文分成包头信息和负载数据并将负载数据写入报文负载数据先入先出队列;判断缓存当前处理报文是否需要申请新的缓冲区,若是,则发送分配缓冲区请求,采用哈希函数和位图文件的方式为当前处理报文的负载数据分配缓存空间中空闲的单元缓冲块,返回空闲的单元缓冲块的地址索引,更新TCP流记录;否则,从报文负载数据先入先出队列中读取负载数据,根据新的TCP流记录中指定的位置将负载数据写入负载数据缓冲区,完成重组和/或拼包。
Description
技术领域
本发明涉及TCP协议卸载引擎技术领域,特别是涉及一种TCP流重组拼包方法和装置。
背景技术
目前,虽然CPU性能每18个月翻一番,但仍然无法跟上网络速率每3年增加10倍的脚步。随着网络带宽激增,CPU资源被大量消耗,关键应用的服务质量难以保证,CPU处理能力成为网络端系统中的主要瓶颈。为此,人们提出了TCP协议卸载引擎(TCP Offload Engine,TOE)技术。
TCP协议卸载引擎技术的基本思想是将TCP/IP协议的全部处理或者部分处理转移到专门的硬件上进行。近几年新面市的高速网卡或多或少都会在网卡上集成一些TOE技术以减轻主机端处理网络数据的负担,其中普遍被采用的技术包括:校验和卸载(checksum offloading),中断缓和(interruptcoalescing),TCP段合并(TCP Segmentation Offload)等。TCP段合并是在主机发送数据时,不受最大传输单元(Maximum Transmission Unit,MTU)的限制,将一个远超MTU大小的IP包发给网卡,由网卡将IP包按照MTU的大小划分成可以在链路层传输的小包,并根据划分情况为每一个包添加新TCP/IP协议头,再将这些小包输出。由于大大减少了主机端发送的包数,采用TCP段合并技术可以有效的减少主机端发送数据的开销。
在接收端利用同样思想减少主机端接收数据开销的技术称作LRO(Largereceive offload),也就是网卡将收到的报文中属于同一条TCP流的拼到一起,生成一个大包上传给主机。虽然思想类似,但LRO实现起来要远比TSO复杂,一是因为网卡要将所有收到的报文按照其所属的TCP流缓存起来,才能完成TCP流拼包;二是由于网络传输的原因,接收端收到的报文可能出现乱序,需要在网卡上完成TCP流重组。处理这两个问题需要灵活的分配和释放报文缓冲区,这就给硬件实现LRO带来了麻烦。目前能够支持LRO的网卡多是采用了网络处理器的高端网卡,在网卡上通过运行软件实现LRO。但一般来说网络处理器性能有限,对于处理大规模并发流的高速网络数据往往会力不从心。
发明内容
本发明的目的在于提供一种TCP流重组拼包方法和装置。通过应用本发明,对于大多数报文的重组和拼包可以通过硬件实现,减少了主机端与网卡的中断开销和主机端TCP流重组拼包的开销。利用hash运算结果分配空闲缓冲块的方式可以减少流记录中存储缓冲区地址所需的空间,也适合硬件并发处理完成分配操作。
为实现本发明的目的而提供的一种TCP流重组拼包方法,包括下列步骤:
步骤100.报文处理模块接收当前处理报文,然后从TCP流记录表中找到该报文相关TCP流记录,将所述报文分成包头信息和负载数据两部分,并将所述负载数据写入报文负载数据先入先出队列;
步骤200.报文处理模块根据所述包头信息更新所述TCP流记录,并根据更新后的TCP流记录判断缓存当前处理报文是否需要申请新的单元缓冲块,若是,则执行步骤300;否则,执行步骤400;
步骤300.报文处理模块向缓冲区分配模块发送分配缓冲区请求,同时传递给缓冲区分配模块所述当前处理报文的四元组,缓冲区分配模块采用哈希函数和位图文件的方式为当前处理报文的负载数据分配空闲的单元缓冲块,返回空闲的单元缓冲块的地址索引;报文处理模块根据所述单元缓冲块的地址索引,更新所述TCP流记录得到新的TCP流记录;
步骤400.缓冲区数据管理模块获得所述新的TCP流记录,并从报文负载数据FIFO中读取所述负载数据,根据所述新的TCP流记录中指定的位置将所述负载数据写入负载数据缓冲区,完成重组和/或拼包,并将经过重组和/或拼包的TCP流数据上传给主机。
所述TCP流记录,记录了对一条TCP流进行重组拼包所需的信息,包括:客户端IP、服务器端IP、客户端端口、服务器端端口、TCP流状态,并为客户端至服务器端和服务器端至客户端两个方向各设置一个报文缓冲区管理字段,其中,每一个方向的报文缓冲区管理字段可分成以下几个部分:期待序列号,单元缓冲块有效位字段,单元缓冲块地址索引字段,期待序列号偏移字段,缓存数据段描述符,其中:
单元缓冲块有效位字段和单元缓冲块地址索引字段分别描述分配给这条TCP流的负载数据缓冲区的各个单元缓冲块的状态信息;
期待序列号偏移字段,记录这条TCP连接在一个方向上期待的下一个顺序报文要存储在负载数据缓冲区中的偏移;
若干个缓存数据段描述符,每个缓存数据段描述符用于描述一段存放在负载数据缓冲区中的连续报文负载数据,由两个指针组成,两个指针分别指向该段负载数据在负载数据缓冲区的起始地址和结尾地址。
所述缓冲区分配模块将缓存空间划分成n个区域,每个区域中包括多个单元缓冲块,每个区域用一个位图文件记录该区域的使用情况,每一比特记录所述区域中的一个单元缓冲块是否已经分配;每一条TCP流在一个方向上的负载数据缓冲区由n个单元缓冲块构成,且一条TCP流在每个区域中只允许分配到一个单元缓冲块。
所述单元缓冲块的物理地址是由单元缓冲块地址索引字段Index和报文的四元组Tuples配合运算得到的,具体的过程为:预先设定好n个hash函数H(H[0],H[1]……H[n-1]),每个hash函数对应缓存空间的一个区域,Index[i]代表了负载数据缓冲区中的第i个单元缓冲块属于n个区域中的哪一个,H[Index[i]]代表了负载数据缓冲区中的第i个单元缓冲块是根据哪个hash函数得到的,则{Index[i],H[Index[i]](Tuples)}就是负载数据缓冲区中第i个单元缓冲块的物理地址基址。
所述步骤200,包括下列步骤:
步骤210.判断当前处理报文的序列号是否等于当前所述TCP流记录中的期待序列号;若是,则执行步骤220;否则,执行步骤240;
步骤220.判断负载数据缓冲区中是否存在乱序数据,若是,则执行步骤230;否则,所述期待序列号=当前期待序列号+报文长度;期待序列号偏移=当前期待序列号偏移+报文长度,执行步骤240;
步骤230.判断当前处理报文与所述乱序数据是否相邻,若是,则所述期待序列号=当前期待序列号+报文长度+拼好的乱序数据长度;期待序列号偏移=当前期待序列号偏移+报文长度+拼好的乱序数据长度,并更新缓存数据段描述符,执行步骤260;否则,所述期待序列号=当前期待序列号+报文长度;期待序列号偏移=当前期待序列号偏移+报文长度,更新缓存数据段描述符,执行步骤260;
步骤240.判断当前处理报文的序列号是否小于当前TCP流记录中的期待序列号,若是,则执行步骤250;否则按照当前报文的负载数据在其所属TCP流的负载数据缓冲区的存放位置更新缓存数据段描述符,执行步骤260;
步骤250.判断所述负载数据的序列号是否均小于当前所述TCP流记录中的期待序列号,若是,则当前待处理报文被视为老数据包,不修改所述TCP流记录;否则,所述期待序列号=当前期待序列号+当前待处理报文中新数据的长度;期待序列号偏移=期待序列号偏移+当前待处理报文中新数据的长度,更新缓存数据段描述符,执行步骤260;
步骤260.判断更新后的缓存数据段描述符是否要求分配新的单元缓冲块,若是,表示需要申请新的单元缓冲块;否则,表示不需要申请新的单元缓冲块;。
所述步骤300,包括下列步骤:
步骤310.缓冲区分配模块接收当前处理报文的四元组,同时使用预设的所有哈希函数对所述四元组进行计算,得到多个哈希运算结果;
步骤320.缓冲区分配模块以所述哈希运算结果为索引访问所述哈希运算结果对应的位图文件,读到多个1比特的数据;
步骤330.判断读到的多个1比特的数据中是否有“0”,若是,则表示对应所述区域中这个哈希运算结果索引的位置上的单元缓冲区块空闲;否则执行步骤350;
步骤340.从多个1比特的数据中任意选择一个“0”,将“0”在多个1比特的数据中的位置作为分配的单元缓冲块的地址索引,返还给报文处理模块,并修改所述位图文件;
步骤350.不缓存当前处理报文,通知缓冲区数据管理模块将这条TCP流的负载数据缓冲区缓存的所有数据和当前处理报文一并传给主机。
所述步骤400,包括下列步骤:
步骤410.缓冲区数据管理模块根据报文处理模块的结果,从所述先入先出队列中读出报文负载数据写入负载数据缓冲区;
步骤420.判断是否存在一条TCP流在缓冲区中存储的顺序数据长度超过一个预设值,若是,则执行步骤430;否则,执行步骤440;
步骤430.缓冲区数据管理模块将拼好的顺序数据取出,根据当前处理报文的包头信息为这一段数据添加一个伪造包头,生成一个拼好的大包上传给主机;
步骤440.判断是否存在一条TCP流在缓冲区中存储的乱序数据长度超过一个预设值,或是乱序数据超出了负载数据缓冲区的范围,若是,则执行步骤450;否则,返回步骤410;
步骤450.缓冲区数据管理模块根据流记录中的缓存数据段描述符取出缓冲区中存储的乱序数据,生成拼好的大包上传给主机。
为实现本发明的目的还提供一种TCP流重组拼包装置,所述装置,包括:
报文处理模块,用于接收当前处理报文,将所述报文分成包头信息和负载数据两部分,将所述负载数据写入报文负载数据先入先出队列,根据所述包头信息以及缓冲分配模块的地址索引更新TCP流记录;如果缓存当前处理报文需要申请新的单元缓冲块,向缓冲区分配模块发送分配缓冲区请求;
缓冲区数据管理模块,用于根据所述包头信息从报文负载数据先入先出队列中读取负载数据,根据更新后的TCP流记录中指定的位置将所述负载数据写入负载数据缓冲区,完成重组和/或拼包,并将经过重组和/或拼包的TCP流数据上传给主机;
报文负载数据FIFO,用于缓存报文的负载数据;
缓冲区分配模块,采用哈希函数和位图文件的方式为当前处理报文的负载数据分配负载数据缓冲区中空闲的单元缓冲块,返回空闲的单元缓冲块的地址索引;
缓存空间,用于按照相应TCP流的报文顺序缓存报文负载数据。
所述TCP流记录,记录了对一条TCP流进行重组拼包所需的信息,包括:客户端IP、服务器端IP、客户端端口、服务器端端口、TCP流状态,并为客户端至服务器端和服务器端至客户端两个方向各设置一个报文缓冲区管理字段,其中,每一个方向的报文缓冲区管理字段可分成以下几个部分:期待序列号,单元缓冲块有效位字段,单元缓冲块地址索引字段,期待序列号偏移字段,缓存数据段描述符,其中:
单元缓冲块有效位字段和单元缓冲块地址索引字段分别描述分配给这条TCP流的负载数据缓冲区的各个单元缓冲块的状态信息;
期待序列号偏移字段,记录这条TCP连接在一个方向上期待的下一个顺序报文要存储在负载数据缓冲区中的偏移;
若干个缓存数据段描述符,每个缓存数据段描述符用于描述一段存放在负载数据缓冲区中的连续报文负载数据,由两个指针组成,两个指针分别指向该段负载数据在负载数据缓冲区的起始地址和结尾地址。
所述缓冲区分配模块将缓存空间划分成n个区域,每个区域中包括多个单元缓冲块,每个区域用一个位图文件记录该区域的使用情况,每一比特记录所述区域中的一个单元缓冲块是否已经分配;每一条TCP流在一个方向上的负载数据缓冲区由n个单元缓冲块构成,且一条TCP流在每个区域中只允许分配到一个单元缓冲块。
所述单元缓冲块的物理地址是由单元缓冲块地址索引字段Index和报文的四元组Tuples配合运算得到的,具体的过程为:预先设定好n个hash函数H(H[0],H[1]……H[n-1]),每个hash函数对应缓存空间的一个区域,Index[i]代表了负载数据缓冲区中的第i个单元缓冲块属于n个区域中的哪一个,H[Index[i]]代表了负载数据缓冲区中的第i个单元缓冲块是根据哪个hash函数得到的,则{Index[i],H[Index[i]](Tuples)}就是负载数据缓冲区中第i个单元缓冲块的物理地址基址。
所述报文处理模块,包括:判断模块和TCP流记录修改模块,其中:
所述判断模块,包括:
序列号判断子模块,用于比较当前处理报文的序列号与当前所述TCP流记录中的期待序列号的关系;若等于,则触发乱数判断子模块;若大于,则触发所述TCP流记录修改模块;若当所述负载数据的序列号均小于当前所述TCP流记录中的期待序列号时,则将当前待处理报文被视为老数据包,不修改所述TCP流记录;否则,触发所述TCP流记录修改模块;
乱数判断子模块,用于判断负载数据缓冲区中是否存在乱序数据,若是,则触发相邻判断子模块;否则,触发所述TCP流记录修改模块;
相邻判断子模块,用于判断当前处理报文与所述乱序数据是否相邻,若是,则触发所述TCP流记录修改模块;否则,触发所述TCP流记录修改模块;
所述TCP流记录修改模块,用于根据所述判断模块的判断结果修改所述TCP流记录,更新缓存数据段描述符。
所述缓冲区分配模块,包括:
接收模块,用于接收当前处理报文的四元组;
计算模块,用于使用与所述数据缓冲区中多个区域对应的多个哈希函数对接收到的四元组进行计算,得到多个哈希运算结果;
访问模块,用于以所述哈希运算结果为索引访问所述哈希运算结果对应的位图文件,读到多个1比特的数据;
0判断模块,用于判断读到的多个1比特的数据中是否有“0”,若是,则表示对应所述区域中这个哈希运算结果索引的位置上的单元缓冲区块空闲,触发分配模块;否则触发上传模块;
上传模块,不缓存当前处理报文,通知缓冲区数据管理模块将这条TCP流的负载数据缓冲区缓存的所有数据和当前处理报文一并传给主机;
分配模块,用于从读到的多个1比特的数据中任意选择一个“0”,将“0”在多个1比特的数据中的位置作为分配的单元缓冲块的地址索引,返还给报文处理模块,并修改所述位图文件。
所述缓冲区数据管理模块,包括:
负载数据读取模块,用于从所述先入先出队列中读出报文负载数据写入所述负载数据缓冲区;
阈值判断模块,用于判断是否存在一条TCP流在负载数据缓冲区中存储的顺序数据长度超过一个预设值,若是,则触发顺序拼包模块;否则,触发乱数阈值判断模块;
顺序拼包模块,用于将拼好的顺序数据取出,根据当前处理报文的包头信息为这一段数据添加一个伪造包头,生成一个拼好的大包上传给主机;
乱数阈值判断模块,用于判断是否存在一条TCP流在缓冲区中存储的乱序数据长度超过一个预设值,或是乱序数据超出了负载数据缓冲区的范围,若是,则触发乱序拼包模块;否则,触发负载数据读取模块;
乱序拼包模块,根据流记录中的缓存数据段描述符取出缓冲区中存储的乱序数据,生成拼好的大包上传给主机。
本发明的有益效果是:
1.对于大多数报文的重组和拼包可以通过硬件实现,减少了主机端与网卡的中断开销和主机端TCP流重组拼包的开销;
2.采用hash运算和位图文件分配空闲缓冲块的方式可以减少流记录中存储缓冲区地址所需的空间,也适合硬件并发处理完成分配操作;
3.本发明是基于硬件实现,限制了分配给每一条TCP流的最大缓冲区空间,以此防止嫌疑威胁流利用乱序TCP流耗尽系统的内存。
通过结合附图对本发明具体实施例的描述,本发明的其它方面及特征对本领域的技术人员而言是显而易见的。
附图说明
图1是本发明中TCP流记录的结构图;
图2是本发明的一种TCP流重组拼包方法的步骤流程图;
图3是本发明中根据包头信息判断乱序报文的步骤流程图;
图4是本发明中缓冲区分配模块分配缓冲区的步骤流程图;
图5是本发明中缓冲区数据管理模块完成重组和/或拼包的步骤流程图;
图6是本发明一种TCP流重组拼包系统的结构流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明的一种TCP流重组拼包方法和装置。进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
为了清楚的说明本发明,以下对概念进行解释:
本发明中的存储空间,包括:缓存空间、负载数据缓冲区和单元缓冲块三个概念。其中,缓存空间是指所有可用的存储空间(比如2GB),它是由多个单元缓冲块组成,物理地址是不连续的。所述负载数据缓冲区是一个逻辑概念,是指为实现对一条TCP流进行重组拼包所需要分配的空间,比较小(32KB或64KB),实质上是由所述缓存空间中空闲的单元缓冲块形成的,其在逻辑地址上是连续的。不同TCP流分配到的负载数据缓冲区是不同的(也就是说在处理多个并发TCP流时会分配多个负载数据缓冲区),但他们都是从缓存空间中获得的。
图1是本发明中TCP流记录的结构图,如图1所示,所述TCP流记录:一个TCP流记录有64字节,这是基于有效利用DRAM总线带宽的考虑,选择一次DRAM突发读(burst read)可以读取一个TCP流记录。其中四元组占据12字节,包含了这条TCP流的Client端IP地址(4字节),Server端IP地址(4字节),Client端端口地址(2字节),Server端端口地址(2字节)。Client至Server序列(Sequence)(4字节)存储的是这条TCP流Client至Server方向期待看到的顺序报文的序列号,如果收到的Client至Server方向上的最新报文的序列号等于这个域存储的值,则认为收到了一个顺序报文,同时更新这个域的值为期待的下一个报文的序列号。Server至Client序列(Sequence)(4字节)存储的是这条TCP流Server至Client方向期待看到的顺序报文的序列号。具体处理方式与Client至Server Sequence一致。状态域字段(4字节)记录的是这条TCP流的当前状态,主要包括是否完成三次握手,是否收到乱序的报文,两个方向上是否收到带结束标记的报文,该TCP流当前缓存数据段状态等各种状态信息。
对于一条TCP流的重组拼包需要知道当前这条流的状态,如乱序数据被缓存到哪里,乱序数据与本应收到的顺序数据间的顺序等。这些信息是需要进行保存的,因此,本发明提供了一种TCP流记录结构,其与负载数据缓冲区共用可用的存储空间,负载数据缓冲区中包括多个单元缓冲块,分配时以单元缓冲块作为基本单位分配给TCP流。本发明中为了实现TCP流重组和拼包,需要为一条TCP流的两个传输方向各分配一个负载数据缓冲区以存储接收到的报文负载数据,大小为64KB。下面将对所述TCP流记录表的结构进行详细说明。
所述TCP流记录(如图1所示)中包括:客户端IP、服务器端IP、客户端端口、服务器端端口、TCP流状态,以及在Client至Server和Server至Client两个方向上各设置20字节的报文缓冲区管理字段,总计40字节。每一个方向的报文缓冲区管理字段可分成以下几个部分:期待序列号,单元缓冲块有效位字段,单元缓冲块地址索引字段,期待序列号偏移字段,缓存数据段描述符。下面描述Client至Server方向上各个字段的含义,Server至Client方向的字段与其类似。
单元缓冲块有效位字段和单元缓冲块地址索引字段Index分别描述分配给这条TCP流的负载数据缓冲区中各个单元缓冲块的状态信息。因为负载数据缓冲区的分配以单元缓冲块为单位,采取用时动态分配的策略,只分配缓存当前TCP流收到的数据所需的单元缓冲块,所以负载数据缓冲区这个逻辑空间中的某些区间可能暂时没有分配实际的单元缓冲块。单元缓冲块有效位字段V长16bit,每一位就代表了在负载数据缓冲区中的对应位置上是否已经分配了单元缓冲块,如V[0]为1表示在负载数据缓冲区中的0K~4K的位置已经分配了一个单元缓冲块,V[2]为0表示在负载数据缓冲区中的8K~12K的位置还没有分配单元缓冲块。
本发明中单元缓冲块的物理地址是由单元缓冲块地址索引字段Index和报文的四元组Tuples配合运算得到的,由于本发明中缓存空间被分成16个区域,每个区域中包括多个单元缓冲块,因此单元缓冲块的物理地址的计算方法为:预先设定好16个hash函数H(H[0],H[1]……H[15]),每个hash函数对应缓存空间的一个区域,Index[i]代表了负载数据缓冲区中的第i个单元缓冲块属于16个区域中的哪一个,H[Index[i]]代表了负载数据缓冲区中的第i个单元缓冲块是根据哪个hash函数得到的,则{Index[i],H[Index[i]](Tuples)}就是负载数据缓冲区中第i个单元缓冲块的物理地址基址。假设数据包的四元组为(1.1.1.1:1,2.2.2.2:2),那么单元缓冲块i的物理地址为{Index[i],H[Index[i]](1.1.1.1:1,2.2.2.2:2)}=[0101,H5(1.1.1.1:1,2.2.2.2:2)],其中物理地址的高4位是0101,表示这是从5号区域分配的单元缓冲块i,物理地址的低几位是指由H5这个hash函数计算四元组得出来的。
本实施例中1个单元缓冲块需要4bits来标记16个hash函数中具体用到的函数,单元缓冲块地址索引字段维护16个单元缓冲块所需的总长度就是16*4bits=8Bytes。
期待序列号偏移字段占16bit,记录这条TCP在一个方向上期待的下一个顺序报文要存储在负载数据缓冲区中的偏移,从负载数据缓冲区的起始地址至这个偏移,即为这条TCP流在Client至Server方向上已经缓存拼好的数据报文,即为顺序数据。另外还有两个缓存数据段描述符,用于描述一段存放在负载数据缓冲区中的报文负载数据。每一个缓存数据段描述符长32bit,由两个16bit的指针组成,两个指针分别指向该段负载数据在负载数据缓冲区的起始地址和结尾地址。本具体实施例在Client至Server方向上最多可以记录两段负载数据,这对于正常的网络流量在绝大多数情况下是够用的。
图2是本发明的一种TCP流重组拼包方法的步骤流程图,如图2所示,结合本发明的TCP流记录,本发明的一种TCP流重组拼包方法,包括下列步骤:
步骤100.报文处理模块接收当前处理报文,然后从TCP流记录表中找到该报文相关TCP流记录,将所述报文分成包头信息和负载数据两部分,并将所述负载数据写入报文负载数据FIFO;
步骤200.报文处理模块根据所述包头信息更新TCP流记录,并根据更新后的TCP流记录判断缓存当前处理报文是否需要申请新的单元缓冲块,若是,则执行步骤300;否则,执行步骤400;
图3是本发明中根据包头信息判断乱序报文的步骤流程图,如图3所示,所述步骤200,包括下列步骤:
步骤210.判断当前处理报文的序列号是否等于当前TCP流记录中的期待序列号;若是,则执行步骤220;否则,执行步骤240;
步骤220.判断负载数据缓冲区中是否存在乱序数据,若是,则执行步骤230;否则,所述期待序列号=当前期待序列号+报文长度;期待序列号偏移=当前期待序列号偏移+报文长度,执行步骤240;
步骤230.判断当前处理报文与所述乱序数据是否相邻,若是,则所述期待序列号=当前期待序列号+报文长度+拼好的乱序数据长度;期待序列号偏移=当前期待序列号偏移+报文长度+拼好的乱序数据长度,并更新缓存数据段描述符,执行步骤260;否则,所述期待序列号=当前期待序列号+报文长度;期待序列号偏移=当前期待序列号偏移+报文长度,更新缓存数据段描述符,执行步骤260;
步骤240.判断当前处理报文的序列号是否小于当前TCP流记录中的期待序列号,若是,则执行步骤250;否则按照当前报文的负载数据在其所属TCP流的负载数据缓冲区的存放位置更新缓存数据段描述符,执行步骤260;
步骤250.判断所述负载数据的序列号是否均小于当前TCP流记录中的期待序列号,若是,则当前待处理报文被视为老数据包,不修改TCP流记录;否则,所述期待序列号=当前期待序列号+当前待处理报文中新数据的长度;期待序列号偏移=期待序列号偏移+当前待处理报文中新数据的长度,更新缓存数据段描述符,执行步骤260;
步骤260.判断更新后的缓存数据段描述符是否要求分配新的单元缓冲块,若是,表示需要分配缓冲块;否则,不需要分配缓冲块;
举例而言,假设一条TCP流有5个数据包1、2、3、4、5,每个都是长100bytes,数据包1的序列号是1000,数据包2的序列号是1100,数据包3的序列号是1200,数据包4的序列号是1300,数据包5的序列号是1400。
如果数据包是以1,2,3,4,5的顺序到来,则收到第一个数据包1后,依照步骤200,期待序列号=1000+100=1100,期待序列号偏移=0+100=100;收到第二个数据包2后,期待序列号=1100+100=1200,期待序列号偏移=100+100=200;
如果数据包是以1,3,4,2,5的顺序到来,在数据包3到来时,期待序列号是1100,但数据包3的序列号是1200,根据步骤200,确定是乱序报文,这时只修改TCP流记录中关于乱序缓冲区的部分,而不修改期待序列号;第四个数据包2到来时,期待序列号仍是1100,而数据包2的序列号是1100,为顺序报文,同时还拼好了乱序数据包3和4,因此会同时修改TCP流记录中的期待序列号部分和乱序缓冲区的部分,修改后的期待序列号是1400。
比较更新后的缓存数据段描述符和单元缓冲块有效位字段,可以判断是否要求新的单元缓冲块。例如收到一个数据包后缓存数据段描述符为[0,5K],表示在该TCP流的负载数据缓冲区在0-5k的这段空间有缓存的报文数据。如果此时单元缓冲块有效位字段V中,V[0]=1,V[1]=0,就表示该TCP流的负载数据缓冲区在0-4k这个区间分配了一个单元缓冲块,而在4k-8k则没有分配单元缓冲块。这就意味着要在负载数据缓冲区的4k-5k部分存放报文数据,就必须为4k-8k这个区间申请一个新的单元缓冲块。
步骤300.报文处理模块向缓冲区分配模块发送分配缓冲区请求,同时传递给缓冲区分配模块当前处理报文的四元组,缓冲区分配模块采用hash函数和位图文件的方式为当前处理报文分配空闲的单元缓冲块,返回单元缓冲块的地址索引;报文处理模块根据所述单元缓冲块的地址索引,更新所述TCP流记录得到新的TCP流记录;
本发明中,缓冲区分配模块将缓存空间划分成16个区域,每个区域中包括多个单元缓冲块,每个区域用一个位图文件记录该区域的使用情况,每一bit记录所述区域中的1个单元缓冲块是否已经分配。单元缓冲块作为空间分配的基本单位,是物理地址连续的一小段区域。每一条TCP流在一个方向上的负载数据缓冲区由16个单元缓冲块构成,负载数据缓冲区只是逻辑上连续的一段空间,实际的物理地址由其分配到的单元缓冲块决定。单元缓冲块的分配采取用时动态分配策略。
所述缓冲区分配模块为每条TCP流分配空闲的单元缓冲块,每一条TCP流在一个区域中只允许分配到一个指定位置上的单元缓冲块,具体位置是TCP流四元组的hash运算结果对应的区域。查找可用空间时对所有位图进行并行查找,如果发现该区域指定位置上的单元缓冲块已经分配给了其它TCP流的缓冲区,则只能从其它区域的指定位置上查找可用的单元缓冲块。处理报文处理模块的分配请求时可以对16个位图进行并行查找,如果位图显示多个区域内有单元缓冲块可用,可以任意选择一个单元缓冲块分配给报文处理模块。缓冲区分配模块返回给报文处理模块的不是单元缓冲块的物理地址,而是单元缓冲块地址索引,也就是告诉报文处理模块根据哪个hash函数可以算出新分配的单元缓冲块的物理地址。
举例而言,可用的存储空间为16Mbytes的话,每个区域就是1Mbytes,16个区域分别为D1,D2……D16。位图文件与区域一一对应,就是16个位图文件,分别是B1,B2……B16。一个单元缓冲块是4KB,所以1个区域有256个单元缓冲块。一个位图文件的大小就是32Byte(256bits)。B1中的任意一个bit与D1中的一个单元缓冲块一一对应。如果是‘1’表示这个缓冲块分配出去了,如果是‘0’则还没有分配。
较佳地,本发明中所述单元缓冲块的物理地址是由单元缓冲块地址索引字段Index和报文的四元组Tuples配合运算得到的,具体的过程为:预先设定好一组hash函数H(H[0],H[1]……H[15]),Index[i]代表了负载数据缓冲区中的第i个单元缓冲块是根据哪个hash函数得到的,则{Index[i],H[Index[i]](Tuples)}就是负载数据缓冲区中第i个单元缓冲块的物理地址基址。本实施例中1个单元缓冲块需要4bits来标记16个hash函数中具体用到的函数,单元缓冲块地址索引字段维护16个单元缓冲块所需的总长度就是16*4bits=8Bytes。
图4是本发明中缓冲区分配模块分配缓冲区的步骤流程图,如图4所示,所述步骤300,包括下列步骤:
步骤310.缓冲区分配模块接收当前处理报文的四元组,同时使用预设的所有hash函数对四元组进行计算,得到16个hash结果;
步骤320.缓冲区分配模块以hash结果为索引访问hash结果对应的位图文件,读到16个1-bit的数据;
步骤330.判断读到的16个1bit数据中是否有’0’,若是,则表示对应所述区域中这个hash结果索引的位置上的单元缓冲块空闲。否则执行步骤350’
步骤340.从16bits的数据中任意选择一个’0’,这个’0’在16bits中的位置作为分配的单元缓冲块的地址索引,返还给报文处理模块,修改位图文件,退出;
步骤350.不缓存当前待处理报文,通知缓冲区数据管理模块将这条TCP流的负载数据缓冲区缓存的所有数据和当前待处理报文一并传给主机。
作为一种可实施方式,假设报文处理模块处理的数据包的四元组为(1.1.1.1:1,2.2.2.2:2),预设的16个hash函数,对这个四元组做运算的结果为1000,2000,3000……16000,读取16个位图文件对应位置上的数据,读的其实是B1[1000],B2[2000],B3[3000]……B16[16000],每个位图文件读出1bit数据,总共读出来16个1bit的数据,假设是1111001110010000,选择里面最左面的0(从左数第5个数字)作为分配的单元缓冲块,单元缓冲块的地址索引就是5,缓冲区分配模块通知报文处理模块分配了一个单元缓冲块,单元缓冲块的地址索引为5,报文处理模块就在流记录上记录了5这个数。需要真正写内存时,根据该地址索引按照如下方式计算得到物理地址:[0101,H5(1.1.1.1:1,2.2.2.2:2)],物理地址的高4位是0101,表示这是从5号区域分配的一个单元缓冲块,物理地址的低几位由H5这个hash函数计算四元组得出来的。
步骤400.缓冲区数据管理模块获得更新后的TCP流记录,并从报文负载数据FIFO中读取所述负载数据,根据更新后的TCP流记录中指定的位置将所述负载数据写入负载数据缓冲区,完成重组和/或拼包,并将经过重组和/或拼包的TCP流数据上传给主机。
所述缓冲区数据管理模块负责负载数据的重组和拼接。
图5是本发明中缓冲区数据管理模块完成重组和/或拼包的步骤流程图,如图5所示,所述步骤400,包括下列步骤:
步骤410.缓冲区数据管理模块根据报文处理模块的结果,从FIFO中读出报文负载数据写入负载数据缓冲区;
写入的实际单元缓冲块地址是根据TCP流记录中的地址索引字段计算得到的单元缓冲块的物理地址。
步骤420.判断是否存在一条TCP流在缓冲区中存储的顺序数据长度超过一个预设值(如32KB),若是,则执行步骤430;否则,执行步骤440;
步骤430.缓冲区数据管理模块将拼好的顺序数据取出,根据当前处理报文的包头信息为这一段数据添加一个伪造包头,生成一个拼好的大包上传给主机;
步骤440.判断是否存在一条TCP流在缓冲区中存储的乱序数据长度超过一个预设值(如32KB),或是乱序数据超出了负载数据缓冲区的范围,若是,则执行步骤450;否则,返回步骤410;
较佳地,本发明是基于硬件实现,限制了分配给每一条TCP流的最大缓冲区空间,当缓存数据超出负载数据缓冲区的范围后,给主机上传负载数据缓冲区的所有数据,并释放这条TCP流分配到的所有单元缓冲块,然后将这条TCP流视作未发生乱序的流继续处理,以此防止嫌疑威胁流利用乱序TCP流耗尽系统的内存。
步骤450.缓冲区数据管理模块根据流记录中的缓存数据段描述符取出缓冲区中存储的乱序数据,生成拼好的大包上传给主机。
主机可以根据这个乱序数据的包头信息知道中间遗漏的数据的长度和遗漏数据的期待序列号,这样当遗漏的数据从网卡传过来时就可以在主机端进行重组的操作。
相应于本发明的一种TCP流重组拼包方法,还提供一种TCP流重组拼包装置,图6是本发明一种TCP流重组拼包装置的结构流程图,如图6所示,所述装置包括:报文处理模块1、缓冲区数据管理模块2、报文负载数据先入先出队列3、缓冲区分配模块4和缓存空间5,其中:
所述报文处理模块1,用于接收当前处理报文,将所述报文分成包头信息和负载数据两部分,将所述负载数据写入报文负载数据先入先出队列3,根据所述包头信息以及缓冲区分配模块4返回的单元缓冲块的地址索引更新TCP流记录,如果缓存当前处理报文需要申请新的单元缓冲块,向缓冲区分配模块发送分配缓冲区请求;
所述缓冲区数据管理模块2,用于根据所述包头信息从报文负载数据先入先出队列3中读取负载数据,根据更新后的TCP流记录中指定的位置将所述负载数据写入负载数据缓冲区完成重组和/或拼包,并将经过重组和/或拼包的TCP流数据上传给主机;
所述报文负载数据先入先出队列3,用于缓存报文的负载数据;
所述缓冲区分配模块4,采用哈希函数和位图文件的方式为当前处理报文的负载数据分配缓存空间5中空闲的单元缓冲块,返回空闲的单元缓冲块的地址索引;
缓存空间5,用于按照相应TCP流的报文顺序缓存乱序报文的报文负载数据。
其中,所述缓存空间5被划分成16个区域,每个区域中包括多个单元缓冲块,每个区域用一个位图文件记录该区域的使用情况,每一比特记录所述区域中的一个单元缓冲块是否已经分配;每一条TCP流在一个区域中只允许分配到一个指定位置上的单元缓冲块。
所述单元缓冲块的物理地址是由单元缓冲块地址索引字段Index和报文的四元组Tuples配合运算得到的,具体的过程为:预先设定好16个hash函数H(H[0],H[1]……H[15]),每个hash函数对应负载数据缓冲区的一个区域,Index[i]代表了负载数据缓冲区中的第i个单元缓冲块属于16个区域中的哪一个,H[Index[i]]代表了负载数据缓冲区中的第i个单元缓冲块是根据哪个hash函数得到的,则{Index[i],H[Index[i]](Tuples)}就是负载数据缓冲区中第i个单元缓冲块的物理地址基址。
所述报文处理模块1,包括:判断模块11和TCP流记录修改模块12,其中:
所述判断模块11,包括:
序列号判断子模块111,用于比较当前处理报文的序列号与当前所述TCP流记录中的期待序列号的关系;若等于,则触发乱数判断子模块;若大于,则触发所述TCP流记录修改模块;若当所述负载数据的序列号均小于当前所述TCP流记录中的期待序列号时,则将当前待处理报文被视为老数据包,不修改所述TCP流记录;否则,触发所述TCP流记录修改模块12;
乱数判断子模块112,用于判断负载数据缓冲区中是否存在乱序数据,若是,则触发相邻判断子模块113;否则,触发所述TCP流记录修改模块12;
相邻判断子模块113,用于判断当前处理报文与所述乱序数据是否相邻,若是,则触发所述TCP流记录修改模块12;否则,触发所述TCP流记录修改模块12;
所述TCP流记录修改模块12,用于根据所述判断模块的判断结果修改所述TCP流记录,更新缓存数据段描述符。
所述缓冲区分配模块4,包括:
接收模块41,用于接收当前处理报文的四元组;
计算模块42,用于使用与所述数据缓冲区5中多个区域对应的多个哈希函数对接收到的四元组进行计算,得到多个哈希运算结果;
访问模块43,用于以所述哈希运算结果为索引访问所述哈希运算结果对应的位图文件,读到多个1比特的数据;
0判断模块44,用于判断读到的多个1比特的数据中是否有“0”,若是,则表示对应所述区域中这个哈希运算结果索引的位置上的单元缓冲区块空闲,触发分配模块46;否则触发上传模块45;
上传模块45,不缓存当前处理报文,通知缓冲区数据管理模块2将这条TCP流的负载数据缓冲区缓存的所有数据和当前处理报文一并传给主机;
分配模块46,用于从读到的多个1比特的数据中任意选择一个“0”,将“0”在多个1比特的数据中的位置作为分配的单元缓冲块的地址索引,返还给报文处理模块1,并修改所述位图文件。
所述缓冲区数据管理模块2,包括:
负载数据读取模块21,用于从所述报文负载数据先入先出队列3中读出报文负载数据写入所述负载数据缓冲区;
阈值判断模块22,用于判断是否存在一条TCP流在负载数据缓冲区中存储的顺序数据长度超过一个预设值,若是,则触发顺序拼包模块23;否则,触发乱数阈值判断模块24;
顺序拼包模块23,用于将拼好的顺序数据取出,根据当前处理报文的包头信息为这一段数据添加一个伪造包头,生成一个拼好的大包上传给主机;
乱数阈值判断模块24,用于判断是否存在一条TCP流在负载数据缓冲区中存储的乱序数据长度超过一个预设值,或是乱序数据超出了负载数据缓冲区的范围,若是,则触发乱序拼包模块25;否则,触发负载数据读取模块21;
乱序拼包模块25,根据流记录中的缓存数据段描述符取出缓冲区中存储的乱序数据,生成拼好的大包上传给主机。
本发明的有益效果是:
1.对于大多数报文的重组和拼包可以通过硬件实现,减少了主机端与网卡的中断开销和主机端TCP流重组拼包的开销;
2.采用hash运算和位图文件分配空闲缓冲块的方式可以减少流记录中存储缓冲区地址所需的空间,也适合硬件并发处理完成分配操作;
3.本发明是基于硬件实现,限制了分配给每一条TCP流的最大缓冲区空间,以此防止嫌疑威胁流利用乱序TCP流耗尽系统的内存。
通过结合附图对本发明具体实施例的描述,本发明的其它方面及特征对本领域的技术人员而言是显而易见的。
以上对本发明的具体实施例进行了描述和说明,这些实施例应被认为其只是示例性的,并不用于对本发明进行限制,本发明应根据所附的权利要求进行解释。
Claims (14)
1.一种TCP流重组拼包方法,其特征在于,所述方法,包括下列步骤:
步骤100.报文处理模块接收当前处理报文,然后从TCP流记录表中找到该报文相关TCP流记录,将所述报文分成包头信息和负载数据两部分,并将所述负载数据写入报文负载数据先入先出队列;
步骤200.报文处理模块根据所述包头信息更新所述TCP流记录,并根据更新后的TCP流记录判断缓存当前处理报文是否需要申请新的单元缓冲块,若是,则执行步骤300;否则,执行步骤400;
步骤300.报文处理模块向缓冲区分配模块发送分配缓冲区请求,同时传递给缓冲区分配模块所述当前处理报文的四元组,缓冲区分配模块采用哈希函数和位图文件的方式为当前处理报文的负载数据分配负载数据缓冲区中空闲的单元缓冲块,返回空闲的单元缓冲块的地址索引;报文处理模块根据所述单元缓冲块的地址索引,更新所述TCP流记录得到新的TCP流记录;
步骤400.缓冲区数据管理模块获得所述新的TCP流记录,并从报文负载数据先入先出队列中读取所述负载数据,根据所述新的TCP流记录中指定的位置将所述负载数据写入负载数据缓冲区,完成重组和/或拼包,并将经过重组和/或拼包的TCP流数据上传给主机。
2.根据权利要求1所述的TCP流重组拼包方法,其特征在于,所述TCP流记录,记录了对一条TCP流进行重组拼包所需的信息,包括:客户端IP、服务器端IP、客户端端口、服务器端端口、TCP流状态,并为客户端至服务器端和服务器端至客户端两个方向各设置一个报文缓冲区管理字段,其中,每一个方向的报文缓冲区管理字段可分成以下几个部分:期待序列号,单元缓冲块有效位字段,单元缓冲块地址索引字段,期待序列号偏移字段,缓存数据段描述符,其中:
单元缓冲块有效位字段和单元缓冲块地址索引字段分别描述分配给这条TCP流负载数据缓冲区的各个单元缓冲块的状态信息;
期待序列号偏移字段,记录这条TCP连接在一个方向上期待的下一个顺序报文要存储在负载数据缓冲区中的偏移;
若干个缓存数据段描述符,每个缓存数据段描述符用于描述一段存放在负载数据缓冲区中的连续报文负载数据,由两个指针组成,两个指针分别指向该段负载数据在负载数据缓冲区的起始地址和结尾地址。
3.根据权利要求1所述的TCP流重组拼包方法,其特征在于,所述缓冲区分配模块将缓存空间划分成n个区域,每个区域中包括多个单元缓冲块,每个区域用一个位图文件记录该区域的使用情况,每一比特记录所述区域中的一个单元缓冲块是否已经分配;每一条TCP流在一个方向上的负载数据缓冲区由n个单元缓冲块构成,且一条TCP流在每个区域中只允许分配到一个单元缓冲块。
4.根据权利要求3所述的TCP流重组拼包方法,其特征在于,所述单元缓冲块的物理地址是由单元缓冲块地址索引字段Index和报文的四元组Tuples配合运算得到的,具体的过程为:预先设定好n个hash函数H(H[0],H[1]……H[n-1]),每个hash函数对应缓存空间的一个区域,Index[i]代表了负载数据缓冲区中的第i个单元缓冲块属于n个区域中的哪一个,H[Index[i]]代表了负载数据缓冲区中的第i个单元缓冲块是根据哪个hash函数得到的,则{Index[i],H[Index[i]](Tuples)}就是负载数据缓冲区中第i个单元缓冲块的物理地址基址。
5.根据权利要求2所述的TCP流重组拼包方法,其特征在于,所述步骤200,包括下列步骤:
步骤210.判断当前处理报文的序列号是否等于当前所述TCP流记录中的期待序列号;若是,则执行步骤220;否则,执行步骤240;
步骤220.判断负载数据缓冲区中是否存在乱序数据,若是,则执行步骤230;否则,所述期待序列号的值=当前期待序列号的值+报文长度的值;期待序列号偏移的值=当前期待序列号偏移的值+报文长度的值,执行步骤240;
步骤230.判断当前处理报文与所述乱序数据是否相邻,若是,则所述期待序列号的值=当前期待序列号的值+报文长度的值+拼好的乱序数据长度的值;期待序列号偏移的值=当前期待序列号偏移的值+报文长度的值+拼好的乱序数据长度的值,并更新缓存数据段描述符,执行步骤260;否则,所述期待序列号的值=当前期待序列号的值+报文长度的值;期待序列号偏移的值=当前期待序列号偏移的值+报文长度的值,更新缓存数据段描述符,执行步骤260;
步骤240.判断当前处理报文的序列号是否小于当前TCP流记录中的期待序列号,若是,则执行步骤250;否则按照当前报文的负载数据在其所属TCP流的负载数据缓冲区的存放位置更新缓存数据段描述符,执行步骤260;
步骤250.判断所述负载数据的序列号是否均小于当前所述TCP流记录中的期待序列号,若是,则当前待处理报文被视为老数据包,不修改所述TCP流记录;否则,所述期待序列号的值=当前期待序列号的值+当前待处理报文中新数据的长度的值;期待序列号偏移的值=期待序列号偏移的值+当前待处理报文中新数据的长度的值,更新缓存数据段描述符,执行步骤260;
步骤260.判断更新后的缓存数据段描述符是否要求分配新的单元缓冲块,若是,表示需要申请新的单元缓冲块;否则,表示不需要申请新的单元缓冲块。
6.根据权利要求4所述的TCP流重组拼包方法,其特征在于,所述步骤300,包括下列步骤:
步骤310.缓冲区分配模块接收当前处理报文的四元组,同时使用预设的所有哈希函数对所述四元组进行计算,得到多个哈希运算结果;
步骤320.缓冲区分配模块以所述哈希运算结果为索引访问所述哈希运算结果对应的位图文件,读到多个1比特的数据;
步骤330.判断读到的多个1比特的数据中是否有“0”,若是,则表示对应所述区域中这个哈希运算结果索引的位置上的单元缓冲区块空闲;否则执行步骤350;
步骤340.从多个1比特的数据中任意选择一个“0”,将“0”在多个1比特的数据中的位置作为分配的单元缓冲块的地址索引,返还给报文处理模块,并修改所述位图文件;
步骤350.不缓存当前处理报文,通知缓冲区数据管理模块将这条TCP流的缓存的所有数据和当前处理报文一并传给主机。
7.根据权利要求6所述的TCP流重组拼包方法,其特征在于,所述步骤400,包括下列步骤:
步骤410.缓冲区数据管理模块根据报文处理模块的结果,从所述先入先出队列中读出报文负载数据写入负载数据缓冲区;
步骤420.判断是否存在一条TCP流在缓冲区中存储的顺序数据长度超过一个预设值,若是,则执行步骤430;否则,执行步骤440;
步骤430.缓冲区数据管理模块将拼好的顺序数据取出,根据当前处理报文的包头信息为这一段数据添加一个伪造包头,生成一个拼好的大包上传给主机;
步骤440.判断是否存在一条TCP流在缓冲区中存储的乱序数据长度超过一个预设值,或是乱序数据超出了负载数据缓冲区的范围,若是,则执行步骤450;否则,返回步骤410;
步骤450.缓冲区数据管理模块根据流记录中的缓存数据段描述符取出缓冲区中存储的乱序数据,生成拼好的大包上传给主机。
8.一种TCP流重组拼包装置,其特征在于,所述装置,包括:
报文处理模块,用于接收当前处理报文,将所述报文分成包头信息和负载数据两部分,将所述负载数据写入报文负载数据先入先出队列,根据所述包头信息以及缓冲分配模块的地址索引更新TCP流记录;如果缓存当前处理报文需要申请新的单元缓冲块,向缓冲区分配模块发送分配缓冲区请求;
缓冲区数据管理模块,用于根据所述包头信息从报文负载数据先入先出队列中读取负载数据,根据更新后的TCP流记录中指定的位置将所述负载数据写入负载数据缓冲区,完成重组和/或拼包,并将经过重组和/或拼包的TCP流数据上传给主机;
报文负载数据FIFO,用于缓存报文的负载数据;
缓冲区分配模块,采用哈希函数和位图文件的方式为当前处理报文的负载数据分配负载数据缓冲区中空闲的单元缓冲块,返回空闲的单元缓冲块的地址索引;
缓存空间,用于按照相应TCP流的报文顺序缓存乱序报文的报文负载数据。
9.根据权利要求8所述的TCP流重组拼包装置,其特征在于,所述TCP流记录,记录了对一条TCP流进行重组拼包所需的信息,包括:客户端IP、服务器端IP、客户端端口、服务器端端口、TCP流状态,并为客户端至服务器端和服务器端至客户端两个方向各设置一个报文缓冲区管理字段,其中,每一个方向的报文缓冲区管理字段可分成以下几个部分:期待序列号,单元缓冲块有效位字段,单元缓冲块地址索引字段,期待序列号偏移字段,缓存数据段描述符,其中:
单元缓冲块有效位字段和单元缓冲块地址索引字段分别描述分配给这条TCP流的负载数据缓冲区的各个单元缓冲块的状态信息;
期待序列号偏移字段,记录这条TCP连接在一个方向上期待的下一个顺序报文要存储在负载数据缓冲区中的偏移;
若干个缓存数据段描述符,每个缓存数据段描述符用于描述一段存放在负载数据缓冲区中的连续报文负载数据,由两个指针组成,两个指针分别指向该段负载数据在负载数据缓冲区的起始地址和结尾地址。
10.根据权利要求8所述的TCP流重组拼包装置,其特征在于,所述缓存空间被划分成n个区域,每个区域中包括多个单元缓冲块,每个区域用一个位图文件记录该区域的使用情况,每一比特记录所述区域中的一个单元缓冲块是否已经分配;每一条TCP流在一个方向上的负载数据缓冲区由n个单元缓冲块构成,且一条TCP流在每个区域中只允许分配到一个单元缓冲块。
11.根据权利要求10所述的TCP流重组拼包装置,其特征在于,所述单元缓冲块的物理地址是由单元缓冲块地址索引字段Index和报文的四元组Tuples配合运算得到的,具体的过程为:预先设定好n个hash函数H(H[0],H[1]……H[n-1]),每个hash函数对应缓存空间的一个区域,Index[i]代表了负载数据缓冲区中的第i个单元缓冲块属于n个区域中的哪一个,H[Index[i]]代表了负载数据缓冲区中的第i个单元缓冲块是根据哪个hash函数得到的,则{Index[i],H[Index[i]](Tuples)}就是负载数据缓冲区中第i个单元缓冲块的物理地址基址。
12.根据权利要求8所述的TCP流重组拼包装置,其特征在于,所述报文处理模块,包括:判断模块和TCP流记录修改模块,其中:
所述判断模块,包括:
序列号判断子模块,用于比较当前处理报文的序列号与当前所述TCP流记录中的期待序列号的关系;若等于,则触发乱数判断子模块;若大于,则触发所述TCP流记录修改模块;若当所述负载数据的序列号均小于当前所述TCP流记录中的期待序列号时,则将当前待处理报文被视为老数据包,不修改所述TCP流记录直接上传给主机;否则,触发所述TCP流记录修改模块;
乱数判断子模块,用于判断负载数据缓冲区中是否存在乱序数据,若是,则触发相邻判断子模块;否则,触发所述TCP流记录修改模块;
相邻判断子模块,用于判断当前处理报文与所述乱序数据是否相邻,若是,则触发所述TCP流记录修改模块;否则,触发所述TCP流记录修改模块;
所述TCP流记录修改模块,用于根据所述判断模块的判断结果修改所述TCP流记录,更新缓存数据段描述符。
13.根据权利要求8所述的TCP流重组拼包装置,其特征在于,所述缓冲区分配模块,包括:
接收模块,用于接收当前处理报文的四元组;
计算模块,用于使用与所述数据缓冲区中多个区域对应的多个哈希函数对接收到的四元组进行计算,得到多个哈希运算结果;
访问模块,用于以所述哈希运算结果为索引访问所述哈希运算结果对应的位图文件,读到多个1比特的数据;
0判断模块,用于判断读到的多个1比特的数据中是否有“0”,若是,则表示对应所述区域中这个哈希运算结果索引的位置上的单元缓冲区块空闲,触发分配模块;否则触发上传模块;
上传模块,不缓存当前处理报文,通知缓冲区数据管理模块将这条TCP流的负载数据缓冲区缓存的所有数据和当前处理报文一并传给主机;
分配模块,用于从读到的多个1比特的数据中任意选择一个“0”,将“0”在多个1比特的数据中的位置作为分配的单元缓冲块的地址索引,返还给报文处理模块,并修改所述位图文件。
14.根据权利要求8所述的TCP流重组拼包装置,其特征在于,所述缓冲区数据管理模块,包括:
负载数据读取模块,用于从所述先入先出队列中读出报文负载数据写入所述负载数据缓冲区;
阈值判断模块,用于判断是否存在一条TCP流在负载数据缓冲区中存储的顺序数据长度超过一个预设值,若是,则触发顺序拼包模块;否则,触发乱数阈值判断模块;
顺序拼包模块,用于将拼好的顺序数据取出,根据当前处理报文的包头信息为这一段数据添加一个伪造包头,生成一个拼好的大包上传给主机;
乱数阈值判断模块,用于判断是否存在一条TCP流在缓冲区中存储的乱序数据长度超过一个预设值,或是乱序数据超出了负载数据缓冲区的范围,若是,则触发乱序拼包模块;否则,触发负载数据读取模块;
乱序拼包模块,根据流记录中的缓存数据段描述符取出缓冲区中存储的乱序数据,生成拼好的大包上传给主机。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010101759548A CN101841545B (zh) | 2010-05-14 | 2010-05-14 | 一种tcp流重组拼包方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010101759548A CN101841545B (zh) | 2010-05-14 | 2010-05-14 | 一种tcp流重组拼包方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101841545A CN101841545A (zh) | 2010-09-22 |
CN101841545B true CN101841545B (zh) | 2012-08-01 |
Family
ID=42744668
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2010101759548A Active CN101841545B (zh) | 2010-05-14 | 2010-05-14 | 一种tcp流重组拼包方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101841545B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106330820A (zh) * | 2015-06-18 | 2017-01-11 | 上海交通大学 | 基于mmt协议传输及重组非时序媒体的包头设计方法 |
Families Citing this family (28)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102075525B (zh) * | 2010-12-17 | 2014-07-23 | 曙光信息产业(北京)有限公司 | 一种通过软件向硬件发送连接无效请求实现删除硬件中tcp连接的方法 |
CN102082688B (zh) * | 2010-12-17 | 2014-08-13 | 曙光信息产业(北京)有限公司 | 一种软硬件结合实现tcp乱序缓冲区管理的方法 |
CN102096619A (zh) * | 2010-12-17 | 2011-06-15 | 天津曙光计算机产业有限公司 | 一种基于tcp流的验证方法 |
CN102256182A (zh) * | 2011-07-26 | 2011-11-23 | 重庆大唐科技股份有限公司 | 一种基于rtp协议的视频流分片组帧方法 |
CN102404223B (zh) * | 2011-11-28 | 2015-03-25 | 曙光信息产业(北京)有限公司 | 一种多应用收包细粒度优先级控制系统和方法 |
CN102521095B (zh) * | 2011-12-19 | 2013-11-20 | 盛科网络(苏州)有限公司 | 队列乱序的芯片模拟方法及系统 |
CN103117948B (zh) * | 2013-02-22 | 2016-04-06 | 桂林电子科技大学 | 基于fpga的分级并行高速网络tcp流重组方法 |
CN104253863B (zh) * | 2014-09-15 | 2017-07-28 | 重庆邮电大学 | 一种基于Hadoop平台和分布式处理编程模型的TCP流重组方法 |
CN105743728A (zh) * | 2014-12-11 | 2016-07-06 | 杭州迪普科技有限公司 | 一种保证数据块顺序的方法及装置 |
CN105939297B (zh) * | 2015-10-26 | 2019-03-15 | 杭州迪普科技股份有限公司 | 一种tcp报文重组方法和装置 |
CN106911644A (zh) * | 2015-12-23 | 2017-06-30 | 中国移动通信集团广西有限公司 | 一种报文重组方法和设备 |
CN105516191B (zh) * | 2016-01-13 | 2019-08-20 | 成都市智讯联创科技有限责任公司 | 基于fpga实现的万兆网tcp协议卸载引擎toe的系统 |
CN105939223A (zh) * | 2016-06-01 | 2016-09-14 | 杭州迪普科技有限公司 | 存储数据的方法及装置 |
CN106230744B (zh) * | 2016-07-26 | 2019-04-16 | 京信通信系统(中国)有限公司 | 一种数据流乱序重组的方法及转发设备 |
CN108134751B (zh) * | 2017-12-12 | 2020-08-04 | 杭州迪普科技股份有限公司 | 一种tcp分段报文待检测文本重组方法及装置 |
CN110247942B (zh) * | 2018-03-09 | 2021-09-07 | 腾讯科技(深圳)有限公司 | 一种数据发送方法、装置和可读介质 |
CN109688063B (zh) * | 2018-11-14 | 2021-05-18 | 华为技术有限公司 | 一种大型接收卸载功能的设置方法和装置 |
CN110138809A (zh) * | 2019-06-27 | 2019-08-16 | 西安微电子技术研究所 | 一种面向以太网控制器接收链路的tcp报文拼接系统和方法 |
CN110535827B (zh) * | 2019-07-17 | 2021-08-24 | 华东计算技术研究所(中国电子科技集团公司第三十二研究所) | 实现多连接管理的tcp协议全卸载ip核的方法及系统 |
EP4024789A4 (en) * | 2019-09-16 | 2022-12-14 | Huawei Technologies Co., Ltd. | METHOD FOR DETECTING AN UNORDERED MESSAGE FLOW, METHOD FOR PROCESSING MESSAGES AND ASSOCIATED DEVICE |
CN110855584B (zh) * | 2019-10-16 | 2022-02-01 | 武汉绿色网络信息服务有限责任公司 | 一种tcp乱序重组的方法和装置 |
CN110958331A (zh) * | 2019-12-27 | 2020-04-03 | 视联动力信息技术股份有限公司 | 一种数据传输方法及终端 |
CN112416820B (zh) * | 2020-11-04 | 2022-05-27 | 国网山东省电力公司信息通信公司 | 一种数据包分类存储方法及系统 |
CN113364862B (zh) * | 2021-06-03 | 2022-10-11 | 上海天旦网络科技发展有限公司 | 一种拼包解码系统及方法 |
CN114024924B (zh) * | 2022-01-05 | 2022-04-12 | 北京安博通科技股份有限公司 | 一种tcp流重组方法、装置、电子设备及存储介质 |
CN114827312B (zh) * | 2022-05-09 | 2022-09-16 | 浙江锐文科技有限公司 | 在智能网卡/dpu内自适应延迟及吞吐率需求的方法及装置 |
CN115208830B (zh) * | 2022-05-27 | 2023-09-08 | 上海大学 | 一种高性能无阻塞数据发送方法及装置 |
CN114866343A (zh) * | 2022-07-04 | 2022-08-05 | 支付宝(杭州)信息技术有限公司 | 数据处理方法及装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1753354A (zh) * | 2005-10-25 | 2006-03-29 | 华中科技大学 | 基于arq信息的基站tcp代理确认方法及其系统 |
CN1937544A (zh) * | 2006-11-13 | 2007-03-28 | 陈哲 | Ip电话监听系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090161568A1 (en) * | 2007-12-21 | 2009-06-25 | Charles Kastner | TCP data reassembly |
-
2010
- 2010-05-14 CN CN2010101759548A patent/CN101841545B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1753354A (zh) * | 2005-10-25 | 2006-03-29 | 华中科技大学 | 基于arq信息的基站tcp代理确认方法及其系统 |
CN1937544A (zh) * | 2006-11-13 | 2007-03-28 | 陈哲 | Ip电话监听系统 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106330820A (zh) * | 2015-06-18 | 2017-01-11 | 上海交通大学 | 基于mmt协议传输及重组非时序媒体的包头设计方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101841545A (zh) | 2010-09-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101841545B (zh) | 一种tcp流重组拼包方法和装置 | |
US7447230B2 (en) | System for protocol processing engine | |
CN101650698B (zh) | 直接存储器访问的实现方法 | |
CN102045258B (zh) | 数据缓存管理方法及装置 | |
CN108234348B (zh) | 一种队列操作中的处理方法及装置 | |
CN108366111B (zh) | 一种用于交换设备的数据包低时延缓存装置与方法 | |
CN102195874A (zh) | 数据分组的预提取 | |
CN107733813B (zh) | 报文转发方法及装置 | |
US20080091789A1 (en) | Distributed Multi-Media Server System, Multi-Media Information Distribution Method, Program Thereof, and Recording Medium | |
CN103780506A (zh) | 一种用于以太网设备的数据缓存系统及方法 | |
CN101150485A (zh) | 一种零拷贝缓冲区队列网络数据发送的管理方法 | |
CN103023808A (zh) | 基于块状链表结构的6lowpan数据包重装缓存方法 | |
CN107479833B (zh) | 一种面向键值存储的远程非易失内存访问与管理方法 | |
CN101150486A (zh) | 一种零拷贝缓冲区队列网络数据接收的管理方法 | |
US7000073B2 (en) | Buffer controller and management method thereof | |
US6697923B2 (en) | Buffer management method and a controller thereof | |
CN117938787B (zh) | 一种消息批量传输的仿真系统及其实现方法 | |
CN110650182B (zh) | 网络缓存方法、装置、计算机设备及存储介质 | |
CN101309194A (zh) | Spi4.2总线桥接实现方法及spi4.2总线桥接器件 | |
CN100499563C (zh) | 提高分组应用的存储器存取效率 | |
US20150006828A1 (en) | Memory architecture determining the number of replicas stored in memory banks or devices according to a packet size | |
WO2023030195A1 (zh) | 缓存管理方法和装置、控制程序及控制器 | |
CN116489250A (zh) | 一种基于共享内存通信模式的栈内零拷贝发送路径方法 | |
CN112698950B (zh) | 一种用于工业物联网边缘设备的内存优化方法 | |
Chen et al. | SRB: Shared running buffers in proxy to exploit memory locality of multiple streaming media sessions |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |