一种基于多层迭代的改进递归数据流匹配方法与流程

文档序号:13446368阅读:151来源:国知局
一种基于多层迭代的改进递归数据流匹配方法与流程
本发明属于数据流匹配领域,尤其涉及一种基于多层迭代的改进递归数据流匹配方法。
背景技术
:包匹配算法是对通过路由器的数据包进行识别,从而可以为互联网提供访问控制,提高网络服务质量以及针对不同客户要求提供差异式服务,包匹配算法本质上是一个多维范围匹配问题,根据预定义规则对进入网络或主机数据包的ip头部信息进行比较。ip头字段信息一般包括源ip地址,目的地ip地址,源端口,目的地端口以及上层协议类型。每个规则还有一个行为字段,以便对符合匹配的数据包进行相应处理。一般每条规则还有一优先级。对于传入的数据包,如有多条规则与它匹配,数据包匹配最高优先级的规则。包匹配的性能由内存消耗和内存访问的次数来衡量。目前,不同的包匹配算法在算法的空间和时间性能之间采用不同的权衡策略。基于哈希表的算法有优越的空间性能,但其时间性能却无法得到保证[1][2]。基于决策树的算法使用决策树把规则库划分为多个线性搜索组[3][4],此算法的速度和存储性能会根据规则数据库的特点有所不同。efficuts使用多个决策树控制内存消耗,但也降低了算法的时间性能[5]。三元内容可寻址存储器(tcam)广泛用于查找规则。然而,tcam不能直接处理范围类型的规则匹配,因此需要把范围的规则转换成前缀的规则类型,这样就降低了空间效率[6]。rfc[6]是一个著名的高性能算法,这个高性能是有条件的,是在维数很低,规则库规模不大情况下,否者会引起维度灾难以及规模灾难。技术实现要素:本发明所要解决的技术问题是针对
背景技术
的不足提供一种基于多层迭代的改进递归数据流匹配方法,其对rfc进行改进以减少内存消耗,通过把规则库分成几个子集,每个规则存储在一个独立的子集中;对rfc的改进算法大大降低了rfc总体内存消耗,极大提高了包匹配的性能。本发明为解决上述技术问题采用以下技术方案一种基于多层迭代的改进递归数据流匹配方法,具体包含如下步骤;步骤1,将规则库分割成几个规则子集;步骤2,将每个规则子集中的规则存储在一个rfc数据结构中,每个规则子集用一个索引规则来进行描述,将所有的索引规则存储在一个rfc索引中,将rfc索引指向相应的rfc数据结构。作为本发明一种基于多层迭代的改进递归数据流匹配方法的进一步优选方案,通过决策树将规则库分割成几个规则子集。作为本发明一种基于多层迭代的改进递归数据流匹配方法的进一步优选方案,所述决策树的生成方法具体如下:首先生成一棵平衡二叉树,每个内部节点的关联规则被分为两个子集,在构造决策树的过程,删除任何重复规则,所有从第一个决策树删除的规则都被存储在第二个决策树;然后基于上述过程构造第二个决策树,在第二个决策树构造过程中的任何重复规则被搬到第三个决策树,如此迭代,生成所有决策树。作为本发明一种基于多层迭代的改进递归数据流匹配方法的进一步优选方案,所述步骤1将规则库分割成几个规则子集的具体过程如下:步骤1.1,定义一个阈值去限制存储在一个rfc数据结构中的规则的数量,将所有规则都与第一个决策树的根节点相关联;步骤1.2,若规则的数量大于阈值,则把规则分为两个子集;步骤1.3,选择一个有效区分rfc数据结构中的规则的字段,计算规则库每个字段不同的前缀的数量,选择前缀数量最多的字段来分割,对选定的字段,进一步确定将规则平衡划分成两个部分的一个点,针对选择的字段,统计小于等于选择点的端点规则数量,对每个端点分别统计大于选择点的起始点的规则数量,和选择点相比,数字最接近被选中;根据选择的点将规则集划分为三个子集:规则的范围低于所选点,规则的范围高于所选点和范围在选定的点的未分类的规则;步骤1.5,重复步骤1.3,把前两个规则集进一步划分,直到每个子集生成的规则数量小于阈值,决策树中所有未分类的规则插入到下一个决策树的根节点进行进一步的划分。作为本发明一种基于多层迭代的改进递归数据流匹配方法的进一步优选方案,在步骤1中,设计一个阈值,当某个子集的规则数小于这个阈值时,就把它和别的子集合并。作为本发明一种基于多层迭代的改进递归数据流匹配方法的进一步优选方案,在步骤1中,将不同rfc数据结构,且相同快的索引数组进行合并,进而获取rfc数据结构相同快的eqids。作为本发明一种基于多层迭代的改进递归数据流匹配方法的进一步优选方案,在步骤1中,用二进制搜索数组替换索引数组,对于每个索引数组,存储在相邻实体中的eqids是相同的,将它们合并为一个区间,从第一个实体到最后一个实体eqid相同。本发明采用以上技术方案与现有技术相比,具有以下技术效果:1、本发明对rfc进行改进以减少内存消耗,通过把规则库分成几个子集,每个规则存储在一个独立的子集中;对rfc的改进算法大大降低了rfc总体内存消耗,极大提高了包匹配的性能;2、本发明对rfc数据机构进行一些改进以提高存储和速度性能:合并小的子集、合并第一个阶段中不同的rfc数据结构、减少内存消耗;其中,合并小的子集有效地避免小的子集将导致无效的rfc数据结构,最终造成额外的对这些数据结构的内存访问;合并第一个阶段中不同的rfc数据结构:把不同rfc数据结构,但相同快的索引数组进行合并,有效地减少内存访问的次数;减少内存消耗:通过这种方式,可以将索引数组2w实体转换成一个n-间隔数组,它可以采用二进制搜索,可以减少在第一阶段的内存消耗。附图说明图1是对表1规则的几何描述;图2是关于表2的决策树;图3(a)是三个类型的规则库在三个因子下的内存性能;图3(b)是三种类型的规则库在三个因子下内存访问次数;图4(a)是三种规则库类型,三个合并阈值下的内存消耗比较;图4(b)是三种规则库类型,三个合并阈值下的内存访问次数比较;图5(a)是三种类型的规则库,两种合并阈值下的内存性能;图5(b)是三种类型的规则库,两种合并阈值下的速度性能比较;图6(a)是acl1规则库中的5种算法的内存性能比较;图6(b)是acl1规则库中的5种算法的速度性能比较;图7(a)是fw1规则库中的5种算法的内存性能比较;图7(b)是fw1规则库中的5种算法的速度性能比较;图8(a)是ipc1规则库中的5种算法的内存性能比较;图8(b)是ipc1规则库中的5种算法的速度性能比较。具体实施方式下面结合附图对本发明的技术方案做进一步的详细说明:本发明改进算法的目标是提高rfc的空间效率,采用多个rfc实例。首先,本发明把规则库分为几个子集。每个子集的规则存储在一个独立rfc数据结构中。每个子集由一个索引规则来进行描述,每个索引规则指向相应的rfc的数据结构。因此,如果分规则库为k个子集,从而k个索引规则被创建。这些索引规则被存储在另一个rfc索引数据结构中。称rfc索引,以它来确认进入网络或主机的数据包该进入何子集,进一步,通过相应的rfc数据结构来确定具体的匹配规则。本发明以一例来说明对规则库分割的必要性,表1是由两个头字段组成的规则库,在源地址(sa)领域,有五个组合:0*(r3、r6),010*(r3、r4r6),1*(r2,r6),1100(r1、r2、r6)和1110(r2、r5r6)括号前的标识符是相应的括号里规则的前缀匹配。在目的地址(da)领域,有六个组合:*(r5),110*(r5,r6),1011(r1,r5),0*(r4,r5),010*(r2、r4、r5)和00*(r3,r5)。因此,两个头字段执行外积后有30(=6*5)个实体。执行外积得到的实体数量可以通过分割规则库来减少。图1通过几何的方法来说明这些规则分割的思想。这些规则被分为三个子集(r1r5r6),(r2,r5)和(r3,r4)。每一个子集的外积实体的数量是9(=3*3)、4(=2*2)以及4(=2*2)。从而外积实体总数减少到17。与原来的相比,分割规则库可以有效降低外积表实体数目。从而提高存储的效率。表1sadasadar111001011r4010*0*r21*010*r51110*r30*00*r6*110*一个有效的分割算法应该满足以下三要求:首先,那些在几何描述上彼此接近的规则应该在分类上属于同一子集,这个要求是确保搜索过程能访问到所有子集;第二,每个规则应该驻留在确切某个子集里。一个不太有效的分割算法可能导致一规则处于不同子集;第三,规则子集的数量应该可调节以便适应不同规则库。下面研究分析当前已有的分割规则库算法。元组空间的思想是基于每个字段中前缀的位数把规则库分为元组。每个元组对应于一个前缀,检查所有字段的组合,以及由此产生的元组称为元组空间。,以一个三维元组(5,6,7)为例,属于这个三维元组的规则第一个字段是一5位的前缀,第二个字段是一6位前缀以及第三个字段为7位的前缀。因为每个规则只有一个前缀组合,元组空间不会违背分割的第二个要求。然而,并不意味着任前缀组合存在几何关联,元组空间分割的思想不能满足分割的第一个要求。由于高成本的前缀扩张也很难调整元组的数量。一个类似元组的思想提出了空间利用嵌套层元组,每个字段的长度定义为嵌套的数量水平相应的前缀。尽管这个算法的元组数量显著低于元组空间元组的数量,但第一个分割的要求仍不满足。一贪婪算法运用外积法减少使用嵌套级别的元组数目,但是不符合分割的第二个要求,嵌套元组也不支持更新,因为插入一个规则时,新的前缀可能改变所有规则的嵌套层数。决策树算法使用规则的字段属性将规则库分成一个个子集,当用于分割规则库的属性是字段值时,决策树提供了相同子集的规则在几何描述上相互接近。从而决策树在执行数据包匹配时只有一个子集被访问到。通过调整在一个叶节点上的规则数来控制子集的数量。然而,规则决策树算法也不符合分割的第二个要求。因通配符规范在规则库的规则描述中很常见,从而对规则库分割的几何方法只能减少规则的重复,而不能避免规则重复。有几种方法被提出去减少重复规则,有几个算法使用多个决策树来提高规则库的分割效率,另外的分割算法利用不同的属性划分规则集。这些方法在合理的消耗下没有一个能完全避免规则的重复问题。与基于元组分割算法相比,使用决策树对规则库规则分割的算法只有一个规则重复问题需要克服。本发明提出使用一个随需应变的方法来避免规则的重复问题。首先生成一棵平衡二叉树,每个内部节点的关联规则被分为两个子集。在构造决策树的过程,删除任何重复规则,所有从第一个决策树删除的规则都被存储在第二个决策树。然后基于上述过程构造第二个决策树,在第二个决策树构造过程中的任何重复规则被搬到第三个决策树,如此迭代,最后生成所有决策树。决策树的任一叶节点的规则被插入一个rfc的数据结构,因此,rfc数据结构的数量等于所有决策树的叶节点总数。规则划分的详细过程描述如下:首先定义一个阈值去限制存储在一个rfc数据结构中的规则的数量,所有规则都是与第一个决策树的根节点相关联。如果规则的数量大于阈值,那么把规则分为两个子集。为了对规则库进行分割,选择一个有效区分这些规则的字段。计算规则库每个字段不同的前缀的数量,选择前缀数目最多的字段来分割。对选定的字段,进一步确定可以将规则平衡划分成两个部分的一个点。针对选择的字段,统计小于或等于选择点的的端点规则数量,对每个端点分别统计大于选择点的的起始点的规则数量。和选择点相比,数字最接近被选中。根据选择的点,可以将规则集划分为三个子集:规则的范围低于所选点,规则的范围高于所选点,和范围在选定的点的未分类的规则。重复上述步骤,把前两个规则集进一步划分,直到每个子集生成的规则数量小于阈值。决策树中所有未分类的规则插入到下一个决策树的根节点进行进一步的划分。用一个例子说明上述过程,如表2所示为五个字段的十七条规则组成的规则库。设置阈值为4。在分割的第一次迭代过程中,源地址字段前缀的不同数目最大,因此,选择它把规则分库分成三个子集,每个子集对应于树的一个节点。如图2所示,根节点的左子节点存储规则的源地址字段是低于所选点,根节点的右子结点存储较大的规则源地址字段。中间的根节点存储未分类的规则。因为左和右子节点的规则数超过4位,应该进一步分割以便生成更小的子集。决策树中所有未分类的规则(包括r15、r16r12,和r13)形成第二个决策树的根节点。由于子集的大小对应于根节点不超过阈值,第二个决策树只有一个节点。表2sourceipdestinationipsourceportdestinationportprotonolr0100.1000.98.45/32128.17.88.0/24[0∶1024][80∶80]0x06/0xffr169.250.70.0/32255.255.255.255/32[151∶151][81∶81]0x06/0xffr2128.23.128.0/24128.17.88.0/23[80∶80][150∶160]0x07/0xffr332.9.136.0/25200.16.14.0/24[79:~80][80∶80]0x01/0xffr488.79.0.0/13192.192.69.69/32[514∶514][36∶136]0x06/0xffr5200.55.0.0/13128.17.88.0/24[2436∶2436][55444∶55444]0x03/0xffr664.63.0.0/16128.17.88.0/24[0∶1024][0∶65535]0x00/0x00r7128.128.0.0/160.0.255.255/32[5000∶6000][100~100]0x07/0xffr8100.100.0.0/1679.0.0.0/8[514∶514][120∶120]0x06/0xffr95.64.0.0/1032.0.128.0/10[35543∶65535][83∶83]0x00/0x00r10224.145.0.0/90.0.0.8/32[80∶80][0∶1024]0x03/0xffr11130.87.0.0/1064.64.90.0/18[3640∶6887][0∶1024]0x03/0xffr12128.34.0.0/240.0.0.0/0[1025∶1025][1221∶1228]0x03/0xffr13254.80.0.0/160.0.0.0/0[1025∶1025][55444∶55666]0x08/0xffr14254.80.0.0/16180.37.0.0/16[17∶30][55222∶55333]0x08/0xffr150.0.0.0/0128.128.64.0/24[98∶98][135∶135]0x00/0xffr160.0.0.0/00.0.0.0/0[0∶65535][0∶65535]0x00/0x00在把规则库分成几个子集后,子集的规则被存储在rfc的数据结构中,运用一个索引规则去描述子集空间。每个索引规则的范围从子集的所有规则的相应字段的最小开始点到最大端点。因此,假如把一个规则库分成k个子集,也就创建了k个索引规则。表3列出了表2的索引规则和它们相应的在每个字段上的范围。在为所有的子集创建了索引规则后,运用一个rfc数据结构(索引rfc)去存储这些索引规则,表3.关于表2的索引规则:表3对每个rfc数据结构,在第一阶段,五个过滤字段被分成七块,包括六个16位数据块和一个8位的块。对于每个块,相应于包头字段的值,为访问对应的等价类id(eqid)构造2w实体的索引数组,其中w表示块大小。每个eqid与类位图相关联去指示和块等效集相匹配的规则。每个eqid的类位图是不同的,下一阶段中,通过外积eqid使两到三块组合成一新块,新块的类位图等于所有合并eqids的类位图的交积。在新的阶段中,每一个不同的类位图表示一组等价的集,然后给每一个等价集分配一个eqid。新eqids存储在一个索引数组中,这个索引数组的大小等于合并eqids的乘积。这个过程继续到所有的块都被合并。对传入的数据包,搜索过程在一个rfc数据结构中首先把数据包报头分成七块。每个块的值是用来访问索引数组的eqid。如果有任何后续阶段,搜索过程使用eqid组合去生成下一阶段的索引。随着索搜过程遍历到最后阶段,最终诞生一个eqid,和这个新诞生的eqid相应的类位图被用来访问最终匹配的规则。对于一个进入的数据包,这个完整的搜索过程首先遍历索引rfc数据结构找到匹配的索引规则,然后,搜索过程通过访问相应的rfc的数据结构继续搜索匹配索引规则的子集。本发明提出的算法框架由六个rfc的数据结构构成,其中五个关于结果子集和一个关于索引规则。表4显示了原始rfc的外积表实体和本发明提出的算法外积表实体。在这个例子中,本发明提出的算法减少63%原始rfc的外积实体:表4.原始rfc和本发明提出的算法在每个阶段的外积表实体:表43.进一步改进在本节提出三种技术来进一步改善本发明所提算法的时间和内存消耗性能。a.合并小的子集在对规则库进行分割时,可能会产生小的子集,这些小的子集将导致无效的rfc数据结构,最终造成额外的对这些数据结构的内存访问。为了避免这种情况发生,设计一个阈值,当某个子集的规则数小于这个阈值时,就把它和别的子集合并。这些合并的子集存储在一个共同的rfc数据结构中。b.合并第一个阶段中不同的rfc数据结构规则库分割成k个组需要设计k+1个rfc数据结构。每个rfc数据结构都需要单独遍历,从而在第一个阶段中的索引数组中为了检索到相应的eqid就需要7*(k+1)内存访问。可以把不同rfc数据结构,但相同快的索引数组进行合并,达到减少内存访问的次数。这样一次内存访问就可以获得不同rfc数据结构相同快的eqids。第一阶段的rfc数据结构检索的内存访问的次数就从7*(k+1)降到7。c.减少内存消耗第一阶段每个rfc数据结构存储eqids需要6个16比特的块和1个8比特的块,每个16比特的块的搜索表是216个实体的索引数组,每个8比特的块的搜索表是28个实体的索引数组。假如把规则库分割成k个子集,在第一阶段就需要6*216*(k+1)+28*(k+1)实体。为了减少内存消耗,可以在第一阶段中设计用二进制搜索数组替换索引数组,对于每个索引数组,存储在相邻实体中的eqids可以是相同的。可以将它们合并为一个区间,从第一个实体到最后一个实体eqid相同。通过这种方式,可以将索引数组2w实体转换成一个n-间隔数组,它可以采用二进制搜索。这种方法可以减少在第一阶段的内存消耗。4.数值实验本发明运用真实的和合成的规则库去评价本发明所提算法的性能,在实验中运用三种类型的规则集:访问空列表(acl),防火墙(fw),ip链(ipc)。这些数据集可以从文献[7]获取。实验目的是比较本发明所提算法和别的几种算法的性能。实验结果有三部分组成:第一部分描述不同规模的子集在时间和内存消耗之间的平衡;第二部分展示了基于不同子集合并阈值的性能改进;最后一部分是一个性能研究,比较本发明所提算法与已存算法的性能。a.不同规模子集下的性能平衡第一部分的一个子集的规则数是通过一个因子决定的。定义因子d1,子集的规则大小等于规则总数除以d1。规则集被分割,直到在每个子集的规则数小于阈值。本实验使用三个因数:4、8、16,在接下来的评价中选择最佳性能的因子。图3显示了在三种不同类型的规则库三个不同大小的子集下,在最坏情况下的内存需求和内存访问的次数。如图3(a)所示,随着子集中规则数的减少,也就是子集个数的增多,内存需求逐渐劣化。然而,图3(b)也显示,随着子集中规则数的增加,子集个数的减少,内存访问增加。这是因为传入数据包可能匹权衡利弊后,设置因子d1为8,因为此值可以更好地权衡存储和速度性能。因此子集的大小等于规则的数量除以8。b.子集合并的不同阈值第二部分实验,设置一个阈值来合并小的子集从而达到提高算法性能。合并阈值也决定通过使用因子d2,合并阈值等于子集的大小除以d2。子集合并如果它们的规则数小于合并阈值。初始设置三个因子:2、3、4。在接下来的评价中选择的最佳性能的因子。图4(a)和图4(b)显示在三种不同类型的规则库,三个子集合并的不同阈值下,在最坏情况下的内存需求和内存访问的次数。图4(a)表明在rfc算法中,一个大的合并阈值可能招致更多的内存需求,因为越来越多的子集合并导致更大外积表。图4(b)显示一个小合并阈值可能招致更多的内存访问,因为rfc的数据结构的数量不能有效减少。因此,传入数据包在搜索过程中匹配更多的子集可能导致更多的内存访问。图4(a)三种规则库类型,三个合并阈值下的内存消耗比较;图4(b)三种规则库类型,三个合并阈值下的内存访问次数比较;进一步比较本发明提出的算法,在允许子集合并(设置因子d2为3)和没有子集合并两种情况下的性能。图5(a)显示,随着子集的合并内存需求略有增加,rfc数据结构存储更多的规则通常会导致更多的外积实体。图5(b)表明,子集合并可以减少内存访问。要在存储和速度性能之间权衡,本发明倾向于速度,因为本发明提出的算法相比于rfc的算法具有显著降低内存需求。在实验最后部分,比较本发明所提算法(ourscheme)与已有四个算法:rfc,hsm,hypercuts与iset的性能。一些结果不能显示因用于构建数据结构程序内存消耗太大,导致无法运行。图6(a)、图6(b)、图7(a)、图7(b)、图8(a)和图8(b)显示五个算法的内存性能比较。本发明所提算法改善了rfc和hsm存储性能,因它们都使用类似的数据结构。本发明所提算法内存需求比iset大,然而,iset的速度性能也明显逊色于本发明所提算法。针对不同规则库hypercuts的结果有所不同。虽然在acl类型中hypercuts表现良好,在运用于fw和ipc时其性能却严重恶化,而本发明所提算法在这两种类型的规则库速度和存储性能都优于hypercuts。总之,本发明所提算法显示是最好的可行性方案。虽然从单一性能角度可能不是最好的方案,它总是提供一致的吞吐量和避免最坏情况。本发明基于rfc的改进提出一个重要算法。rfc是一个性能很好的包匹配算法,但是在生成外积表时要消耗大量内存,由于这个缺陷,rfc不适用于大规模的规则库。为了改善内存性能,本发明提出一个改进算法把规则库分割成几个子集。在一子集中的规则被存储在一rfc数据结构中,每个子集用一个索引规则来进行描述。所有的索引规则被存储在一个rfc索引中,这些rfc索引指向相应的rfc数据结构。进一步本发明提出三种技术去改进内存和速度性能。本发明运用三种规则库去评价算法的性能,数值实验证明本发明提出的算法综合性能最优。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1