CN113139100B - 一种网络流量实时索引方法及系统 - Google Patents
一种网络流量实时索引方法及系统 Download PDFInfo
- Publication number
- CN113139100B CN113139100B CN202110457333.7A CN202110457333A CN113139100B CN 113139100 B CN113139100 B CN 113139100B CN 202110457333 A CN202110457333 A CN 202110457333A CN 113139100 B CN113139100 B CN 113139100B
- Authority
- CN
- China
- Prior art keywords
- offset
- node
- linked list
- data
- attribute value
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9014—Indexing; Data structures therefor; Storage structures hash tables
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9024—Graphs; Linked lists
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9027—Trees
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computational Linguistics (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明提供一种用于构建数据包的索引的方法,其中所述索引采用哈希字典树方式存储数据包的属性值,所述属性值按照预定的规则被分成n段,所述哈希字典树包括树节点、偏移量链表头节点和偏移量节点,所述偏移量节点用于存储数据包的全局偏移量以及下一个偏移量节点的指针,所述偏移量链表头节点用于存储属性值与偏移量链表的第一个偏移量节点的指针,所述树节点为大小为M的指针数组,指针数组的每一元素用于存储指向下一层树节点的指针或指向偏移量链表头节点的指针,n和M为正整数。相比于现有其他方案,本发明在建索引时间、索引空间开销、查询效率以及扩展性方面取得了明显优势,达到了预期目的。
Description
技术领域
本发明涉及数据包索引技术和全流量存贮技术、以及基于流量存贮的故障定位、入侵取证、攻击溯源等设备和方案。
背景技术
随着互联网的高速发展,诸如网络攻击、网络故障之类的安全事件也频繁出现。当这些安全事件发生后,人们通常需要用到现场的网络流量来进行司法取证或者故障定位,这就要求人们实时全量地记录网络环境中的流量。同时,为满足时效性与可用性的要求,网络流量还必须支持快速检索。实现网络流量实时存储与快速检索的核心在于索引方法的设计,考虑到现有网络链路速度快、数据规模大的特点,流量的索引方法必须满足以下三个方面的要求:1.建索引速度快,能够实时地为高速到达的流量建立索引,并且无丢包;2.索引空间占用少,尽可能减少对流量存储空间的挤占,延长监控周期;3.查询效率高,能在海量流量中快速检索出期望的数据,实现对网络安全事件的快速响应。
因为流量索引方法所存在的巨大应用价值及挑战性,现有许多研究工作都围绕其展开。其中,最具代表性的三类为:摘要索引、bitmap索引以及k-ary树索引。
摘要索引是一种较为经典的索引技术,最早在流量存储系统n2disk中使用。其工作原理为提取被索引属性的值单独形成一个索引文件,检索时先扫描摘要,再精确提取数据包,相比于传统方式,减少了需要I/O的数据量,节约了检索时间。不过摘要索引本质上还是用线性扫描的方式来查找匹配数据包,所以其检索效率很低。后来,FlowSIS系统中对摘要索引作出改进,该系统通过先对摘要排序,然后再进行折半查找的方法加速了检索过程,但由于检索时还是需要将所有摘要内容读入内存,其效率相比于其它索引方法,仍然较低。此外,由于摘要排序需要消耗大量计算资源, FlowSIS只能以流为单位进行索引,适用场景有限。
bitmap索引主要用于流数据的索引,通过适当改进,也可支持对网络流量的索引。数据包存储系统pcapIndex与交互式网络司法平台vast均采用此索引方法,在检索效率方面获得了极大的提升,同时支持丰富的查询类型。然而,对于bitmap索引,尽管人们提出了许多索引压缩方法,但其始终存在着索引规模偏大的问题。此外,其建索引速度一般,难以支持高速链路下的数据包实时索引。
k-ary树索引将被索引属性按k bit等分成多段,每段对应树的一层节点,从k-ary树的根节点到叶子节点的一条路径能够唯一确定一个索引属性值。检索时,从树的根节点递归向下搜索,就能快速获取所有匹配数据包的精确位置,实现高效的查询反馈。k-ary树索引的主要问题在于对较长的索引字段或者共享前缀特征差的流量,其索引的时间开销与空间开销都将明显增长。比如对于IPv6地址,k-ary树索引的空间开销将增加到难以接受的地步。
通过以上分析,可以发现现有流量索引方法均存在一定缺陷。因此,有必要设计实现一种插入速度快、空间占用少、查询效率高的新型流量索引技术。
发明内容
本发明针对上述问题,根据本发明的第一方面,提出一种用于构建数据包的索引的方法,其中所述索引采用哈希字典树方式存储数据包的属性值,所述属性值按照预定的规则被分成n段,所述哈希字典树包括树节点、偏移量链表头节点和偏移量节点,所述偏移量节点用于存储数据包的全局偏移量以及下一个偏移量节点的指针,所述偏移量链表头节点用于存储属性值与偏移量链表的第一个偏移量节点的指针,所述树节点为大小为M的指针数组,指针数组的每一元素用于存储指向下一层树节点的指针或指向偏移量链表头节点的指针,n和M为正整数,包括:
步骤100:为收到的第一个数据包的属性值建立根树节点,为该属性值分配一个偏移量链表头节点,并在该偏移量链表头节点中存储该属性值,在该根树节点的属性值第0段使用的数组元素中写入指向该偏移量链表头节点的指针,分配一个偏移量节点,在所述偏移量节点中写入当前属性值对应的数据包偏移量,然后将所述偏移量节点插入到该偏移量链表头节点的偏移量链表中;
步骤110:以所述根树节点作为当前查询节点执行如下步骤:
步骤200:接收下一数据包,将所述属性值按照所述预定规则分为n 段,i为属性段计数器,i=0,1,…,n-1,其初始化为0,执行下列步骤:
步骤201:确定在所述当前查询节点中属性值第i段所使用的元素E 的状态,
A)如果E为空:分配一个偏移量链表头节点LHA,并写入当前属性值,更新E为偏移量链表头节点LHA的指针,新分配一个偏移量节点,并写入当前属性值对应的数据包偏移量,然后插入LHA的偏移量链表,转移到步骤200;
B)如果E为指向偏移量链表头节点的指针:比较当前属性值与E
中偏移量链表头节点LHB所存储的属性值是否相同,如果相同,新分配一个偏移量节点,并在所述偏移量节点中写入当前属性值对应的数据包偏移量,然后插入该属性值的偏移量链表;如果不同,新分配一个树节点,将偏移量链表头节点LHB的指针写入新分配树节点的 LHB属性值第i+1段对应的元素,将新分配的树节点作为所述当前查询节点,i值加1,重复步骤201;
C)如果E为指向下一层树节点的指针:则根据该指针找到下一层树节点,将其作为所述当前查询节点,i值加1,重复步骤201。
在本发明的一个实施例中,所述数据包包括多种属性,对数据包的每一种属性分别建立哈希字典树。
在本发明的一个实施例中,所述数据包的属性包括与该数据包相关的五元组和/或时间戳,所述五元组包括源IP地址、源端口号、目的IP地址、目的端口号、以及协议号。
在本发明的一个实施例中,包括:
步骤10:捕获数据包,分别将每个数据包和其索引属性值存储到数据包缓冲区和摘要缓冲区;
步骤20:在数据包缓冲区或摘要缓冲区之一满时,执行权利要求1-3 之一的方法,建立相应的哈希字典树;
步骤30:将数据包缓冲区中的数据包写入数据文件,将各属性对应的哈希字典树写入索引文件,并记录数据文件与索引文件的关联关系。
在本发明的一个实施例中,其中,将各属性对应的哈希字典树写入索引文件包括对偏移量链表的压缩,包括步骤:
偏移量链表压缩使用的编码结构包括一个或多个块,所述块包括元数据字与数据字,其中,
元数据字用于存储块的元数据信息,包括块内元素个数block len,块数据公共前缀,以及第一个元素的低字节low_bytes,
数据字用于存储块内其他元素的低二字节,包括一个或多个字。
在本发明的一个实施例中,对偏移量链表的压缩还包括:
步骤1000:提取偏移量链表的第一个节点的偏移量的前缀IniPrefix,创建第一个块,以IniPrefix作为第一个块的公共前缀,以第一个节点的偏移量的低两位作为元数据字的low_bytes,将第一个块作为当前块;
步骤2000:如果偏移量链表没有下一个元素,则结束,否则取出偏移量链表的下一元素EOffset,检查当前块的前缀是否与EOffset的前缀相同,如果相同,则执行步骤2010,如果不同,则执行步骤2020:
步骤2010:将EOffset加入当前块,包括将EOffset的低二字节存入数据字中,执行步骤2000;
步骤2020:创建新块,并以EOffset的前缀作为新块的公共前缀,并将EOffset的低二字节作为metadata word的low_bytes,将新块作为当前块,执行步骤2000。
在本发明的一个实施例中,在步骤2000中,在创建新块时,在上一块的元数据字的block len中写入上一块的存储元素个数。
根据本发明的第二方面,提供一种采用多线程捕获数据包的数据记录包的方法,其中对每一捕获线程,设置一个捕获标识变量,以允许或者禁止所述线程对其缓冲区进行写入数据,还设置一个全局缓冲区状态标识变量,以允许或者禁止所有捕获线程向其各自的缓冲区中写入数据,所述方法包括:
步骤3:在任一捕获线程缓冲区满时,设置其捕获标识变量以禁止所述捕获线程对其缓冲区进行写入数据;
步骤4:通过原子交换操作置全局缓冲区状态标识变量,以禁止所有捕获线程向其各自的缓冲区中写入数据,然后等待其余线程的捕获标识变量被设置为禁止所述线程对其缓冲区进行写入数据;
步骤5:根据本发明的用于构建数据包的索引的方法,建立相应的哈希字典树,然后将全局缓冲区状态标识变量设置为允许所有捕获线程向其各自的缓冲区中写入数据,将所述线程的捕获标识变量设置为以允许所述捕获线程对其缓冲区进行写入数据。
根据本发明的第三方面,提供一种计算机可读存储介质,其中存储有一个或者多个计算机程序,所述计算机程序在被执行时用于实现本发明的构建数据包的索引的方法。
根据本发明的第四方面,提供一种计算系统,包括:存储装置、以及一个或者多个处理器;其中,所述存储装置用于存储一个或者多个计算机程序,所述计算机程序在被所述处理器执行时用于实现本发明的构建数据包的索引的方法。
与现有技术相比,本发明的优点在于:1.采用属性值的最短不相交前缀来建立索引,相比于现有方案通用的全字段索引模式,其属性值中参与索引建立的字段的平均长度更短,时间效率与空间效率也就更高。2.基于共享前缀的倒排列表压缩编码,其主要具有以下优点:首先是明显降低索引存储的空间开销以及检索时的I/O时间开销;其次是实现简单,运算速度快,此编码方案通过简单的逻辑与、或、移位运算就可以实现,相较于其他方案,其编解码速度极为优秀;3.按数据的前缀分块,这样对两个列表执行如求交集等逻辑运算时,首先比较其前缀,如果前缀不同的话,那么就不用继续比较块内元素了,跳过了前缀不同的数据,减少了比较次数,因此具有隐含跳表结构,可以大幅优化检索时相关逻辑运算的计算速度,加速检索。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本发明的实施例,并与说明书一起用于解释本发明的原理。显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
图1示出了根据本发明实施例的IPv4地址哈希字典树索引示例图;
图2示出了根据本发明实施例的偏移量列表压缩编码模式图;
图3示出了根据本发明实施例的偏移量列表压缩编码示例图;
图4示出了根据本发明实施例的实时索引系统架构图;
图5示出了根据本发明实施例的数据包捕获模块工作状态图。
图6示出了根据本发明实施例的哈希字典树文件结构图。
具体实施方式
针对背景技术中提出的问题,发明人进行了研究,提出一种针对网络流量的实时索引方案,其工作原理为首先在线捕获数据包,并提取待索引属性值生成索引摘要,然后以索引摘要中属性值的最短不相交前缀为键,建立属性值到数据包偏移量列表的一一映射关系,最后将这种映射关系经压缩处理后记录到文件,以供后续查询使用。按照此方案,能实时地为高速网络中的流量建立索引,并保持良好的空间效率与查询反馈效率。
索引属性值提取自数据包属性,例如,可以包括数据包的五元组和时间戳,五元组包括源IP地址、源端口号、目的IP地址、目的端口号、以及协议号。索引属性值也简称为属性值。
网络流量实时索引过程以流水线方式执行,共包含三个步骤,具体描述如下:
步骤10:实时捕获数据包,对每个数据包,提取索引属性值生成索引摘要,然后将数据包和摘要分别写入各自对应的内存缓冲区。当缓冲区满时,触发步骤2。
步骤20:提取摘要缓冲区中所有属性值的最短不相交前缀作为键,通过基于直接寻址的哈希字典树,在内存中建立起属性值到偏移量倒排列表的一一映射关系,其中偏移量倒排列表记录了包含其对应属性值的所有数据包在文件中的精确位置。各属性对应的哈希字典树构建完成后,触发步骤3。
步骤30:将内存缓冲区中的数据包写入数据文件,将各属性对应的哈希字典树压缩后写入索引文件,并记录数据文件与索引文件的关联关系。
1.哈希字典树
其中在步骤2的实时索引流程中,通过哈希字典树建立索引属性值到偏移量倒排列表的一一映射关系。哈希字典树由3部分组成:1.树节点,为大小为M的指针数组,M为正整数,例如大小为256的指针数组。每个指针数组中元素有三种取值:为空、指向下一层树节点、指向偏移量链表头节点;2.偏移量链表头节点,包含两个区域,分别记录偏移量链表对应的属性值与偏移量链表的第一个偏移量节点的指针;3.偏移量节点,记录一个数据包的全局偏移量以及下一个偏移量节点的指针。其中每个偏移量链表头节点有一个由一个或多个偏移量节点组成的偏移量链表。
以图1为例,在树节点2中第10和20元素非空,其它为空,第10 元素指向下一层树节点—树节点3,第20元素指向偏移量链表头节点,该节点包括两个部分,一个为偏移量链表对应的属性值,即10.20.10.1,另一个为第一个偏移量节点的指针,即指向偏移量节点8000的指针。
属性值需要分段,分段后,每段可包含的值与树节点的数组大小相同,例如,对于数组大小为256的树节点数组,属性值段有8个比特位,8个比特位可以形成28个值,即0,1,2…255的256不同的值,每个值使用指针数组元素中的一个对应的元素,简单对应方式为属性值段值x使用指针数组元素中下标为x的元素,本发明的实施例使用这种对应方法。因此将一个属性值,可以按8比特等分成n段,分别为第0、第1、…第n-1属性值段,n值为属性长度除以8,n为正整数。例如对IPv4地址,其使用32 位(4字节)地址,因此可以将其分成4段(n=32/8=4),IPv4地址通常使用点分十进制表示,例如192.196.2.1,分为4段后,每一段用二进制表示分别为1100 0000、1100 0100、10、1,用十进制表示则为192、196、2、1,每个属性值段使用一个树节点的数组中的一个元素,因为有4段,因此需要用4个树节点,属性值第i段使用或对应的树节点称为第i层树节点, i=0,1,2,…n-1,例如192.196.2.1的第0段为192,对应第0层树节点1, 192.196.2.1的第1段为196,对应第1层树节点4。采有本发明的最短不相交前缀的方法可以减少使用的树节点。
树节点4的数组的第196元素存储偏移量链表头节点的指针,该偏移量链表头节点存储的属性值为192.196.2.1,该偏移量链表头节点还存储了属性值192.196.2.1的偏移量链表的第一个偏移量节点的指针,该第一个偏移量节点存储了偏移量30000。
1.1最短不相交前缀
在图1中根节点为树节点1,树节点1为第0层,树节点2和树节点 4为第1层,树节点3为第2层,因为采用了最短不相交前缀的策略,因此没有建立4层,只建立了3层。在最短不相交前缀中,前缀指属性值段从第0段开始以段序号从小到大为顺序的一个或多个属性值段,最短不相交前缀为与其他属性值的任何前缀都不同的最短的前缀,例如仅考虑192.168.2.1与192.196.2.1两个属性值,它们有相同前缀192,而最短不相交前缀为192.168和192.196,只需为最短不相交前缀建立树节点,其后的属性值段无需建立树节点,即只需为192.168和192.196建立树节点,所建立的树节点为树节点1和树节点4。
每个最短不相交前缀在它的多层树节点中的每一个树节点中仅使用一个元素,从根节点开始,从上到下,每一层树节点所使用的元素的下标一起构成一个路径。该路径可以用来表示一个IPv4前缀,并能唯一标识一个IPv4地址,例如192.168.2.1的路径为192/168,而192.196.2.1的路径为192/196,路径192/168可以从两个路径中唯一的标识出192.168.2.1,路径192/196可以从从两个路径中唯一的标识出192.196.2.1。
考虑属性值包含10.10.10.1、10.10.20.1、10.20.2.1、192.168.2.1、192.196.2.1的情况,其最短不相交前缀为10.10.10、10.10.20、10.20、192.168、 192.196,则按最短不相交前缀构建的哈希字典树结构如图1所示,一共建立了4个树节点:树节点1、树节点2、树节点4、树节点3。
1.2构建哈希字典树
以下为构建哈希字典树的过程,首先为第一个数据包的属性值建立根树节点,对该属性值分段,为该属性值分配一个偏移量链表头节点,在偏移量链表头节点中存储该属性值,在该根树节点的属性值第0段使用的数组元素中写入偏移量链表头节点指针,分配一个偏移量节点,并写入当前属性值对应的数据包偏移量,然后插入该偏移量链表头节点的偏移量链表。
步骤110:以所述根树节点作为当前查询节点执行如下步骤:
步骤200:对后续数据包,其属性值的偏移量链表头节点可能已经创建,也可能还没有创建,将该属性值称为当前属性值,将其分为n段,i 为属性段计数器,i=0,1,…,n-1,其初始化为0,执行下列步骤:
步骤201:确定在所述当前查询节点中属性值第i段所使用的元素E 的状态,
A)如果E为空:分配一个偏移量链表头节点LHA,并写入当前属性值,更新E为偏移量链表头节点LHA的指针,新分配一个偏移量节点,并写入当前属性值对应的数据包偏移量,然后插入LHA的偏移量链表,转移到步骤200;
B)如果E为指向偏移量链表头节点的指针:比较当前属性值与E 中偏移量链表头节点LHB所存储的属性值是否相同,如果相同,新分配一个偏移量节点,并在所述偏移量节点中写入当前属性值对应的数据包偏移量,然后插入该属性值的偏移量链表;如果不同,新分配一个树节点,将偏移量链表头节点LHB的指针写入新分配树节点的LHB属性值第i+1 段对应的元素,将新分配的树节点作为所述当前查询节点,i值加1,重复步骤201;
C)如果E为指向下一层树节点的指针:则根据该指针找到下一层树节点,将其作为所述当前查询节点,i值加1,重复步骤201。
对于新增数据的属性值192.167.1.1,在处理第1层时,重复步骤201 的处理如下:属性值第1段使用的元素E为树节点4数组第167元素,属于情况A,为其分配一个偏移量链表头节点LHA,并写入当前属性值 192.167.1.1,更新E为LHA的指针,新分配一个偏移量节点,并写入当前属性值192.167.1.1对应的数据包偏移量,然后插入192.167.1.1的偏移量链表。
在图1的基础上,新增数据的属性值为10.20.10.1,在处理第1层时,第1属性值段使用的元素E为树节点2数组第20元素,属于情况B,比较当前属性值10.20.10.1与偏移量链表头节点所存储的属性值是否相同,由于相同,新分配一个偏移量节点,并写入当前属性值10.20.10.1对应的数据包偏移量,然后插入10.20.10.1的偏移量链表。
在图1的基础上,新增数据的属性值为10.10.20.2,在处理第2层时,第2层属性值段20使用的元素E为树节点3的数组第20元素,属于情况 B,比较当前属性值10.10.20.2与偏移量链表头节点LHB所存储的属性值 10.10.20.1是否相同,由于不同,新分配一个树节点,将偏移量链表头节点LHB的指针写入新分配树节点的数组的第1个元素(LHB属性值10.10.20.1的第3段为1,属性值段值1使用第1个元素),将新分配的树节点作为下一层树节点,在下一层树节点重复本步骤201。对于属性值 10.10.20.2,在处理第3层时,重复步骤201的处理如下:第3层属性值段 2使用的元素E为新增树节点的第2元素,属于情况A,按照情况A的处理。
为了方便后续的处理,在偏移量链表中的元素要进行从小到大的排序,该排序可以在插入链表时进入,也可以在写入索引文件前进行。
以下为具体实现算法示例
初始化:
1.对一个属性值,将其按8比特等分成n段,n值为属性长度除以8。
2.设置i为属性段计数器,取值范围为{0,1,…,n-1},初始化为0。
3.记录当前查询节点为哈希字典树根节点。
数据插入:
4.以属性值第i段为索引,直接寻址当前查询节点,检查数组元素状态:a.为空,分配一个偏移量链表头节点,并写入当前属性值,更新当前查询节点数组元素为偏移量链表头节点的指针,转步骤7;b.为下一层树节点的指针,更新当前查询节点为下一层树节点,i值加1,转步骤4;c.为偏移量链表头节点的指针,转步骤5。
5.比较当前属性值是否与偏移量链表头节点中记录的属性值是否相等,若相等,转步骤7;若不等,转步骤6。
6.新分配一个树节点,将偏移量链表头节点的指针写入新分配树节点的对应位置,更新当前查询节点数组元素为新分配树节点的指针,更新当前查询节点为新分配树节点,i值加1,转步骤4。
7.新分配一个偏移量节点,并写入当前属性值对应的数据包偏移量,然后插入偏移量链表,转步骤8。
8.读取下一个属性值,转步骤1。
2.偏移量链表重编码
在步骤3将哈希字典树写入索引文件时,需要对偏移量链表在写出时重新编码,以偏移量为8字节长(64bit)为例,编码时将偏移量按高六字节前缀分组,具有相同前缀的数据分在同一块中,块内按字对齐的方式编码。如图2所示,同一块中的偏移量通过元数据字metadata word与数据字data word两种数据结构组合表示。metadata word存储块的元数据信息,包括块内元素个数block len,块数据公共前缀common prefix,以及第一个元素的低字节low_bytes,metadata word使用一个字(64bit)存放;data word 存储块内其他元素的低二字节,data word使用一个或多个字存放。因此该编码方案为字对齐,占用的空间为64bit的整倍数。
图3示出了一个编码后的示例,属性值IPv4地址为10.10.10.1的数据包共10个,其偏移量链表中的偏移量依次为1000、2000、3000、4000、 5000、1001000、1002000、1003000、1004000、1005000,则按前缀可将其分为两块,第一块包含偏移量1000、2000、3000、4000、5000,共五个元素,前缀为0,第一个元素低字节为1000,编码结果如图3块1(block1) 部分所示;第二块包含偏移量1001000、1002000、1003000、1004000、 1005000,同样含五个块内元素,其块前缀为15,第一个元素低字节为17960,编码结果如图3块2(block2)部分所示。
编码算法具体如下所述:
提取偏移量链表的第一个节点的偏移量的前缀IniPrefix,创建第一个块,以IniPrefix作为第一个块的公共前缀,以第一个节点的偏移量的低两位作为metadata word的low_bytes,将第一个块作为当前块。然后执行以下步骤
步骤2000:如果偏移量链表没有下一个元素,则结束,否则取出偏移量链表的下一元素EOffset,检查当前块的前缀是否与EOffset的前缀相同,如果相同,为情况X,如果不同,为情况Y,
对于情况X:将EOffset加入当前块,即将EOffset的低二字节存入 data word中,
对于情况Y:创建新块,并以EOffset的前缀作为新块的公共前缀,并将EOffset的低二字节作为metadata word的low_bytes,将新块作为当前块,
不论为情况X还是情况Y,都重复步骤2000。
其中,可以采用将偏移量链表中的偏移量与前缀掩码 (0x0000ffffffff0000)做与运算的方法获取偏移量的前缀,可以采用将偏移量链表中的偏移量与低字节掩码(0x000000000000ffff)做与运算,获取偏移量的低二字节。
metadata word中的block len为该块存储的偏移量个数,使用counter 计数,初始为0,该块每写入一个偏移量后,counter加1,该块写完后,将counter左移48位,再与metadata word相与,即写入了metadata word 的block len。
在data word中,采用了字(64bit)对齐,每个字可以存4个偏移量的低二字节,对于一个字word,初始为0,以下为将偏移量写入该word 的方法:将偏移量与低字节掩码(0x000000000000ffff)做与运算,获取偏移量的低二字节,再将该低二字节左移(counter%4)*16位,然后与word 做或运算,运算结果再赋值给word,counter加1,采用此方法,将4个偏移量写入该word,即完成该word的编码。
当创建一个新块时,其前一个块的data word中的最后一个word可能还没有写满4个偏移量的低二字节,则已写入的偏移量的低二字节仍占用一个字。
以下为具体实现算法示例:
1.设置重编码数据存放数组encodedBuf、重编码数据存放位置currWordPos=0,转步骤 2。
2.设置块内元素计数器counter=0,压缩字word=0,块起始存放位置currBlkStart=currWordPos,转步骤3。
3.获取偏移量链表头节点,将其中记录的偏移量与前缀掩码(0x0000ffffffff0000)做与运算,运算结果记录为当前块前缀,将当前块前缀存入encodedBuf[currWrodPos], currWordPos加1,移动链表头指针指向下一节点,转步骤4。
4.将偏移量链表头节点中记录的偏移量与前缀掩码(0x0000ffffffff0000)做与运算,运算结果与当前块前缀比较,若相等,转步骤5,若不等,转步骤8。
5.将偏移量链表头节点中记录的偏移量与低字节掩码(0x000000000000ffff)做与运算,运算结果左移(counter%4)*16位,然后与word做或运算,运算结果再赋值给word,转步骤6。
6.块内元素计算器counter加1,移动链表头指针指向下一节点,转步骤7。
7.检查counter%4是否为0,若是,则将word存入encodedBuf[currWrodPos],然后将 word置0,currWordPos加1,转步骤4;若否,转步骤4。
8.检查word是否为0,若是,转步骤9;若否,将word存入encodedBuf[currWrodPos], currWordPos加1,转步骤9。
9.将块内元素计算器counter左移48位,然后与当前块前缀做与运算,运算结果存入encodedBuf[currBlkStart],转步骤10。
10.检查偏移量链表是否遍历完成,若是,压缩编码流程结束;若否转步骤2。
3索引实现系统与索引建立方法
3.1索引实现系统
以下结合本发明的实现系统描述本发明的索引建立方法,如图4所示,本发明包含三个模块:数据包捕获模块、索引构建模块、数据持久化模块。从整体上看,模块间以流水线模式运行,数据包捕获模块处于流水线第一级,索引构建模块处于第二级,数据持久化模块处于第三级。各模块功能描述如下:
数据包捕获模块:从网卡捕获数据包,对每个数据包,提取索引属性值生成索引摘要,然后将数据包和索引摘要分别写入对应的内存缓冲区。当内存缓冲区满时,激活索引构建模块,并移交当前数据包及索引摘要所有权,然后开启新一轮捕获。在数据包捕获过程中,捕获线程间采取无锁化同步方式,具体操作如下:
1.对每一捕获线程,设置捕获标识变量,当线程处于写缓冲区状态时,该变量置1,其余时刻置0。
2.设置全局缓冲区状态标识变量,当某一捕获线程的缓冲区满时,该变量置1,完成触发构建哈希字典树的操作后,该变量清零。当全局缓冲区状态标识变量置1时,所有捕获线程不得向缓冲区中写入数据。
3.某一捕获线程缓冲区满后,通过原子交换操作置全局缓冲区状态标识变量为1,然后等待其余线程的捕获标识变量清零,转步骤4。
4.线程触发哈希字典树构造操作,然后将全局缓冲区状态标识变量清零,完成一轮同步。
索引构建模块:接收数据包捕获模块传递过来的数据包及索引摘要。然后根据数据包及索引摘要的内容,对每一种属性,建立起从属性值到数据包偏移量列表的一一映射关系。此处,维护属性值与数据包偏移量列表映射关系的数据结构为基于直接寻址的哈希字典树,索引属性包括五元组和时间戳。对于每一种属性,可以建立一个哈希字典树,当数据包有多种属性时,可以建立多个哈希字典树,例如可以为五元组和时间戳建立六个哈希字典树,可以使用任一一种属性值索引数据包。当所有索引属性的映射关系都构建完成后,激活数据持久化模块,并向其移交数据包与哈希字典树的所有权。
数据持久化模块:接收索引构建模块传递过来的数据包及哈希字典树。将数据包写入数据文件,将各属性对应的哈希字典树写入索引文件,并记录数据文件与索引文件的关联关系。
3.2索引建立方法
数据包首先从网卡进入数据包捕获模块。如图5所示,数据包捕获模块包含四个捕获线程,其工作流如下所述:
1.开始时,各线程循环地从网卡抓取数据包,写入数据包缓冲区,并对每个数据包提取索引属性值生成索引摘要,然后写入摘要缓冲区。此时,每个线程对应的捕获标识变量为1,全局缓冲区状态标识变量为0。
2.当其中某线程对应缓冲区满时(图中为线程4),通过原子交换操作将全局缓冲区状态标识变量置为1,并等待其他线程对应的捕获标识变量清零,然后激活索引构建模块,在此期间,其他线程停止捕获操作。
3.最后当线程4完成激活索引构建模块的操作后,将全局缓冲区状态标识变量清零,连同其他线程一起开始新一轮数据包捕获操作,此时各线程对应的捕获标识变量为1。
当索引构建模块被激活后,其接收数据包捕获模块传递过来的数据包及索引摘要,然后利用基于直接寻址的哈希字典树结构,在线提取所有索引属性值的最短不相交前缀,建立索引属性值到数据包偏移量列表的一一映射关系。比如对IPv4地址构建索引,假设索引摘要中包含的所有IPv4 地址为:10.10.10.1、10.10.20.1、10.20.2.1、192.168.2.1、192.196.2.1,其最短不相交前缀为10.10.10、10.10.20、10.20、192.168、192.196,则按最短不相交前缀构建的哈希字典树结构如图1所示,图中树节点为大小为256 的指针数组,对应IPv4地址的8个比特位,从树的根节点到偏移量链表头节点的路径表示一个IP前缀,能唯一标识一个IPv4地址,最后偏移量链表头节点后跟一串偏移量节点,记录该IPv4地址对应的所有数据包的偏移量,从而建立起IPv4地址到数据包偏移量列表的一一映射关系。按上述方式,对五元组与时间戳属性一一构建哈希字典树索引,构建完成后,激活数据持久化模块。
最后,数据持久化模块会将数据包及各索引属性对应的哈希字典树分别写入数据文件与索引文件,并记录二者的关联关系。数据文件的写入按顺序写入模式执行。对于哈希字典树,其树节点按后续遍历方式写入索引文件,目的是保证偏移量列表在文件中按对应的属性值大小顺序排列,以支持范围查询。哈希字典树在文件中的结构如图6所示,包含三个部分:边界记录,记录树节点与偏移量链表的分界位置;树节点,大小为256的偏移量数组,对应内存中哈希字典树结构的指针数组,用于记录下一层树节点或偏移量链表的起始位置;偏移量链表,其开头为索引属性值,后续为属性值对应的经压缩编码后的数据包偏移量记录。从整体上看,树节点与偏移量链表分离存放,树节点在文件中的排列顺序是内存中树节点的后续遍历格式,而偏移量链表则按其对应的属性值大小顺序排列,如图5中所示,从前往后偏移量链表对应的属性值依次为10.10.10.1、10.10.20.1、 10.20.2.1、192.168.2.1、192.196.2.1,为IPv4地址在点分十进制模式下的递增序。
此外,当偏移量链表写入索引文件时,还需要经过压缩编码。编码步骤为:1.将偏移量按六字节前缀分块,具有相同前缀的数据分在同一块中,块内按字对齐的方式编码;2.对同一块中的偏移量,通过metadata word与 data word两种数据结构组合表示。
如上实施方式所述,本发明采用基于最短不相交前缀的索引方案,并结合倒排列表压缩技术以及无锁化并发技术,实现了网络流量的实时索引。相比已有的网络流量实时索引方案,本发明核心创新主要为:1.采用属性值的最短不相交前缀来建立索引,相比于现有方案通用的全字段索引模式,其属性值中参与索引建立的字段的平均长度更短,时间效率与空间效率也就更高。2.基于共享前缀的倒排列表压缩编码,其主要具有以下优点:首先是明显降低索引存储的空间开销以及检索时的I/O时间开销;其次是实现简单,运算速度快,此编码方案通过简单的逻辑与、或、移位运算就可以实现,相较于其他方案,其编解码速度极为优秀;3.按数据的前缀分块,这样对两个列表执行如求交集等逻辑运算时,首先比较其前缀,如果前缀不同的话,那么就不用继续比较块内元素了,跳过了前缀不同的数据,减少了比较次数,因此具有隐含跳表结构,可以大幅优化检索时相关逻辑运算的计算速度,加速检索。
为使本领域任何普通技术人员能够实现或者使用本公开内容,上面围绕本公开内容进行了描述。对于本领域普通技术人员来说,对本公开内容进行各种修改是显而易见的,并且,本文定义的通用原理也可以在不脱离本公开内容的精神或保护范围的基础上适用于其它变型。此外,除非另外说明,否则任何方面和/或实施例的所有部分或一部分可以与任何其它方面和/或实施例的所有部分或一部分一起使用。因此,本公开内容并不限于本文所描述的例子和设计方案,而是与本文公开的原理和新颖性特征的最广范围相一致。
Claims (10)
1.一种用于构建数据包的索引的方法,其中所述索引采用哈希字典树方式存储数据包的属性值,所述属性值按照预定的规则被分成n段,所述哈希字典树包括树节点、偏移量链表头节点和偏移量节点,所述偏移量节点用于存储数据包的全局偏移量以及下一个偏移量节点的指针,所述偏移量链表头节点用于存储属性值与偏移量链表的第一个偏移量节点的指针,所述树节点为大小为M的指针数组,指针数组的每一元素用于存储指向下一层树节点的指针或指向偏移量链表头节点的指针,n和M为正整数,包括:
步骤100:为收到的第一个数据包的属性值建立根树节点,为该属性值分配一个偏移量链表头节点,并在该偏移量链表头节点中存储该属性值,在该根树节点的属性值第0段使用的数组元素中写入指向该偏移量链表头节点的指针,分配一个偏移量节点,在所述偏移量节点中写入当前属性值对应的数据包偏移量,然后将所述偏移量节点插入到该偏移量链表头节点的偏移量链表中;
步骤110:以所述根树节点作为当前查询节点执行如下步骤:
步骤200:接收下一数据包,将所述属性值按照预定规则分为n段,i为属性段计数器,i=0,1,…, n-1,其初始化为0,执行下列步骤:
步骤201:确定在所述当前查询节点中属性值第i段所使用的元素E的状态,
A)如果E为空:分配一个偏移量链表头节点LHA,并写入当前属性值,更新E为偏移量链表头节点LHA的指针,新分配一个偏移量节点,并写入当前属性值对应的数据包偏移量,然后插入LHA的偏移量链表,转移到步骤200;
B)如果E为指向偏移量链表头节点的指针:比较当前属性值与E中偏移量链表头节点LHB所存储的属性值是否相同,如果相同,新分配一个偏移量节点,并在所述偏移量节点中写入当前属性值对应的数据包偏移量,然后插入该属性值的偏移量链表;如果不同,新分配一个树节点,将偏移量链表头节点LHB的指针写入新分配树节点的LHB属性值第i+1段对应的元素,将新分配的树节点作为所述当前查询节点,i值加1,重复步骤201;
C)如果E为指向下一层树节点的指针:则根据该指针找到下一层树节点,将其作为所述当前查询节点,i值加1,重复步骤201。
2.根据权利要求1所述的方法,所述数据包包括多种属性,对数据包的每一种属性分别建立哈希字典树。
3.根据权利要求2所述的方法,所述数据包的属性包括与该数据包相关的五元组和/或时间戳,所述五元组包括源IP地址、源端口号、目的IP地址、目的端口号、以及协议号。
4.一种记录数据包的方法,包括:
步骤10:捕获数据包,分别将每个数据包和其索引属性值存储到数据包缓冲区和摘要缓冲区;
步骤20:在数据包缓冲区或摘要缓冲区之一满时,执行权利要求1-3之一的方法,建立相应的哈希字典树;
步骤30:将数据包缓冲区中的数据包写入数据文件,将各属性对应的哈希字典树写入索引文件,并记录数据文件与索引文件的关联关系。
5.根据权利要求4所述的方法,其中,将各属性对应的哈希字典树写入索引文件包括对偏移量链表的压缩,包括步骤:
偏移量链表压缩使用的编码结构包括一个或多个块,所述块包括元数据字与数据字,其中,
元数据字用于存储块的元数据信息,包括块内元素个数block len,块数据公共前缀,以及第一个元素的低字节low_bytes,
数据字用于存储块内其他元素的低二字节,包括一个或多个字。
6.根据权利要求5所述的方法,对偏移量链表的压缩还包括:
步骤1000:提取偏移量链表的第一个节点的偏移量的前缀IniPrefix,创建第一个块,以IniPrefix作为第一个块的公共前缀,以第一个节点的偏移量的低两位作为元数据字的low_bytes,将第一个块作为当前块;
步骤2000:如果偏移量链表没有下一个元素,则结束,否则取出偏移量链表的下一元素EOffset,检查当前块的前缀是否与EOffset的前缀相同,如果相同,则执行步骤2010,如果不同,则执行步骤2020:
步骤2010:将EOffset加入当前块,包括将EOffset的低二字节存入数据字中,执行步骤2000;
步骤2020:创建新块,并以EOffset的前缀作为新块的公共前缀,并将EOffset的低二字节作为metadata word 的low_bytes,将新块作为当前块,执行步骤2000。
7.根据权利要求6所述的方法,在步骤2000中,在创建新块时,在上一块的元数据字的block len中写入上一块的存储元素个数。
8.一种采用多线程捕获数据包的数据记录包的方法,其中对每一捕获线程,设置一个捕获标识变量,以允许或者禁止所述线程对其缓冲区进行写入数据,还设置一个全局缓冲区状态标识变量,以允许或者禁止所有捕获线程向其各自的缓冲区中写入数据,所述方法包括:
步骤3:在任一捕获线程缓冲区满时,设置其捕获标识变量以禁止所述捕获线程对其缓冲区进行写入数据;
步骤4:通过原子交换操作置全局缓冲区状态标识变量,以禁止所有捕获线程向其各自的缓冲区中写入数据,然后等待其余线程的捕获标识变量被设置为禁止所述线程对其缓冲区进行写入数据;
步骤5:根据权利要求1-3之一的方法,建立相应的哈希字典树,然后将全局缓冲区状态标识变量设置为允许所有捕获线程向其各自的缓冲区中写入数据,将所述线程的捕获标识变量设置为以允许所述捕获线程对其缓冲区进行写入数据。
9.一种计算机可读存储介质,其中存储有一个或者多个计算机程序,所述计算机程序在被执行时用于实现如权利要求1-8任意一项所述的方法。
10.一种计算系统,包括:
存储装置、以及一个或者多个处理器;
其中,所述存储装置用于存储一个或者多个计算机程序,所述计算机程序在被所述处理器执行时用于实现如权利要求1-8任意一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110457333.7A CN113139100B (zh) | 2021-04-27 | 2021-04-27 | 一种网络流量实时索引方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110457333.7A CN113139100B (zh) | 2021-04-27 | 2021-04-27 | 一种网络流量实时索引方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113139100A CN113139100A (zh) | 2021-07-20 |
CN113139100B true CN113139100B (zh) | 2022-06-14 |
Family
ID=76813535
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110457333.7A Active CN113139100B (zh) | 2021-04-27 | 2021-04-27 | 一种网络流量实时索引方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113139100B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113722320A (zh) * | 2021-08-18 | 2021-11-30 | 南京航空航天大学 | 一种基于并行的图数据索引的持久化方法 |
CN113901131B (zh) * | 2021-09-02 | 2024-06-07 | 北京邮电大学 | 基于索引的链上数据查询方法及装置 |
CN116028677B (zh) * | 2023-03-14 | 2023-08-29 | 阿里云计算有限公司 | 数据操作方法以及系统 |
CN117851696B (zh) * | 2024-03-06 | 2024-05-03 | 北京新宇航星科技有限公司 | 一种数据包的检索方法、设备和存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103259737A (zh) * | 2013-04-18 | 2013-08-21 | 西安交通大学 | 一种并行存储高速网络流量的快速定位方法 |
CN103714134A (zh) * | 2013-12-18 | 2014-04-09 | 中国科学院计算技术研究所 | 一种网络流量数据索引方法及系统 |
CN104009984A (zh) * | 2014-05-15 | 2014-08-27 | 清华大学 | 基于倒排列表的网流索引检索与压缩的方法 |
CN105718521A (zh) * | 2016-01-15 | 2016-06-29 | 湖南大学 | 一个基于Wavelet Tree的网络数据包索引系统 |
US9537972B1 (en) * | 2014-02-20 | 2017-01-03 | Fireeye, Inc. | Efficient access to sparse packets in large repositories of stored network traffic |
-
2021
- 2021-04-27 CN CN202110457333.7A patent/CN113139100B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103259737A (zh) * | 2013-04-18 | 2013-08-21 | 西安交通大学 | 一种并行存储高速网络流量的快速定位方法 |
CN103714134A (zh) * | 2013-12-18 | 2014-04-09 | 中国科学院计算技术研究所 | 一种网络流量数据索引方法及系统 |
US9537972B1 (en) * | 2014-02-20 | 2017-01-03 | Fireeye, Inc. | Efficient access to sparse packets in large repositories of stored network traffic |
CN104009984A (zh) * | 2014-05-15 | 2014-08-27 | 清华大学 | 基于倒排列表的网流索引检索与压缩的方法 |
CN105718521A (zh) * | 2016-01-15 | 2016-06-29 | 湖南大学 | 一个基于Wavelet Tree的网络数据包索引系统 |
Also Published As
Publication number | Publication date |
---|---|
CN113139100A (zh) | 2021-07-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113139100B (zh) | 一种网络流量实时索引方法及系统 | |
KR100441317B1 (ko) | 데이터 패킷 분류 방법 및 장치 | |
US7099881B2 (en) | Method for increasing average storage capacity in a bit-mapped tree-based storage engine by using remappable prefix representations and a run-length encoding scheme that defines multi-length fields to compactly store IP prefixes | |
US9269411B2 (en) | Organizing data in a hybrid memory for search operations | |
Kirsch et al. | Hash-based techniques for high-speed packet processing | |
US9292554B2 (en) | Thin database indexing | |
JP4995125B2 (ja) | 固定長データの検索方法 | |
US20140122791A1 (en) | System and method for packet classification and internet protocol lookup in a network environment | |
CN1653763A (zh) | 在基于硬件的包交换中用于存储器有效的快速vlan查找和插入的方法和设备 | |
US20090265320A1 (en) | Scalable high speed relational processor for databases and networks | |
US7162481B2 (en) | Method for increasing storage capacity in a multi-bit trie-based hardware storage engine by compressing the representation of single-length prefixes | |
CN104156380A (zh) | 一种分布式存储器哈希索引方法及系统 | |
CN104408111A (zh) | 一种删除重复数据的方法及装置 | |
CN108363791A (zh) | 一种数据库的数据同步方法和装置 | |
Hsieh et al. | Multiprefix trie: A new data structure for designing dynamic router-tables | |
CN110020272A (zh) | 缓存方法、装置以及计算机存储介质 | |
US9292553B2 (en) | Queries for thin database indexing | |
CN111541617B (zh) | 一种用于高速大规模并发数据流的数据流表处理方法及装置 | |
CN103294735B (zh) | 基于tcam的确定性有穷状态自动机dfa的匹配方法和装置 | |
CN110019232B (zh) | 一种报文保存方法及装置 | |
Banerjee et al. | PC-DUOS+: A TCAM architecture for packet classifiers | |
CN111131197B (zh) | 一种过滤策略管理系统及其方法 | |
KR102229554B1 (ko) | 해시 키 생성 방법 및 그 장치 | |
CN115933978A (zh) | 一种OpenFlow流表深度聚合方法及快速查找系统 | |
CN118467546A (zh) | 数据流处理方法、装置、计算机设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |