一种实现IPv6快速路由查找的方法

文档序号:7984723阅读:314来源:国知局
一种实现IPv6快速路由查找的方法
【专利摘要】本发明公开了一种实现IPv6快速路由查找的方法,其利用多比特树的数据结构来存储路由表,再利用压缩方法将分支节点中的表格中由前缀扩展而产生的重复表项和空表项进行压缩,并把压缩前后的表项索引值做一个映射。该方法能够在不增加内存占用的基础上使IPv6路由的添加、查找和删除速度提升数倍。
【专利说明】一种实现IPv6快速路由查找的方法
【技术领域】
[0001]本发明涉及数据通信中的IPv6单播路由,特别涉及一种IPv6快速路由查找的方法。
【背景技术】
[0002]传统上,一般采用树形结构来存储路由表,其中最简单的方法就是使用每个分支上标注了值的二叉树,这也是目前使用最广泛的方法。一般规定一个节点到其左子节点的路径表示前缀中的对应比特为0,节点到其右子节点的路径代表前缀中的对应比特为I。因为路由前缀都是由二进制的0、1组成,所以二叉树适合表示路由前缀。
[0003]每次查找时从根节点开始查起。每次从目的IP地址中读出lbit,如果为I下一次查找当前节点的右子节点;如果为O则查找左子节点。如果当前节点对应了一个有效前缀,则记下该节点,作为当前所找到的最长匹配的网络前缀对应的节点。就这样一直查找,直到无法继续查找时结束(遇到叶子节点或者当前节点无相应子节点或者已经到达了目的地址前缀长度时查找结束)。
[0004]二叉树算法的性能虽然已经可以满足一般需要了,但仍然不够理想。最坏情况下,访存次数与地址长度相等,对于IPv4来说是32次,对于IPv6来说是128次,无法满足快速查找的要求。因此,需要开发更快的查找方法,尤其是对于ipv6。
[0005]除了上述二叉树自身的不足之外,路由树与DFLOW (即Data Flow,亦称流转发,相当于路由cache,缓存了转发当前流量所需的路由信息,避免反复查询路由表,提升了转发性能,其内部一般为哈希表)的关联方式也有不足之处。目前DFLOW是直接关联到其所依赖的路由节点上,路由更新时难以精确判定哪些DFLOW需要被删除,而只能使用保守策略把可能需要删除的DFLOW全部删除,增加了重建DFLOW的开销,降低了转发效率。

【发明内容】

