IPv6地址前缀压缩存储方法及设备的制作方法

文档序号:7897599阅读:546来源:国知局
专利名称:IPv6地址前缀压缩存储方法及设备的制作方法
技术领域
本发明涉及下一代互联网领域,更具体地,涉及一种IPv6地址前缀存储方法和设备。
背景技术
众所周知,IPv6地址长度是128比特,而IPv4地址长度是32比特。就地址长度 而言,IPv6比IPv4扩大了 4倍;就容量而言,则扩大了 2s36倍。由于IPv6地址容量的急剧 增长,因此需要一种高效可行的IPv6地址存储和查找方式。
随着技术的发展,人们提出了基于多分支Trie树的IPv6地址前缀存储和查找算 法。字典树(Trie)是一种用于快速字符串检索的多叉树结构。其原理是利用字符串的公 共前缀来降低时空开销,从而达到提高程序效率的目的。Trie树在本质上是一个确定的有 限状态自动机,每个结点代表一个状态,根据输入变量的不同,进行状态转移。用Trie树搜 索一个关键码的时间与关键码自身及其长度有关,最快是0 (1),即在第一层即可判断是否 搜索到,最坏的情况是0 (η),n为Trie树的层数。由于很多时候Trie树的大多数结点分支 很少,因此Trie树结构空间浪费比较多。如果把每次查找检查的字符个数定义为步长,传 统的Trie树步长为1,多分支Trie树的查找步长大于1。利用多分支Trie树可以有效减 少查找过程中的存储器访问次数。
虽然该算法在查找速度上获得了很大的提高,但仍然需要较大的存储空间。图1 示出了步长为K = 16、层数为128/16 = 8的多分支Trie树(MT)的示意结构。如图1所 示,多分支Trie树的每一个节点都包含216 = 65536个分支节点。因此,每个节点包含一块 连续的大小为65536个单元的内存,分别指向65536个子节点。由于IPv6地址长度为1 比特,因此MT的最大层数(深度)为8(1^/16 = 8)。MT的实际层数由存储的IPv6地址 前缀决定,当MT中不存储任何IPv6地址前缀时,MT中只包含根节点,层数为0,当存储的 IPv6地址前缀中包含长度为16的前缀时,层数为1。依此类推,当存储的IPv6地址前缀中 包含长度为128的前缀时,层数为8。
因此,当IPv6地址前缀较多且比较分散时,需要非常大的存储空间,同时产生了 很多的空指针,一方面会造成内存的巨大浪费,另一方面会影响查找效率。发明内容
本发明提出了一种IPv6地址前缀存储方法,可以在使用有限内存的情况下实现 IPv6地址前缀的存储,并且能够实现高效查找。
根据本发明的一个方面,提供了一种用于存储IPv6地址前缀的方法,包括将 IPv6地址前缀划分为具有固定长度K的L个部分,其中K和L均为正整数;使用步长为K、 层数为L的多分支Trie树结构存储IPv6地址前缀,其中每一个节点使用长度为2K的数组 来存储节点指针,节点指针在数组中的位置表示IPv6地址前缀的K个比特;以及利用额外 数组对生成的多分支Trie树中的每一个节点进行压缩存储。
优选地,所述压缩存储包括针对多分支Trie树中的每一个节点,利用两个数组 来代替,第一数组存储该节点中的非空指针值,而第二数组存储每一个非空指针值在该节 点中的对应位置。
优选地,初始化多分支Trie树结构,使得与根节点相对应的数组中均为空指针。
优选地,针对多分支Trie树中的每一个节点,通过遍历与该节点相对应的数组, 将非空指针和其相应的位置分别存储在第一数组和第二数组中。
优选地,所述方法还包括如果需要查找已存储的IPv6地址前缀,则使用二分法 依次查找每一层节点的第二数组。
优选地,步长K等于16。
根据本发明的另一个方面,提供了一种用于存储IPv6地址前缀的设备,包括划 分单元,将IPv6地址前缀划分为具有固定长度K的L个部分,其中K和L均为正整数;存储 单元,使用步长为K、层数为L的多分支Trie树结构存储IPv6地址前缀,其中每一个节点使 用长度为2K的数组来存储节点指针,节点指针在数组中的位置表示IPv6地址前缀的K个比 特;以及压缩单元,利用额外数组对生成的多分支Trie树中的每一个节点进行压缩存储。
优选地,所述压缩单元针对多分支Trie树中的每一个节点,利用两个数组来代 替,第一数组存储该节点中的非空指针值,而第二数组存储每一个非空指针值在该节点中 的对应位置。
优选地,所述存储单元初始化多分支Trie树结构,使得与根节点相对应的数组中 均为空指针。
优选地,所述压缩单元针对多分支Trie树中的每一个节点,通过遍历与该节点相 对应的数组,将非空指针和其相应的位置分别存储在第一数组和第二数组中。
优选地,该设备还包括查找单元,如果需要查找已存储的IPv6地址前缀,则所述 查找单元使用二分法依次查找每一层节点的第二数组。
优选地,步长K等于16。
与现有技术相比,本发明的优点主要在于可以在使用较少内存的情况下实现 IPv6地址前缀的存储。本发明解决了传统的多分支Trie树空指针浪费的问题,减少了节点 指针占用的内存空间。此外,本发明减少了 IPv6地址前缀查找过程中的查找次数,有效地 提高了查找效率。


通过下面结合

本发明的实施例,将使本发明的上述及其它目的、特征和 优点更加清楚,其中
图1示出了步长K为16的多分支Trie树结构的一个示例;
图2示出了根据本发明一个实施例的IPv6地址前缀存储方法的流程图3示出了根据本发明一个实施例向多分支Trie树结构添加IPv6地址前缀的示 意过程;
图4示出了根据本发明一个实施例对步长K为16的NEXT数组进行压缩的示意 图5示出了根据本发明一个实施例的IPv6地址前缀存储设备的框图;以及
图6示出了根据本发明另一个实施例的IPv6地址前缀存储设备的框图。
具体实施方式
为了清楚详细的阐述本发明的实现过程,下面给出了一些本发明的具体实施例。 参照附图对本发明的实施例进行详细说明,在描述过程中省略了对于本发明来说是不必要 的细节和功能,以防止对本发明的理解造成混淆。
图2示出了根据本发明一个实施例的IPv6地址前缀存储方法20的流程图。如图 2所示,方法20从步骤S200处开始。
在步骤S202,首先把要存储的IPv6地址前缀划分为具有固定长度K的L个部分, 其中K和L均为正整数。由于IPv6地址前缀不会超过128比特,因此K与L的乘积不大于 128。一般来说,为了便于存储,K是2的正整数次幂。
接下来,在步骤S204,按照多分支Trie树结构来存储Ipv6地址前缀。在一个实施 例中,该步骤S204可具体包括如下步骤
首先,初始化具有2K个存储单元的第一指针数组,该指针数组对应于Trie树的根 节点。由于此时还未存储任何IPv6地址前缀,因此可以将第一指针数组中的所有存储单元 均为空指针。
设置计数值N,其中N是数值范围在[1,L]中的正整数。针对每一个正整数值N,依 次执行如下步骤初始化具有2K个存储单元的第Ν+1指针数组,在第N指针数组中与IPv6 地址前缀的第N部分相对应的位置存储第Ν+1指针数组的首地址。通过该过程,能够将IPv6 地址前缀存储到多分支Trie树结构中。
然后,在步骤S206,压缩生成的多分支Trie树。根据本发明的一个实施例,该步 骤S206可以包括如下步骤针对多分支Trie树中的每一个节点,利用两个数组来代替,第 一数组存储该节点中的非空指针值,而第二数组存储每一个非空指针值在该节点中的对应 位置。这样,原先的Trie树中每一个节点占用的2K个存储单元均被压缩为仅包括非空指 针值的数组以及表示非空指针值的相应位置的数组,这两个数组占用的空间比每一个节点 原先占用的2Κ个存储单元小得多,因而极大地降低了存储需求,并且能够减少查找时所需 的次数和时间。
最后,方法20在步骤S208处结束。
可以理解,在步骤S204中,如果要存储的IPv6地址前缀的第N部分已经存在于第 N指针数组中,则可以使用已有的第Ν+1指针数组,而无需初始化新的第Ν+1指针数组。
备选地,尽管图3中未示出,该方法还可以包括在存储IPv6地址前缀后进行查找。 例如,该查找过程可以包括
1)取Trie树的根节点为当前节点,设X为IPv6地址前缀的0至K-I比特值,并且 令N = 1 ;
2)如果N不大于IPv6地址前缀的部分的总个数,在当前节点的数组AJ中查找X, 例如可以采用二分查找算法;否则,转到步骤4);
3)如果X为AJ的第k个值,取AN[k]为当前节点,设X为IPv6地址前缀的K*N至 K*N+K-1位值,N加1后转到步骤2);否则,如果X不在数组AJ中,则转到步骤4);
4)取当前节点为查找结果;如果没有找到相应的IPv6地址前缀,则查找结果是空5指针。
图3示出了根据图2所示的方法向多分支Trie树结构添加IPv6地址前缀的示意 过程。
如图3所示,在本示例中,要向步长K为16的多分支Trie树中插入IPv6地址前 缀 2002: c058:6301 :c058: :/64。由于 IPv6 地址前缀 2002 c058 6301 c058 :/64 的长度是 64比特,因此需要将该IPv6地址前缀划分为64/16 = 4个部分(即L等于4)。
图3的(a)部分示出了刚初始化的多分支Trie树根节点,包含一块连续的、大小 为2"5 = 65536个单元的内存,每个内存单元中存储的都为空指针。换句话说,对应于根节 点的指针数组NEXT中均为空指针。
图3的(b)部分示出了将IPv6地址前缀2002: c058:6301 :c058: :/64存储到多分 支Trie树结构的过程。
首先,取IPv6 地址前缀 2002:c058:6301 :c058: :/64 的前 16 比特值“2002”,判 断根节点的指针数组NEXT[2002]为空指针,则新建一个节点NODEl并初始化,将根节点的 NEXT[2002]指向N0DE1。即,根节点的NEXT[2002]中存储新建的节点NODEl的指针数组 NEXT的首地址。
然后,取IPv6 地址前缀 2002c058:6301:c058 /64 的第二个 16 比特值“c058”, 判断节点NODEl的NEXT[c058]为空指针,则新建一个节点N0DE2并初始化,将节点NODEl 的NEXT[c058]指向N0DE2 ;S卩,节点NODEl的NEXT[c058]中存储新建的节点N0DE2的指针 数组NEXT的首地址。
接下来,取IPv6地址前缀2002 :c058:6301 :c058: :/64的第三个16比特值 "6301",判断节点N0DE2的NEXT [6301]为空指针,则新建一个节点N0DE3并初始化,将节点 N0DE2的NEXTM301]指向N0DE3 ;即,节点N0DE2的NEXT[6301]中存储新建的节点N0DE3 的指针数组NEXT的首地址。
最后,取IPv6 地址前缀 2002:c058:6301 :c058::/64 的最后 16 比特值“c058”,判 断节点N0DE3的NEXT[c058]为空指针,则新建一个节点N0DE4并初始化,将节点N0DE3的 NEXT[c058]指向N0DE4 ;S卩,节点N0DE3的NEXT[c058]中存储新建的节点N0DE4的指针数 组NEXT的首地址。
通过上述过程,将IPv6地址前缀2002 :c058:6301 :c058: :/64存储到多分支iTrie 树中。
图4示出了根据本发明一个实施例对图3生成的多分支Trie树的根节点进行压 缩的示意图。例如,如果与根节点相对应的长度为65536的NEXT数组中仅包含5个非空 指针,则可以采用数组AN存储这5个非空指针值,并采用数据AJ存储这5个非空指针在 NEXT数组中出现的位置。具体地,如图4所示,NEXT数组中的非空指针是NEXT
= Oxcc 123d44、NEXT[1] = 0xc2123654、NEXT [1024] = 0x2378cab8、NEXT [41024] = 0x2378cabc 以及 NEXT[63028] = 0x4378cab0。那么,数组 AN 包括AN
=Oxcc 123d44、AN[1]= 0xc2123654、AN[2] = 0x2378cab8、AN[3] = 0x2378cabc 和 AN[4] = 0x4378cab0。相应地, 数组 AJ 包括AJ
=0、AJ[1] =1、AJ[2] = 1024, AJ[3] = 41024 和 A九4] = 63028。
这样,可以将根节点占用的内存从65536个单元减少到10个单元。
当需要查找根节点的NEXT数组时,先遍历AJ数组,判断XX(IPv6地址前缀的前16比特)是否存储在AJ中。如果存储在AJ[i] = XX,则取NEXT[XX] = AN[i];否则,取 NEXT[XX]为空指针。优选地,可以使用二分法来查找数组AJ。
本领域的技术人员可以理解,图4所示的对根节点进行压缩的过程同样适用于对 各个子节点进行压缩。
图5示出了根据本发明一个实施例的IPv6地址前缀存储设备50的框图。如图5 所示,IPv6地址前缀存储设备50包括划分单元510、存储单元520和压缩单元530。
划分单元510把要存储的IPv6地址前缀划分为具有固定长度K的L个部分,其中 K和L均为正整数。由于IPv6地址前缀不会超过128比特,因此K与L的乘积不大于128。 一般来说,为了便于存储,K是2的正整数次幂。
存储单元520按照多分支Trie树结构来存储Ipv6地址前缀。首先,存储单元520 初始化具有2K个存储单元的第一指针数组,该指针数组对应于Trie树的根节点。由于此时 还未存储任何IPv6地址前缀,因此可以将第一指针数组中的所有存储单元均为空指针。然 后,存储单元520设置计数值N,其中N是数值范围在[1,L]中的正整数。针对每一个正整 数值N,存储单元520依次执行如下步骤初始化具有2K个存储单元的第Ν+1指针数组,在 第N指针数组中与IPv6地址前缀的第N部分相对应的位置存储第Ν+1指针数组的首地址。
压缩单元530压缩由存储单元520生成的多分支Trie树。根据本发明的一个实施 例,压缩单元530针对多分支Trie树中的每一个节点,利用两个数组来代替,第一数组存储 该节点中的非空指针值,而第二数组存储每一个非空指针值在该节点中的对应位置。这样, 原先的Trie树中每一个节点占用的2K个存储单元均被压缩为仅包括非空指针值的数组以 及表示非空指针值的相应位置的数组,这两个数组占用的空间比每一个节点原先占用的2Κ 个存储单元小得多,因而极大地降低了存储需求,并且能够减少查找时所需的次数和时间。
图6示出了根据本发明另一个实施例的IPv6地址前缀存储设备60的框图。图6 中的大部分组件与图5中的相同,不同之处仅在于图6所示的IPv6地址前缀存储设备60 还包括查找单元Μ0。为了简便起见,下文仅对查找单元540进行详细描述。
为了在已存储的IPv6地址前缀中查找特定的IPv6地址前缀,查找单元540可执 行如下处理
1)取Trie树的根节点为当前节点,设X为IPv6地址前缀的0至K-I比特值,并且 令N = 1 ;
2)如果N不大于IPv6地址前缀的部分的总个数,在当前节点的数组AJ中查找X, 例如可以采用二分查找算法;否则,转到步骤4);
3)如果X为AJ的第k个值,取AN[k]为当前节点,设X为IPv6地址前缀的K*N至 K*N+K-1位值,N加1后转到步骤2);否则,如果X不在数组AJ中,则转到步骤4);
4)取当前节点为查找结果;如果没有找到相应的IPv6地址前缀,则查找结果是空 指针。
与现有技术相比,本发明解决了传统的多分支Trie树空指针浪费的问题,减少了 节点指针占用的内存空间,因而可以在使用较少内存的情况下实现IPv6地址前缀的存储。 此外,本发明减少了 IPv6地址前缀查找过程中的查找次数,减少了查找时间,从而有效地 提高了查找效率。
至此已经结合优选实施例对本发明进行了描述。应该理解,本领域技术人员在不脱离本发明的精神和范围的情况下,可以进行各种其它的改变、替换和添加。因此,本发明 的范围不局限于上述特定实施例,而应由所附权利要求所限定。
权利要求
1.一种用于存储IPv6地址前缀的方法,包括将IPv6地址前缀划分为具有固定长度K的L个部分,其中K和L均为正整数;使用步长为K、层数为L的多分支Trie树结构存储IPv6地址前缀,其中每一个节点使 用长度为2K的数组来存储节点指针,节点指针在数组中的位置表示IPv6地址前缀的K个 比特;以及利用额外数组对生成的多分支Trie树中的每一个节点进行压缩存储。
2.根据权利要求1所述的方法,其中,所述压缩存储包括针对多分支Trie树中的每 一个节点,利用两个数组来代替,第一数组存储该节点中的非空指针值,而第二数组存储每 一个非空指针值在该节点中的对应位置。
3.根据权利要求1所述的方法,其中,初始化多分支Trie树结构,使得与根节点相对应 的数组中均为空指针。
4.根据权利要求2所述的方法,其中,针对多分支Trie树中的每一个节点,通过遍历与 该节点相对应的数组,将非空指针和其相应的位置分别存储在第一数组和第二数组中。
5.根据权利要求2所述的方法,还包括如果需要查找已存储的IPv6地址前缀,则使 用二分法依次查找每一层节点的第二数组。
6.根据权利要求1-5中任意一项所述的方法,其中,步长K等于16。
7.一种用于存储IPv6地址前缀的设备,包括划分单元,将IPv6地址前缀划分为具有固定长度K的L个部分,其中K和L均为正整数;存储单元,使用步长为K、层数为L的多分支Trie树结构存储IPv6地址前缀,其中每一 个节点使用长度为2K的数组来存储节点指针,节点指针在数组中的位置表示IPv6地址前 缀的K个比特;以及压缩单元,利用额外数组对生成的多分支Trie树中的每一个节点进行压缩存储。
8.根据权利要求1所述的设备,其中,所述压缩单元针对多分支Trie树中的每一个节 点,利用两个数组来代替,第一数组存储该节点中的非空指针值,而第二数组存储每一个非 空指针值在该节点中的对应位置。
9.根据权利要求7所述的设备,其中,所述存储单元初始化多分支Trie树结构,使得与 根节点相对应的数组中均为空指针。
10.根据权利要求8所述的设备,其中,所述压缩单元针对多分支Trie树中的每一个节 点,通过遍历与该节点相对应的数组,将非空指针和其相应的位置分别存储在第一数组和 第二数组中。
11.根据权利要求8所述的设备,还包括查找单元,如果需要查找已存储的IPv6地址前 缀,则所述查找单元使用二分法依次查找每一层节点的第二数组。
12.根据权利要求7-11中任意一项所述的设备,其中,步长K等于16。
全文摘要
本发明提出了一种用于对IPv6地址前缀进行存储的方法,该方法包括将IPv6地址前缀划分为具有固定长度K的L个部分,其中K和L均为正整数;初始化步长为K、层数为L的多分支Trie树结构,以存储IPv6地址前缀,其中每一个节点使用长度为2K的数组来存储节点指针,节点指针在数组中的位置表示IPv6地址前缀的K个比特;以及利用额外数组对生成的多分支Trie树中的每一个节点进行压缩存储。此外,本发明还提出了一种相应的IPv6地址前缀存储设备。本发明在有效减少存储容量的同时提高了查找效率。
文档编号H04L29/12GK102045412SQ20101061154
公开日2011年5月4日 申请日期2010年12月28日 优先权日2010年12月28日
发明者吴建平, 张辉, 李星, 胡松, 黄友俊 申请人:赛尔网络有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1