[0006]本发明针对现有技术采用每个分支上标注了值的二叉树来存储路由表,其相应的查找方法无法满足快速查找的要求,特别是对于IPv6。为此本发明提供了一种IPv6路由的快速查找方法,该方法能够在不增加内存占用的基础上使IPv6路由的添加、查找和删除速度提升数倍。
[0007]为了大大上述目的,本发明采用如下的技术方案:
[0008]一种实现IPv6快速路由查找的方法,所述方法利用多比特树的数据结构来存储路由表,再利用压缩方法将分支节点中的表格中由前缀扩展而产生的重复表项和空表项进行压缩,并把压缩前后的表项索引值做一个映射。
[0009]在本发明的优选实例中,采用八比特树,利用位图进行压缩,在位图中,每一位都对应着原始未压缩表格中的一个表项,O表不可以被压缩掉的垃圾表项,I表不需要保留的有实际意义的表项。
[0010]进一步的,所述位图为256位的位图,使用长度为8的32位无符号整数数组来表示,并利用一个无符号字节数组作为辅助数组,用于记录无符号整数数组从起始处到每个元素末位的这一段位串中I的总个数;在进行压缩前后的表项索引值做映射时,把位图作为一个位数组,用原始索引查询该数组,得到一位,如果该位是O,则表明查到的是被压缩掉的表项;如果该位是1,则从位图开始到该位之前这一段的所有I的个数就是压缩后表格中的索引。
[0011]进一步的,所述多比特树的数据结构中分支节点的压缩表格以数组的形式存储,且被分为内置数组和外挂数组两部分,所述内置数组固化在节点中,所述外挂数组在内置数组的空间不够用时,根据需要动态分配的,位于节点之外,但在节点内有指针指向它;所述分支节点根据其所需存储的压缩后的表项数,分为三级存储模式,第一级模式存储的表项数最少,仅使用节点的内置数组的存储空间;第二级模式存储的表项数稍多,在继续利用内置数组的基础上再加一个能容纳16个表项的外挂数组来存储内置数组装不下的其余表项;第三级模式可存储的表项数更多,最多可容纳全部的256个表项。
[0012]再进一步的,所述内置数组有6个表项。
[0013]再进一步的,所述第一级模式存储和第二级模式存储之间的过渡通过分配或释放外挂数组来实现;所述第二级模式存储和第三级模式存储之间的过渡通过如下方案实现:所述第三级模式存储按需分段展开,共分8段,每段对应32个表项,每一段内部的有效表项按照位图压缩的方式连续存储,使得表示位图的无符号整数数组仍然有效,辅助数组改为存放每一段的有效表项数;切换到第三级模式存储后仍然保留第二级模式存储的外挂数组,并将其用于集中存放每一段的前两个表项,这样,仅当落在某段内的有效表项数大于二时才需要展开该段,分配外挂数组存放多出来的表项,否则不必展开,也无需分配外挂数组。
[0014]进一步的,所述分支节点所存储的每个表项为一个结构体,由一个指针和四个字节构成,所述指针指向子节点,所述四个字节分别为索引值、特征值、子节点类型和子节点字节数,所述索引值为该表项所对应的原始索引值,所述特征值表明了该表项上的路由信息分布情况;所述特征值与索引值的每一位都一一对应,如果特征值的某一位是1,则表示存在匹配到索引值相应位的路由信息;反之,若特征值某位是0,则意味着不存在匹配到索引值相应位的路由信息;若特征值为全0,则表示在这一字节上没有匹配的路由前缀;若特征值非0,则只要知道特征值的二进制表示中的I的分布情况,就能知道在这一字节上有哪些匹配的路由前缀。
[0015]再进一步的,所述表项中的特征值字段只需存放特征值的后6位。
[0016]进一步的,所述分支节点中的一个有效表项中,如果不存在更长的前缀,此时表项中的指针直接指向存放该路由信息的叶子节点或叶柄节点;如果存在更长的前缀,那么表项中的指针就要指向下一层的子节点,此时如果还存在匹配到该字节上的路由,就把存放这些路由信息的叶子或叶柄节点的指针放在子节点里,可以通过子节点来间接访问这些路由信息。
[0017]进一步的,在IPv6路由树(即上述八比特树)中创建前缀长度为128的叶子节点,用于存放所关联的DFLOW的信息。
[0018]根据上述方案得到的本发明能够在不增加内存占用的基础上使ipv6路由的添力口、查找和删除速度提升数倍。同时本发明有效解决DFLOW与路由树之间的关联的问题,有效提高了报文的转发效率。
【专利附图】

【附图说明】
[0019]以下结合附图和【具体实施方式】来进一步说明本发明。
[0020]图1为本发明中数据结构的示意图;
[0021]图2为本发明中位图压缩的示意图。
【具体实施方式】
[0022]为了使本发明实现的技术手段、创作特征、达成目的与功效易于明白了解,下面结合具体图示,进一步阐述本发明。
[0023]为了减少访存次数,采用多比特树(即多叉树)算法是对二叉树算法的一个很直观的改进。通过前缀扩展,二叉树可以很容易地转化为多比特树。二叉树一次只能比较一位,而多比特树一次就能比较多位,减少了访存次数,提高了查找效率。因为八比特正好是一个字节,便于访问,所以本发明提出的方案是基于八比特树的。
[0024]单纯的多比特树本质上只是简单地以空间换时间的方法,占用内存比二叉树大得多,故受到内存容量的限制而很难实用。因此,必须对多比特树进行压缩,以减少其空间占用。
[0025]对于非压缩八比特树来说,每个分支节点里都有一个表格,这个表格共有28=256项(故而八比特树也可称为256叉树)。一般情况下,这个表格中会有大量的空表项和重复表项,这是由于前缀扩展造成的,也是空间浪费的根源。因此,压缩算法应考虑把空表项和重复表项压缩掉。当然,分支节点中也要记录各分支的公共地址前缀,以便于比较没有分支的字节。
[0026]本发明中的压缩方案为:把分支节点中的表格设计为动态扩展的,按需分配;表格中一般只记录“有价值”的表项,即实际插入的前缀,而由前缀扩展而产生的重复表项和空表项则不记录;利用“位图”,即一个由字节数组表示的二进制位串,把压缩前后的表项索引值做一个映射,只要知道压缩前的索引值就可以快速计算出压缩后的索引值。
[0027]由此,本发明利用位图进行对分支节点中的表格进行压缩。在位图中,每一位都对应着原始未压缩表格中的一个表项,O表不可以被压缩掉的垃圾表项,I表不需要保留的有实际意义的表项。这样,只需记录位图中所有I对应的表项即可,而O所对应的无意义表项则不再占用空间(如图2所示)。
[0028]由于外界并不知道节点内部的表格是如何存储的,只当成是原始未压缩的表格,因此查询时只能给出原始表格的索引。此时需要把这个原始索引转化为压缩后表格的索弓丨,然后再利用压缩后的索引找到相应的表项。
[0029]对于八比特树,原始表格有28=2 56项,因此需要256位的位图,可以使用长度为8的32位无符号整数数组来表示,记为bmp [8]。为了实现索引的快速转化,还需要一个无符号字节数组ones [8]作为辅助数组,用于记录bmp数组从起始处到每个元素末位的这一段位串中I的总个数。例如,ones[i]表示从bmp[0]的第一位到bmp[i]的最后一位这一段位串中出现的I的总个数。
[0030]在进行映射时,把位图看成一个位数组,用原始索引查询该数组,得到一位。如果该位是O,则表明查到的是被压缩掉的表项;如果该位是1,则从位图开始到该位之前(不包括该位本身)这一段的所有I的个数就是压缩后表格中的索引。至于位图中某一位前面I的个数,可以由bmp和ones这两个数组方便地算出(以ones数组的某个元素的值为基础,加上或减去一个修正值即可,该修正值的计算过程中可能需要求出一个无符号整数的二进制表示中I的个数,可使用查表法或硬件指令计算)。
[0031]基于上述方案,本发明采用如图1所示的数据结构。该数据结构中分支节点的压缩表格以数组的形式存储,且被分为两部分——内置数组和外挂数组。内置数组就固化在节点中,只有6个表项(采用6个表项可以让节点大小正好能够一次性读入高速缓存);外挂数组是在内置数组的空间不够用时,根据需要动态分配的,位于节点之外,但在节点内有指针指向它。由于有效表项都是连续存放的,所以插入和删除表项将使插入或删除位置后面的所有表项都后移或前移一格。
[0032]为了避免空间的浪费,分支节点根据其所需存储的压缩后的表项数,分为三级存储模式。第一级模式存储的表项数最少,仅使用节点的内置数组的存储空间足以;第二级模式存储的表项数稍多,在继续利用内置数组的基础上再加一个能容纳16个表项的外挂数组来存储内置数组“装不下”的其余表项;第三级模式可存储的表项数更多,在需要时最多可容纳全部的256个表项。
[0033]第一二级之间的过渡是自然的,仅需分配或释放外挂数组即可。第二三级之间的过渡要麻烦一点儿,因为第三级其实是按需分段展开,共分8段,每段对应32个表项,并复用节点的内置数组的空间存储段指针,每个段指针指向一个存储了本段内表项的外挂数组。此时,一个表项的索引值的前3位就是该表项的段号,而该表项在段内的存储位置则由索引值的后5位决定。
[0034]为了减少第三级模式的空间占用,以及使第二三级之间的切换更加平滑,有如下优化方案:第三级模式虽然按段展开,但每一段内部的有效表项仍然按照位图压缩的方式连续存储,位图数组bmp仍然有效,辅助数组ones改为存放每一段的有效表项数(即此时ones[i]=bmp[i]的二进制I的个数);切换到第三级后仍然保留第二级的那个外挂数组,但用途改为集中存放每一段的前两个表项。这样,仅当落在某段内的有效表项数大于二时才需要展开该段,分配外挂数组存放多出来的表项,否则不必展开,也无需分配外挂数组,更加节省内存空间。为了避免第二三级之间的频繁切换,还需要设置一个缓冲阀值。
[0035]与二叉树相比,本发明采用八比特树引入了一个新的问题,就是最长匹配的掩码长度不一定是八的倍数,前缀扩展后一些路由条目会发生互相覆盖的情况,这就需要用特征值技术加以解决了。
[0036]分支节点所存储的每个表项都是一个结构体,由一个指针和四个字节构成,其中的指针指向子节点(可能为分支节点,也可能为叶子或叶柄节点)。那四个字节分别为索引值、特征值、子节点类型和子节点字节数。索引值即该表项所对应的原始索引值;特征值表明了该表项上的路由信息分布情况,起到减少访存次数和避免回溯的作用。
[0037]表项中的索引值其实就是路由表中的一个IPv6地址前缀中的一个字节。两个IPv6地址前缀,即使其中的地址部分内容完全相同,也不能判定这两个IPv6地址前缀是相同的,因为它们的前缀长度有可能不同(只有前缀长度也相同,才能认为两个地址前缀相同)。比如,01001*和0100100*就是两个不同的前缀(二进制表示,明确写出的数字的个数就是前缀长度,表示后面都是用于填充的无意义的0),后者比前者长,尽管两者对应的位都相同。像这样除前缀长度不同外其他都相同的IPv6地址前缀最后很可能会落在同一个节点的同一个表项中,互相覆盖,造成混乱。出现这种情况时,叶柄节点就派上用场了,其中的指针数组里的每个指针都按顺序依次对应于这一表项中的索引值中的八个二进制位中的一位。因此,哪一位上有匹配的路由,这一位对应的指针所指向的叶节点就是所要寻找的。
[0038]由此,对路由表的一个常见操作是最长前缀匹配,其主要过程是从根节点开始,与目的ipv6地址的各字节从前到后依次匹配,找到正确的分支,通过子节点指针沿着压缩八比特树向下搜索,直到找到前缀最长的匹配结果为止。在匹配过程中要不断地记录与更新当前所找到的与目的地址前缀匹配且长度最长的路由节点,最后再根据最新记录的信息得出最长前缀匹配的结果,只有这样,才能避免回溯。但是,如果每匹配一个字节,都要进入叶或叶柄节点去检查的话,将大大增加访存次数,不仅不能提高效率,反而可能降低效率。这时,本发明中提出的特征值就派上用场了。
[0039]特征值与索引值的每一位都一一对应,如果特征值的某一位是I,则表示存在匹配到索引值相应位的路由信息;反之,若特征值某位是0,则意味着不存在匹配到索引值相应位的路由信息。若特征值为全0,则表示在这一字节上没有匹配的路由前缀(但这一表项的存在,表明可能有更长的匹配项);若特征值非0,则只要知道特征值的二进制表示中的I的分布情况,就能知道在这一字节上有哪些匹配的路由前缀。由此看来,特征值就像是叶柄节点指针数组的一个缩影,表明了其特征,故命名为特征值。利用特征值,可以大大减少不必要的访存次数,提高最长前缀匹配的性能。
[0040]但要注意,前缀扩展对特征值是有影响的。前缀扩展是所有多比特树算法都必须使用的技术,不过在本方案中,前缀扩展所带来的复杂性已经被大大降低了,影响范围也缩小了,仅限于对特征值的修改。在同一节点中,因为存在前缀扩展的影响,故而所有表项的特征值是相互关联的,前面的会对后面的有影响。每插入一个表项,其特征值都是综合前面表项特征值的信息和它本身携带的信息而得出的,并且要更新它后面的在覆盖范围内的表项的特征值,以体现新插入表项的信息。当删除表项时,除了要删除它本身并将后面的表项前移外,还要消除所删表项对后面表项的特征值造成的影响。特征值为O表示没有前缀落在IP地址的这一段内,此时该表项能存在的唯一理由就是它的下一节点指针非空,即有更长的前缀存在,否则这一全空表项应被删除。
[0041]由于修改特征值会影响其他表项,最坏情况下可能需要更新128个连续表项。为此,本发明提供了一个优化措施,即表项中的特征值字段只需存放特征值的后6位,因为同一分支节点内的所有表项的特征值的前两位的情况其实可以用该分支节点内的一个字节来表示。这样,更新特征值时,如果要更新的是前两位,只需更新分支节点内的那个字节即可,否则需要更新表项中的特征值字段,但最坏情况也只需更新32个连续表项。使用特征值时需要把表项中的特征值字段和分支节点内的特征值字节的信息综合起来,来还原真实的特征值。
[0042]在本发明中,对于分支节点中的一个有效表项来说,如果不存在更长的前缀,那么必定存在匹配到该表项的索引值字节上的路由,此时表项中的指针可以直接指向存放该路由信息的叶子节点(或叶柄节点);如果存在更长的前缀,那么表项中的指针就要指向下一层的子节点,此时如果还存在匹配到该字节上的路由,那么就把存放这些路由信息的叶子或叶柄节点的指针放在子节点里,可以通过子节点来间接访问这些路由信息,由此在进行最长前缀匹配时,无论如何都要访问子节点,因而不会增加额外的访存。
[0043]虽然这样做不太符合人的思维习惯(因为它可能把属于父节点的信息挂到子节点上),但有助于提升性能,因为它把树中的一些节点“折叠”起来,除非这些节点就是最终查找结果,否则匹配时这些节点会被跳过,相当于降低了树高,减少了访存次数。
[0044]路由表结构体中单独设置了一个指针,专门用于指向全O的默认路由,同样起到了降低树高的作用,也可看做是另一种节点“折叠”技术。
[0045]对于DFL0W,其大致工作原理如下:BSP将报文直接给DFL0W,如果DFLOW能查找到对应的转发表项,则直接修改报文头部,然后进行转发。如果查找不到对应表项,则需要重新定向到GPL,然后由GPL进行额外处理,比如可能针对子端口进行处理。当然,在DFLOW查找不到表项时,针对目标地址的DFLOW条目也会被创建,并与路由树相关联。
[0046]使用DFLOW的优势:由于DFLOW内部使用了优秀的hash算法,即使查询128位掩码的目标地址项,也能将冲突控制在4到5次,大大减少了访存次数,提高了转发效率。
[0047]DFLOff与路由树关联的必要性:当路由表更新后,DFLOff中所记录的用于转发的路由信息可能已被删除,或者不再是最优路由,因此DFLOW也需要被同步更新。但如果DFLOW与路由树没有关联的话,就无法知道需要更新哪些DFLOW表项,所以需要把DFLOW与路由树相关联,一般路由树更新时能够找到相关的DFL0W。
[0048]在本发明中为了关联DFL0W,可以在IP v6路由树(即前面所述的八比特树)中创建前缀长度为128 (对于IPv4来说是32)的叶子节点,用于存放所关联的DFLOW的信息。这样,当发生路由更新时,可以根据更新的节点所覆盖的子树的范围,准确地知道哪些DFLOW需要被同步更新,而无关的DFLOW也不会被“误伤”。
[0049]综上所述,本发明提供的方案还解决了另外两个问题,一是大量流量冲击上来时,DFLOW表项刚开始为空,需要根据流量创建DFLOW条目,导致初始转发时,势必性能不高。二是如果多方向的流量,当一边路由撤销,但是网络中流量还存在,将导致路由不存在那一个方向的DFLOW被删除,然后因为流量到达本地,又再次尝试创建DFL0W,但是路由不存在会导致创建DFLOW不成功,处于uncomplete的DFLOW又被删除,周而复始。最终大量耗费cpu,影响正常的流量转发。对于第一个问题,因为已经使用了压缩八比特树存储路由表,性能相对二叉树大大提高,所以即使在没有DFLOW的情况下直接查询路由表,性能也不会太低。对于第二个问题,全掩码位的叶子节点就能派上用场。对于没有可达路由的目的地址,可在路由树中创建全掩码位的叶子节点,并成功创建DFL0W,挂在上述叶子节点上,然后通过设置标志,让IP层直接丢弃此类报文,这就避免了 DFLOW的反复尝试创建和删除。可以通过DFLOW老化超时或者路由变更,进行这类叶子节点的回收。
[0050]基于上述方案,例举如下实例进一步说明本发明的方案:
[0051]实例I
[0052]参见图2,其所示内容为利用位图进行索引映射的过程。由图可知,其顶部的有16个元素的原始数组100里,索引为3、4、9和14的元素有实际内容需要存储,其余为空,由此可以把有实际内容的元素集中连续存放,形成一个压缩后只有4个元素的数组300,见图底部。[0053]利用图中部的位图200,可以把原始索引值映射为压缩后的索引值,3映射为0,4映射为1,9映射为2,14映射为3,其他原始索引对应的位图上的比特位均为0,表明这些索引上没有内容存储。
[0054]图1为本发明的主要数据结构的示意图。由图可知,R系节点均为保存路由信息的叶子节点,B系节点为分支节点。从图中可以看出,BI处于第二级模式(若无外挂数组,就是第一级模式),B2处于第三级模式(有多个外挂数组)。BI的第一个分支的指针指向B2,表明有更长的路由存在,但B2的父节点指针却没有指向BI,而是指向R1,R1的父节点和子节点指针分别指向BI和B2,这说明Rl在逻辑上属于BI,只是被“折叠”了,是一条正好匹配到BI的第一个分支所对应索引值的路由。一般来说(即不包含默认路由RO的那种“折叠”),所有被“折叠”的节点的父节点一定是分支节点,但其子节点类型任意,比如R9也是被“折叠”的节点。
[0055]对于叶柄节点L没被“折叠”,由于L里存放的地址比其父节点BI里的地址的有效长度更长,它们之间有被“跳过”的字节,而不是L正好落在BI的某分支上。否则,在存在有效字节数更多的路由R4的情况下,L也将被“折叠”。R5和R6的IPv6地址部分一定相同,但前缀长度一定不同。
[0056]实例2,
[0057]该实例针对特征值的方案。假设路由表中只有110*和11010*两个前缀(为简单起见,以只有一个有效字节的地址前缀为例),可初步确定二者的原始特征值分别为(00100000)2和(00001000)2,但由于110*也是11010*的前缀,所以要进行前缀扩展,将110*的特征值叠加到11010*的特征值上,最终110*和11010*的特征值分别为(00100000)2 和(00101000)2。
[0058]如果要对目的前缀11011*做最长前缀匹配,首先找到的一定是11010* (11011*在位图中对应的位一定为0,但此时仍然可以通过计算该位前面所有I的个数的方法,来得到在11011*前面且与之最接近的有效前缀11010*在压缩数组中的索引值,当然,这种方法只适用于最长前缀匹配,并不适用于精确匹配),虽然这二者并不完全匹配,但仍然可以通过前面匹配的位数(该实例中是4位)从11010*的特征值(00101000)2的前4位(0010)内找出最后一个I的位置,是在第3位,从而得到最长匹配前缀110*。由此,如果不进行前缀扩展的话,是无法正确地找到最长匹配前缀的。以上显示和描述了本发明的基本原理、主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。
【权利要求】
1.一种实现IPv6快速路由查找的方法,其特征在于,所述方法利用多比特树的数据结构来存储路由表,再利用压缩方法将分支节点中的表格中由前缀扩展而产生的重复表项和空表项进行压缩,并把压缩前后的表项索引值做一个映射。
2.根据权利要求1所述的一种实现IPv6快速路由查找的方法,其特征在于,采用八比特树,利用位图进行压缩,在位图中,每一位都对应着原始未压缩表格中的一个表项,O表示可以被压缩掉的垃圾表项,I表示需要保留的有实际意义的表项。
3.根据权利要求2所述的一种实现IPv6快速路由查找的方法,其特征在于,所述位图为256位的位图,使用长度为8的32位无符号整数数组来表示,并利用一个无符号字节数组作为辅助数组,用于记录无符号整数数组从起始处到每个元素末位的这一段位串中I的总个数;在进行压缩前后的表项索引值做映射时,把位图作为一个位数组,用原始索引查询该数组,得到一位,如果该位是O,则表明查到的是被压缩掉的表项;如果该位是1,则从位图开始到该位之前这一段的所有I的个数就是压缩后表格中的索引。
4.根据权利要求1所述的一种实现IPv6快速路由查找的方法,其特征在于,所述多比特树的数据结构中分支节点的压缩表格以数组的形式存储,且被分为内置数组和外挂数组两部分,所述内置数组固化在节点中,所述外挂数组在内置数组的空间不够用时,根据需要动态分配的,位于节点之外,但在节点内有指针指向它;所述分支节点根据其所需存储的压缩后的表项数,分为三级存储模式,第一级模式存储的表项数最少,仅使用节点的内置数组的存储空间;第二级模式存储的表项数稍多,在继续利用内置数组的基础上再加一个能容纳16个表项的外挂数组来存储内置数组装不下的其余表项;第三级模式可存储的表项数更多,最多可容纳全部的256个表项。
5.根据权利要求4所述的一种实现IPv6快速路由查找的方法,其特征在于,所述内置数组有6个表项。`
6.根据权利要求4所述的一种实现IPv6快速路由查找的方法,其特征在于,所述第一级模式存储和第二级模式存储之间的过渡通过分配或释放外挂数组来实现;所述第二级模式存储和第三级模式存储之间的过渡通过如下方案实现:所述第三级模式存储按需分段展开,共分8段,每段对应32个表项,每一段内部的有效表项按照位图压缩的方式连续存储,使得表示位图的无符号整数数组仍然有效,辅助数组改为存放每一段的有效表项数;切换到第三级模式存储后仍然保留第二级模式存储的外挂数组,并将其用于集中存放每一段的前两个表项,这样,仅当落在某段内的有效表项数大于二时才需要展开该段,分配外挂数组存放多出来的表项,否则不必展开,也无需分配外挂数组。
7.根据权利要求1所述的一种实现IPv6快速路由查找的方法,其特征在于,所述分支节点所存储的每个表项为一个结构体,由一个指针和四个字节构成,所述指针指向子节点,所述四个字节分别为索引值、特征值、子节点类型和子节点字节数,所述索引值为该表项所对应的原始索引值,所述特征值表明了该表项上的路由信息分布情况;所述特征值与索引值的每一位都一一对应,如果特征值的某一位是1,则表示存在匹配到索引值相应位的路由信息;反之,若特征值某位是O,则意味着不存在匹配到索引值相应位的路由信息;若特征值为全O,则表示在这一字节上没有匹配的路由前缀;若特征值非O,则只要知道特征值的二进制表示中的I的分布情况,就能知道在这一字节上有哪些匹配的路由前缀。
8.根据权利要求7所述的一种实现IPv6快速路由查找的方法,其特征在于,所述表项中的特征值字段只需存放特征值的后6位。
9.根据权利要求1所述的一种实现IPv6快速路由查找的方法,其特征在于,所述分支节点中的一个有效表项中,如果不存在更长的前缀,此时表项中的指针直接指向存放该路由信息的叶子节点或叶柄节点;如果存在更长的前缀,那么表项中的指针就要指向下一层的子节点,此时如果还存在匹配到该字节上的路由,就把存放这些路由信息的叶子或叶柄节点的指针放在子节点里,可以通过子节点来间接访问这些路由信息。
10.根据权利要求2所述的一种实现IPv6快速路由查找的方法,其特征在于,在八比特树中创建前缀长度为128的叶 子节点,用于存放所关联的DFLOW的信息。
【文档编号】H04L12/741GK103780491SQ201210408884
【公开日】2014年5月7日 申请日期:2012年10月23日 优先权日:2012年10月23日
【发明者】汪革, 彭双庭, 冯松柏 申请人:上海博达数据通信有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1