一种基于树形数据结构的最长前缀匹配方法和装置的制作方法

文档序号:6462592阅读:243来源:国知局
专利名称:一种基于树形数据结构的最长前缀匹配方法和装置的制作方法
技术领域
本发明涉及通信和计算机技术领域,尤其涉及一种基于树形数据结构的最长前缀匹配方法和装置。
背景技术
路由器在转发IP (International Protocol,网际协议)报文时,需要根据IP报文的目的地址查询路由表。路由表包含多条路由前缀,每个路由前缀通常用一个由0/1构成的字符串表示,例如01*,字符串尾部的符号"*"表示后面的比特可以取任意值。路由表中的每个路由前缀对应一个下一跳信息,路由器在转发IP报文时,需要根据IP报文的目的地址查找路由表中匹配的前缀,匹配的方式采用最长前缀匹配的方式,找出最长匹配的前缀后,根据该前缀所对应的下一跳信息转发IPl艮文。所谓最长前缀匹配,举例说明假如路由器内有两个路由前缀(10*-〉interface 1 ), ( 1010*->interface 2 ),如果路由器收到一个才艮文,该I艮文的目的IP地址为101001,则这个地址和两个前缀都匹配,但是,第二个前缀匹配的比特数更多,所以选择第二个前缀作为最终的匹配结果,根据该前缀所对应的下一跳信息转发报文。
随着网络规模的扩大,IPv6和VPN (Virtual Private Network,虚拟专用网络)的广泛应用,路由表所包含的前缀数目越来越多,目前的路由器需要支持数百万条路由前缀。而且,随着路由器接口速率的不断提升,路由器完成最长前缀匹配的速度也需要不断提高,需要满足40Gbit/s, 100Gbit/s甚至更高的接口速率要求。
而在现有技术中,通常采用SRAM ( Static Random Access Memory,静态随机存储器)以实现高速的查找性能,但通常不能支持大容量的路由表;或者采用DRAM以支持大容量的路由表,但由于DRAM (Dynamic RandomAccess Memory,动态随才几存储器)的速度不高,无法支持高的查找性能。
为了能够同时支持大容量的数据表和高的查找性能,现有技术中提出了一种基于Trie (搜索)树的最长前缀匹配方法。Trie,是一种树形结构,用于保存大量的字符串,可以利用字符串的公共前缀来节约存储空间,具有更新速度快,查询性能只与地址的长度有关,与前缀的数目不相关的特点,所以采用Trie实现最长前缀匹配是一种比较通用的做法,例如,现有技术中采用了一种通过搜索压缩多比特Trie来查找最长匹配的前缀的方法,但是,在对现有技术的研究和实践过程中,发明人发现采用压缩多比特Trie的匹配方式,如果步长为r, 一次只能读取r比特,其查询速度无法满足不断提高的线路速率要求。

发明内容
本发明实施例提供一种基于树形数据结构的最长前缀匹配方法和装置,能够提高查询速度。
为解决上述技术问题,本发明所提供的基于树形数据结构的最长前缀匹配方法和装置实施例是通过以下技术方案实现的
本发明实施例提供了 一种基于树形数据结构的最长前缀匹配方法,所述树形数据结构代表多个前缀,前缀被区分为至少一个步,每个节点表示一步,所述方法包括
A. 读取所述树形数据结构中当前级别的一个搜索节点;
B. 确定读出的所述搜索节点的偏移量域是否指示上一级别的节点内存在匹配的前缀,如果存在匹配的前缀,则将上一级别的节点内指向叶子节点邀:组的指针和所述搜索节点的偏移量域相加,更新当前最佳匹配指针,并执行步骤C;如果不存在匹配的前缀,直接执行步骤C;
C. 当确定所述搜索节点的分支指示域和搜索关键字的对应比特匹配时,才艮据子节点位图确定所述搜索节点是否存在子节点;
D. 当确定所述搜索节点不存在子节点时,读取所述搜索节点的内部位图,并根据所述内部位图和所述搜索节点内指向叶子节点数组的指针,计算所述搜索节点内存在的匹配的长度最长的前缀,用计算结杲更新当前最佳匹配指针,并计算所述当前最佳匹配指针所对应的叶子节点的地址。
本发明实施例还提供了 一种搜索装置,所述装置用于基于一个树形数据
8结构搜索匹配的长度最长的前缀,所述树形数据结构代表多个前缀,前缀被区分为至少一个步,每个节点表示一步,所述搜索装置从至少一个存储器中
读取节点,包括
读取单元,用于读取树形数据结构中的节点;
最佳匹配指针确定单元,用于确定读取的节点的偏移量域是否指示上一级别的节点内存在匹配的前缀,并在存在匹配的前缀时,将上一级别的节点内指向叶子节点数组的指针和所述节点的偏移量域相加,更新当前最佳匹配
指针;
分支指示域确定单元,用于确定所述节点的分支指示域和搜索关键字的对应比特是否匹配,并在匹配时,触发子节点位图确定单元;
子节点位图确定单元,用于根据子节点位图确定所述节点是否存在子节点,在不存在时,触发内部节点匹配单元;
内部位图匹配单元,用于读耳又所述节点的内部位图,并才艮据所述内部位图和所述节点内指向叶子节点数组的指针,计算所述节点内存在的最长匹配的前缀,用计算结果更新当前最佳匹配指针,并计算所述当前最佳匹配指针所对应的叶子节点的地址。
本发明实施例还提供了一种路由器,该路由器包括
包处理器,用于发送查询请求,并接收搜索引擎发送的查询结果;
至少一个存储器,用于存储树形数据结构中的节点,所述树形数据结构代表多个前缀,前缀被区分为至少一步,每个节点表示一步;
搜索引擎,用于在接收到包处理器的查询请求时,从存储器中读取节点,确定读取到的节点的偏移量域是否指示上一级别的节点内存在匹配的前缀,并在存在匹配的前缀时,将上一级别的节点内指向叶子节点数组的指针和所述节点的偏移量域相加,更新当前最佳匹配指针;在确定所述节点的分支指示域和搜索关键字的对应是否匹配,并在匹配时,根据子节点位图确定所述节点是否存在子节点,并在不存在子节点时,读取所述节点的内部位图,并根据所述内部位图和所述节点内指向叶子节点数组的指针,计算所述节点内存在的最长匹配的前缀,用计算结果更新当前最佳匹配指针,并计算所述当前最佳匹配指针所对应的叶子节点的地址,并将计算结果返回给包处理器。
从以上技术方案可以看出,能够根据读出的搜索节点的偏移量域是否指示上一级别的节点内存在匹配的前缀,并在存在匹配的前缀时,将上一级别的节点内指向叶子节点数组的指针和当前搜索节点的偏移量域相加,更新当
前最佳匹配指针;在所述搜索节点的分支指示域和搜索关^t字的对应比特匹配,且根据子节点位图确定所述搜索节点不存在子节点时,可以根据所述搜索节点的内部位图、指向子节点数组的指针以及搜索关键字对应比特,计算出所述搜索节点内存在的匹配的长度最长的前缀,用计算结果更新当前最佳匹配指针,并计算所述当前最佳匹配指针所对应的叶子节点的地址。设所述搜索节点的步长为r,根据上一级别节点的分支指示域可以确定本搜索节点所在延伸出上一级别节点的路径与搜索关键字的1个比特是否匹配,而读取所述搜索节点的内部位图可以对应搜索关键字的后续r比特,因此,每读取一个节点,可以处理r+l比特的4叟索关4建字,与多比特Trie或压缩多比特Trie每读取一个步长为r的节点,只能处理r比特的搜索关键字的最长前缀匹配方法相比,可以提高查询速度。


图1A为一组前缀及对应的单比特Trie示意图IB为图1A中前缀数据表1A1中所示前缀的多比特Trie示意图1C为图IB中所示多比特Trie所对应的压缩多比特Trie示意图2A为本发明实施例中采用的树形数据结构示意图2B为本发明实施例中搜索节点的类型位图示意图2C为本发明实施例中前缀位图示意图3A-B为本发明实施例中最长前缀匹配方法实施例一流程图4为本发明实施例中节点数据结构示意图5为本发明实施例中一种搜索系统结构示意图6A-E为本发明实施例中最长前缀匹配方法实施例二流程10图7为本发明实施例中搜索装置实施例一结构示意图;图8为本发明实施例中搜索装置实施例二结构示意图;图9为本发明实施例中搜索装置实施例三结构示意图;图IO为本发明实施例中搜索装置实施例四结构示意图;图11为本发明实施例中搜索装置实施例五结构示意图;图12为本发明实施例中路由器实施例结构示意图。
具体实施例方式
本发明实施例提供了一种基于树形数据结构的最长前缀匹配方法和装置,用于提高查询速度。
以下首先参照附图,介绍几种采用Trie树形数据结构进行最长前缀匹配的方法
参照图1A,为一组前缀及对应的单比特Trie示意图,其中,前缀数据表1A1给出了 9个前缀,Trie 1A2为这9个前缀的单比特Trie表示。Trie的每个节点最多有左右两个子节点;实点表示该节点对应一个前缀。例如,P7是一个实点,从根节点到P7的路径上所遇到的所有比特,即00110就是P7所对
应的前缀。
假设收到一个报文,搜索时从根节点开始,依次使用目的地址的每个比特,如杲对应的比特为0,则继续搜索当前节点的左子节点,如果对应的比特为1,则继续搜索当前节点的右子节点,记录搜索过程中遇到的所有前缀,选出最后遇到的那个前缀作为匹配的结果。布支设目的地址为01110 ,则可以看出,在搜索过程中, 一共遇到了 3个前缀Pl、 P2、 P8,由于P8的长度最长,所以按照最长匹配的原则,选择P8作为最终的匹配结果。
采用单比特Trie方式,假设搜索关键字的长度为W,最差情况下需要读W次存储器,这样的查询性能无法满足实际需求,后来又有了多比特Trie,多比特Trie的特点是每读一次存储器,使用搜索关键字中的多个比特,参照图IB,为图1A中前缀lt据表lAl中所示前缀的多比特Trie示意图,其中,步长为2,即每次读取两个比特,长度不是步长整数倍的前缀需要扩展成多个前缀,但如果扩展后的前缀与其他长度更长的前缀冲突,根据最长前缀匹配原则,选取未扩展时对应的长度最长的前缀。例如,对于根节点,前缀P1需
要扩展成00*, 01*, 10*, 11*,前缀P2需要扩展成00*, 01*,这样对于00*有三个候选的前缀Pl、 P2、 P3,由于P3的前缀最长,所以在00对应的表项中填入P3;依据同样原则可以看出,P2填入根节点内01所对应的表项,Pl只能填入根节点内10所对应的表项。
在多比特Trie的数据结构中,假设步长为r,则每个Trie节点有2M"表项,每个表项包含2个域,分别表示下一跳信息和指向子节点的指针。以下为描述方便,将Trie节点简称为节点。可以看出,使用多比特Trie,假设一个节点所对应的步长为r,则搜索该节点时会使用搜索关键字中的r比特,假设这r比特在搜索关键字中的位置为从比特i到比特i+r-l (假设在搜索时,搜索关键字的最高位记为比特1 ),则通过搜索该节点可以找出从长度i到长度i+r-l的前缀中与搜索关键字匹配的长度最长的前缀;对于根节点而言,i为1,通过搜索根节点可以找出从长度0到长度r的前缀中与搜索关键字匹配的长度最长的前缀。
可以看出,假设搜索关键字的长度为W,步长越长则读存储器的次数越少,搜索的速度越高,但步长越长,存储器空间浪费越严重。针对这一问题,技术人员又提出了压缩多比特Trie,参照图1C,为图1B中所示多比特Trie所对应的压缩多比特Trie示意图,假设步长为r,则多比特Trie内的每个节点内最多有2f个下一跳信息,2r个指向子节点的指针。为了节省存储空间,如图1C所示,在压缩多比特Trie中,每个节点改成存放两个位宽为Y比特的位图(bitmap)加上两个指针。每个节点存放一个子节点位图(Child Bitmap ),和一个指向子节点的指针子节点指针(Child Pointer)。假设步长为r,子节点位图一共有2r比特,每个节点为1则表示对应的路径还需要继续向下搜索,为0则表示不需要继续搜索,每个节点的所有子节点在存储器内连续存放,每个节点内有一个子节点指针用于指示该节点的第一个子节点在存储器内存;改的地址。例如,图1C中的节点1的子节点位图为1101,表示在该节点中,假设搜索关键字搜索到节点1时所使用的索引为00/01/11,则还需要继续搜索下去,如果所使用的索引为IO,则不需要继续搜索下去。节点1 一共有三个
12子节点,在存储器内连续存;^文,分别对应索引OO、 01、 11。
在进行搜索时,首先根据搜索关键字从子节点位图中找出对应的比特,如果对应的比特为1,则需要继续搜索,然后计算子节点位图中从最高位开始到所找出的比特为止(不包括所找出的比特), 一共有多少个1,将计算结果作为偏移量域,将节点中存放的指向子节点的指针作为基地址,将二者相加作为下一次搜索时需要从存储器中读出的节点的地址。例如,在搜索图1C中的节点1时,假如此时搜索关键字中对应的索引为11,则根据节点1的子节点位图1101,可以算出下一个要搜索的节点相对于节点2的起始地址的偏移量为2,下一次访问的地址是节点1中的子节点指针加2。
每个节点存放一个前缀扩展位图(Prefix Expansion Bitmap ),和一个指向叶子节点的指针叶子节点指针。前缀扩展位图一共有2f个比特, 一个比特为1则表示对应的路径对应一个前缀; 一个比特为0,将该比特的位置记为s,则从比特s开始在前缀扩展位图中向左搜索,假设找到的第一个为1的比特所对应的前缀为Px,则比特s所对应的路径所匹配的前缀也是Px。前缀扩展位图内可能有多个比特为1,将所有为1的比特所对应前缀的下一跳信息在存储器内连续存放,存放下一跳信息的节点称为叶子节点,每个节点内存放一个指向叶子节点的指针用于指示该叶子节点内的第一个下一跳信息在存储器内存放的地址。例如,图1C中的节点2包含3个节点,其中,第一个节点的前缀扩展位图为1110,假设搜索到这个节点时,所使用的索引为11,由于11在前缀扩展位图内对应的比特为0,需要向左3叟索,找到的第一个为1的比特所对应的索引为IO,对应的前缀为P3,则使用索引ll在搜索本节点的过程中,所找到的匹配的前缀也是P3 。
在进行搜索时,首先才艮据搜索关键字从前缀扩展位图中找出对应的比特,如果对应的比特为1,则计算从前缀扩展位图的最高位开始, 一直到所找出的比特为止(不包括所找出的比特), 一共有多少个1,将计算的结果作为偏移量域,将节点内指向叶子节点的指针作为基地址,二者相加后的地址作为搜索本节点时在本节点内所找到的匹配的前缀所对应的下一跳信息在存储器内的存放地址;如果对应的比特为O,将该比特的位置记为s,则从比特s开始在前缀扩展位图中向左搜索,直到找到第一个为1的比特,将该比特的位置
13记为t,则计算从前缀扩展位图的最高位开始, 一直到比特t为止(不包括比 特t), 一共有多少个l,将计算的结果作为偏移量,将节点内指向叶子节点的 指针作为基地址,二者相加后的地址作为搜索本节点时在本节点内所找到的 匹配的前缀所对应的下一跳信息在存储器内的存放地址。例如,在搜索图1C
中的节点3时,假设此时搜索关键字中对应的索引为11,则根据节点3的前 缀扩展位图1010,可以计算出对应的下一跳信息的地址相对于对应的叶子节 点的起始地址的偏移量为1,则在本节点内找到的匹配的前缀所对应的下一跳 信息在存储器内的存放地址为本节点的叶子节点指针加1。
与采用多比特Trie的凄t据结构相同,^i殳一个节点所对应的步长为r,则 搜索该节点时会使用搜索关键字中的r比特,假设这r比特在搜索关键字中的 位置为从比特i到比特i+r-l(假设在搜索时,搜索关键字的最高位记为比特1 ), 则通过搜索该节点可以找出从长度i到长度i+r-1的前缀中与搜索关键字匹配 的长度最长的前缀;对于根节点而言,i为l,通过搜索根节点可以找出从长 度0到长度r的前缀中与搜索关键字匹配的长度最长的前缀。
可见,假设步长为r, 一个节点最多有2T个子节点,在多比特Trie中,需 要为每个子节点存储一个指针,无论该子节点是否存在,而在压缩多比特Trie 中,如果一个子节点不存在,则只需要将子节点位图内对应的比特设为0,不 需要额外的信息,同多比特Trie相比,对存储器容量的需求要减少很多。
同样道理,假设步长为r, 一个节点最多对应2f个下一跳信息,在多比特 Trie中,需要在每个节点内存放2f个下一跳信息;而在压缩多比特Trie中,如 果一个节点内两个或者多个连续的索引在节点内所匹配的长度最长的前缀相 同,则只需要将前缀扩展位图内第一个索引所对应的比特设为1,其余索引所 对应的比特设为O,对应的下一跳信息只需要在存储器内存放一次即可,同多 比特Trie相比,对存储器容量的要求也变少了 。
可见,采用压缩多比特Trie的匹配方式,如果步长为r, 一次仍然只能读 取r比特,与多比特Trie的匹配方式相比,无法才是高查询速度,其查询速度 无法满足不断提高的线路速率要求。
另外,压缩多比特Trie中,采用前缀扩展位图的方式还存在一个问题,举例说明在图1C中的节点3中,前缀扩展位图为1010,在叶子节点3内 存放了两个前缀所对应的下一跳信息P7和P3。与图1B相比,在图IB中 P3所对应的下一跳信息只存在于根节点中,而在图1C中,显然不是这样。 这是因为,在图1C的节点3中,索引OO、 Ol所对应的前缀相同,都是P7, 所以前缀扩展位图的高二位取为10,但是索引10、 ll在前缀扩展位图内的对 应比特不能也设为00,如果设为00,则根据前面所描述的匹配方法,索引10、 11所对应的前缀在搜索过程中就会被计算成P7,但这显然是错误的,所以必 须将索引10、 11在前缀扩展位图内对应的比特设为10,对应的在叶子节点3 中需要增加前缀P3所对应的下一跳信息。而同一个前缀所对应的下一跳信息 在根节点所对应的叶子节点中和子节点所对应的叶子节点中重复存储,会造 成存储空间的浪费,以及下 一跳信息更新速率的降低。
为便于理解,以下首先介绍本发明实施例中所采用的树形数据结构,参 照图2A,为本发明实施例中采用的树形数据结构示意图,其具有TNODE( Trie Node,搜索节点)TNODEl、 TNODE2、 TNODE3, INODE (Internal Node, 内部节点)INODEl、 INODE2,子节点数组1、子节点数组2,叶子节点数 组l、叶子节点数组2和对应的LNODE (Leaf Node,叶子节点),其中,每 个TNODE内有一个指向子节点数组的指针,用于指示子节点数组存放的基地 址,有一个指向叶子节点数组的指针,用于指示叶子节点数组的基地址,每 个TNODE中存放一个偏移量域(Offset ),用于在搜索过程中计算指向叶子节 点的指针,每个节点内的偏移量域指示两个信息当前节点的父节点内是否 存在一个匹配的前缀;如果当前节点的父节点内存在匹配的前缀,则指出该 前缀所对应的下一跳信息的地址相对于父节点内所存储的指向叶子节点数组 的指针的偏移量。
INODE内存》文内部位图,用于指示该INODE所对应的TNODE所包含的 前缀,INODE和该INODE所对应的TNODE的所有子节点即子节点数组连续 存放,每个TNODE内存放一个指针指向这一段连续空间的起始地址,即指向 子节点数组的指针。当然,如果一个TNODE所对应的子Trie中没有前缀, 则不需要为这个TNODE生成一个INODE。
其中,如果步长为r, TNODE内需要存放一个位宽为2f比特的子节点位图
15和一个位宽为Y比特的类型位图(Type Bitmap ),当子节点位图内的一个比特 为1时,类型位图内如果对应的比特为1,则表示对应的路径延伸出本节点后, 有两个分支,类型位图内如果对应的比特为0,则表示对应的路径延伸出本节 点后,有一个分支,或者是左分支,或者是右分支,不区分到底是哪个分支 存在;当子节点位图内的一个比特为0时,说明没有路径延伸出本节点,因 此没有分支,不需要判断类型位图中对应比特的值,类型位图中对应的比特 无意义,可以设为0,也可以设为1。参照图2B,为本发明实施例中节点的 类型位图示意图,该图所示的节点,可以看出子节点位图表示为1101,其 中索引10所对应的路径没有子节点,所以子节点位图内对应的比特设为0。 类型位图表示为10x0,由于索引OO对应的路径延伸出本节点后存在两个分支, 所以类型位图对应的比特^皮i殳为1;由于索引01和11对应的路径延伸出本节 点后存在一个分支,索引01所对应的路径延伸出本节点有右分支,索引11 所对应的路径延伸出本节点有左分支,所以类型位图内对应的比特被设为0; 由于索引IO对应的路径没有延伸出本节点,即子节点位图内对应的比特为0, 所以类型位图内对应的比特^C标识为x,表示可以,可以取为0,也可以取为 1。
可以看出,釆用子节点位图和类型位图相结合的表示方法后, 一共需要2 个位宽为Y比特的位图,同只采用子节点位图的方式相比,需要的比特数目 从2f比特变为2T"比特,但是可以获得每条延伸出本节点的路径在本节点外有 一个分支还是两个分支的信息。
如前所述,如果对应的路径延伸出本节点后只有一个分支,根据类型位 图内的对应比特并不能判断出该分支是左分支还是右分支,为解决这一问题, 在每个节点内增加1比特的分支指示域,该域为O标识当对应的路径延伸出 本节点的父节点时,本节点位于路径的左分支,该域为1标识当对应的路径 延伸出本节点的父节点时,本节点位于路径的右分支。
假设节点内存放了一个Y比特的子节点位图, 一个Y比特的类型位图。 在搜索过程中,将一个节点从存储器读出后,从搜索关键字中对应的位置取 出r比特,然后根据这r比特从子节点位图中选出对应的比特,判断该比特是否 为l,如果为l,则表明对应的路径延伸出本节点。将子节点位图与类型位图相与,得到的结果记为位图V,可以看出,如果子节点位图的一个比特为0,
则位图V对应比特为0,如果子节点位图的一个比特为1,则位图v的对应比
特和类型位图的对应比特相同。计算子节点位图中从最高位开始到所找出的
比特为止(不包括所找出的比特), 一共有多少个l,将计算的结果记为suml; 计算位图V中从最高位开始到与搜索关键字所对应的比特为止(不包括与搜索 关键字所对应的比特), 一共有多少个l,将计算的结果记为sum2。根据从搜 索关键字中取出的r比特从类型位图中选出对应的比特,判断该比特是否为1, 如果为1,则表明对应的路径延伸出本节点,且有两个分支,此时再从搜索关 键字中取出下一比特,根据该比特为0还是为1判断应该沿着左分支继续搜 索还是应该沿着右分支继续搜索,如果从搜索关键字中取出的比特为0,则应 该沿着左分支继续搜索,以节点中存放的指向子节点数组的指针作为基地址, 以suml+sum2为偏移量,将二者相加作为下一次搜索时需要从存储器中读出 的节点的地址;如果从搜索关键字中取出的比特为1,则沿着右分支继续搜索, 以节点中存放的指向子节点数组的指针作为基地址,以suml+sum2+l为偏移 量,将二者相加作为下一次搜索时需要从存储器中读出的节点的地址;如果 从类型位图中选取的比特为0,则表明对应的路径延伸出本节点,并且只有一 个分支,但是不知道是左分支还是右分支,此时无论从搜索关键字中取出的 下一比特是否与该分支匹配,都将下一个子节点读出继续搜索,以节点中存 放的指向子节点数组的指针作为基地址,以suml+sum2为偏移量,将二者相 加作为下一次搜索时需要从存储器中读出的节点的地址。
如前所述,在压缩多比特Trie中,同一个前缀所对应的下一跳信息在根 节点所对应的叶子节点中和子节点所对应的叶子节点中重复存储,会造成存 储空间的浪费,以及下一跳信息更新速率的降低,为解决这一问题,在INODE 中存放内部位图,内部位图用于指示该内部节点所对应的搜索节点内存在的 前缀,通过搜索内部位图可以找出所述搜索节点内与搜索关键字匹配的长度 最长的前缀,以下介绍内部位图的两种实施方式
第一种内部位图是在前缀扩展位图基础上,增加一个位宽为Z比特的前 缀指示位图(Prefix Indication Bitmap),前缀指示位图内的一个比特为1表示 在该节点内存在一个前缀与对应的路径匹配,如果一个比特为0表示在该节
17点内不存在与对应的路径相匹配的前缀。举例而言,图1C中的节点3的前缀
扩展位图变为1000,前缀指示位图为1100。
同样,每个节点内所包含的所有前缀所对应的下一跳信息在存储器内连 续存放,组成一个叶子节点数组。在搜索时,首先根据搜索关^t字找出前缀
指示位图的对应比特,如果为O则表示本节点内没有匹配的前缀;如果为1, 则继续判断前缀扩展位图内对应的比特是否为1,如果前缀扩展位图内对应的 比特为1 ,则计算从前缀扩展位图的最高位开始, 一直到所找出的比特为止(不 包括所找出的比特), 一共有多少个l,将计算的结果作为偏移量域,将上一 节点,即本内部节点对应的TNODE内指向叶子节点数组的指针作为基地址, 二者相加后的地址作为搜索本节点时在本节点内所找到的匹配的前缀所对应 的下一跳信息在存储器内的存放地址;如果前缀扩展位图内对应的比特为0, 将该比特的位置记为s,则从比特s开始在前缀扩展位图内向左搜索,直到找 到第一个为l的比特,将该比特的位置记为t,计算从前缀扩展位图的最高位 开始, 一直到比特t为止(不包括比特t), 一共有多少个l,将计算的结果作 为偏移量域,将上一节点,即本节点对应的TNODE内指向叶子节点数组的指 针作为基地址,二者相加后的地址作为搜索本节点时在本节点内所找到的匹 配的前缀所对应的下一跳信息在存储器内的存放地址。
可以看出,采用上述表示方式后,图1C中的叶子节点3中不需要存放前 缀P3所对应的下 一跳信息。
第二种内部位图所采用的方式参照图2C,为本发明实施例中前缀位图示 意图,用一个位宽为2^-l比特的前缀位图(Prefix Bitmap )来代替压缩多比 特Trie中的前缀扩展位图。对一个步长为r的节点而言,该节点实际上最多对 应了单比特Trie上的r+l级节点,这些节点在单比特Trie上组成一个子Trie 2C1。 首先将单比特Trie上对应的子Trie 2C1扩展成完全二叉树2C2, 二叉树上的每 个点对应一个比特,如果该点对应一个前缀,则对应的比特为1,否则对应的 比特为0。按照从上到下,从左到右的顺序遍历二叉树,形成一个位图2C3, 将这个位图称为前缀位图。图2C中,按照上面描述的方法,最终生成的前缀 位图为1001001 (2C3)。同样,每个节点内所包含的所有前缀所对应的下一跳信息在存储器内连
续存放,组成一个叶子节点数组。在搜索时,假设节点的步长为r,则读出节 点的前缀位图后,首先分别计算对应的r+l级是否有匹配的前缀,如果有,则 从中选出一个长度最长的前缀作为匹配的前缀。选出匹配的前缀后,计算从 前缀位图的最高位开始, 一直到该前缀所对应的比特为止(不包括该比特), 一共有多少个l,将计算的结果作为偏移量域,将上一节点,即本INODE所 对应的TNODE内指向叶子节点数组的指针作为基地址,二者相加后的地址作 为搜索本节点时在本节点内所找到的匹配的前缀所对应的下一跳信息在存储 器内的存放地址。
可见,采用前缀位图的方式不会带来在压缩多比特Trie中所出现的同 一个 前缀所对应的下 一跳信息在根节点所对应的叶子节点中和子节点所对应的叶 子节点中重复存储的问题,代价是前缀位图需要21+1-1比特。
总之,采用前缀扩展位图加上前缀指示位图的方式可以避免在压缩多比 特Trie中只采用前缀扩展位图所带来的问题,代价是需要的比特数目从Y比特 变为2^比特;采用前缀位图的方式也可以避免只采用前缀扩展位图所带来的 问题,代价是需要的比特数目从2f比特变为2f+1-l比特。后文统一将这两种位 图表示称为内部位图。
可以理解的是,所述内部位图也可以不作为独立节点存力文,而与对应的 TNODE的其他域的信息存放在一起。
在本发明实施例中,采用树形数据结构查找与搜索关键字匹配的长度最 长的前缀,为描述方便,将与搜索关键字匹配的长度最长的前缀称为最长匹 配前缀,树形数据结构代表多个前缀,前缀可以被区分为至少一个级别,即 被区分为至少一个步,每个节点表示一步,搜索并維护一个在搜索过程中遇 到的匹配的长度最长的前缀所对应的下一跳信息的地址,将这个地址记作当 前最佳匹配指针,读取一个搜索节点并确定所述搜索节点中与搜索关键字最 长匹配的前缀的过程如下
读取到树形数据结构中当前级别的一个搜索节点,确定所述搜索节点的 偏移量域是否指示上一级别的节点内存在匹配的前缀,并在上一级别的节点内存在匹配的前缀时,将上一级别的节点内指向叶子节点数组的指针和当前
搜索节点的偏移量域相加,更新当前最佳匹配指针;在确定所述搜索节点的
分支指示域和搜索关键字的对应比特匹配,且根据子节点位图确定所述4叟索 节点不存在子节点时,读取所述搜索节点的内部位图,并根据所述内部位图 和所述搜索节点内指向叶子节点数组的指针,计算所述搜索节点内存在的匹 配的长度最长的前缀,用计算结果更新当前最佳匹配指针,并计算所述当前 最佳匹配指针所对应的叶子节点的地址。
设所述搜索节点的步长为r,可以看出,根据上一级别节点的分支指示域 可以确定本节点所在延伸出上一级节点的路径与搜索关键字的1个比特是否 匹配,而读取所述搜索节点的内部位图可以确定与搜索关键字后续对应的r 比特是否匹配,因此,每读取一个节点,可以处理r+l比特的搜索关键字,与 多比特Trie或压缩多比特Trie每读取一个步长为r的节点,只能处理r比特 的搜索关键字的最长前缀匹配方法相比,可以提高查询速度。
参照图3A-B,为本发明实施例中最长前缀匹配方法实施例一流程图,以 下详细描述从存储器内读出 一个TNODE后的搜索过程,以及树形数据结构中 定义的各个域在搜索过程中如何使用,其中,内部位图作为独立的节点INODE 与该INODE对应的TNODE的子节点连续存;^。搜索并维护一个在搜索过程 中遇到的匹配的长度最长的前缀所对应的下一跳信息的地址,将这个地址记 作当前最佳匹配指针。
301、 判断读出的TNODE的偏移量域是否指示上一节点内存在匹配的前 缀,如果上一节点内不存在匹配的前缀,则执行步骤303;如果上一节点内存 在匹配的前缀,则执行步骤302;
302、 将上一节点内指向叶子节点数组的指针和本节点的偏移量域相加, 用得到的结果更新当前最佳匹配指针,然后执行步骤303;
其中,每个节点内的偏移量域指示两个信息当前节点的父节点内是否 存在一个匹配的前缀;如果当前节点的父节点内存在匹配的前缀,则指出该 前缀所对应的下一跳信息的地址相对于父节点内所存储的指向叶子节点it组 的指针的偏移量。
20303、判断TNODE的分支指示域和搜索关键字的对应比特是否匹配,如 果是,则执行步骤305;如果否,则执行步骤304;
在本实施例中,如果TNODE的分支指示域和搜索关键字的对应比特不匹 配,说明出现了查错路径的情况。
304 、将当前最佳匹配指针作为最终的查询结果返回;
305、 在本实施例中,假设TNODE内包含一个位宽为2*"比特的子节点位图, 一个位宽为^比特的类型位图;从搜索关键字中对应的位置取出r比特,然后 根据这r比特从子节点位图中选出一个比特并执行步骤306;
306、 判断该比特是否为O,如果是,则执行步骤307;否则执行步骤310;
307、 子节点位图内所选出的比特为0表明对应的路径没有延伸出本节点, 根据TNODE内指向子节点数组的指针将对应的INODE从存储器中读出,并 执行步骤308;
308、 由于在TNODE中存有指向叶子节点数组的指针,才艮据INODE内 存放的内部位图和TNODE内存放的指向叶子节点数组的指针,计算出INODE 内是否有匹配的前缀,如果是,则执行步骤309;如果否,则执行步骤304;
在本实施例中,内部位图可以采用前缀扩展位图和前缀指示位图相结合 的方式表示,可以理解的是,内部位图也可以采用前面介绍的前缀位图来表 示。
309、 找出一个长度最长的匹配的前缀,将该前缀所对应的当前最佳匹配 指针,即下一跳信息的地址作为最终的查询结果;
310、 如果子节点位图中对应的比特为1,则表明对应的路径延伸出本节 点,此时根据从搜索关键字中取出的r比特从类型位图中选出一个比特,并执 行步骤311;
311、 判断该比特是否为1,如果为l,则执行步骤312;否则经由连接块 3B执行图3B中的步骤317;
312、 类型位图的对应比特为1表明对应的路径延伸出本节点,而且有2 个分支,此时从搜索关键字中取出下一个比特,并执行步骤313;
21313、 根据该比特为0还是为1判断应该沿着左分支继续搜索还是应该沿
着右分支继续搜索,如果为0,则执行步骤314,否则执行步骤315;
314、 应该沿着左分支继续搜索,并执行步骤316;
315、 应该沿着右分支继续搜索,并执行步骤316;
316、 根据搜索关键字的对应比特,类型位图和子节点位图,以及TNODE 内指向子节点数组的指针计算出下一个需要读出的节点的地址,然后记录当
前节点内指向叶子节点数组的指针,将下一个节点读出后执行步骤301;
317、 类型位图的对应比特为O表明对应的路径延伸出本节点,而且有1 个分支,但是不知道是左分支还是右分支,记录搜索关键字的下一比特,将 该比特记为s,并执行步骤318;
318、 目前无法判断比特s和存在的分支是否匹配,根据搜索关键字的对 应比特、类型位图和子节点位图,以及TNODE内指向子节点的指针计算出下 一个需要读出的节点的地址,然后记录当前节点内指向叶子节点数组的指针, 将下一个节点读出后执行步骤319;
319、 读出下一个比特后,判断读出的节点的偏移量域是否指示上一节点 内存在匹配的前缀,如果上一节点内不存在匹配的前缀,则执行步骤321;如 果上一节点内存在匹配的前缀,则执行步骤320;
320、 将上一节点内指向叶子节点数组的指针和本节点的偏移量域相加, 用得到的结果更新当前最佳匹配指针,并执行步骤321;
321、 如果当前节点的分支指示域指示是左分支且比特s=0,或者当前节 点的分支指示域指示是右分支且比特s=l,则经由连接块3A返回困3A中的 步骤305继续对当前节点进行判断;如果当前节点的分支指示域指示是左分 支且比特s^,或者,当前节点的分支指示比特指示是右分支且比特s二O,则 执行步骤322;
322、 将当前最佳匹配指针作为最终的查询结果,查询过程到此结束。
在本实施例中,当子节点位图内的对应比特为1且类型位图的对应比特 为0时,虽然不知道搜索关键字与存在的分支是否匹配,但是仍然将该分支所对应的子节点读出,即使读错,子节点内所存储的偏移量域仍然是正确的, 仍然可以根据子节点内存储的偏移量域和父节点内存储的指向叶子节点^t组 的指针去更新当前最佳匹配指针。然后只需要根据分支指示域判断是否查4昔, 如果查错则搜索过程结束,否则继续进行搜索。
从以上步骤可以看出,在搜索过程中,如果读出的TNODE的子节点位图 对应的比特为1,则不需要读出对应的INODE。因为,如果子节点位图的对 应比特为1,则会继续读出下一个节点,而根据上一个节点内所存放的指向叶 子节点数组的指针和下一个节点内存放的偏移量域就可以计算出上一个节点 内存在的长度最长的匹配的前缀所对应的下一跳信息,不需要读出对应的 INODE;而如果搜索时读出的TNODE的子节点位图对应的比特为0,则需要 将INODE读出来计算当前节点内最长匹配的前缀。而由于INODE和当前节 点的所有子节点是连续存放的,在硬件实现时,假设当前节点放在存储器p, INODE和当前节点的所有子节点放在存储器q,无论哪一种情况都会读一次 存储器p, 一次存储器q,而不会出现某个存储器被读2次的情况,因此可以 进一步提高查询效率,所以采用这种将内部位图从节点中分离出来单独存放
在INODE中并将INODE和对应的TNODE的子节点连续存》文的方式,利于 硬件上采用流水线方式实现。
假设步长为r,在压缩多比特Trie中,每个节点存放了两个位宽为2、匕特 的位图(bitmap)(前缀扩展位图和子节点位图)以及两个指4十,每处理一个 节点会使用搜索关键字中的r比特,而在上述实施例中,每个TNODE中也存放 了两个位宽为2、匕特的位图(子节点位图和类型位图,内部位图作为独立的 INODE单独存放)加上两个指针,但是在处理一个TNODE时会使用搜索关键 字的r+l比特,在没有增大节点大小的情况下,每次处理的比特数目同压缩多 比特Trie相比,可以增加1比特,因此相应地可以提高查询速度。
参照图4,为本发明实施例中节点数据结构示意图,其中,节点数据结构 41为TNODE示意图,以下对TNODE中各个域进行详细介绍
设步长为r,则子节点位图位宽为^比特,子节点位图用于表示对应的路 径是否延伸出本节点,例如,可以定义如果子节点位图中对应的比特为1,表示对应的路径延伸出本节点,需要继续向下搜索;如果子节点位图中对应 的比特为o,表示对应的路径没有延伸出本节点,不需要继续向下搜索。
类型位图位宽也为Y比特,类型位图用于表示对应的路径延伸出本节点
后的分支数,例如,可以定义类型位图的对应比特为1,表示对应的路径延 伸出本节点后,有两个分支;类型位图的对应比特为0,表示对应的路径延伸 出本节点后,有一个分支,或者是左分支,或者是右分支。
偏移量域用于在搜索过程中计算指向叶子节点的指针,每个节点内的偏 移量域指示两个信息当前节点的父节点内是否存在一个匹配的前缀;如果 当前节点的父节点内存在匹配的前缀,则指出该前缀所对应的下一跳信息的 地址相对于父节点内所存储的指向叶子节点数组的指针的偏移量。
而分支指示域用于指示当前路径延伸出本节点的父节点时,本节点位于 路径的左分支还是右分支,例如,可以定义,所述分支指示域为0,表示本节 点位于路径的左分支;所述分支指示域为l,表示本节点位于路径的右分支。
指向叶子节点的指针用于表示指向本节点叶子节点数组的指针。
指向子节点的指针用于表示指向本节点子节点数组的指针。
而内部节点是否存在指示域用于指示内部节点是否存在,例如,可以定 义如果内部节点是否存在指示域为1,表示内部节点存在;如果内部节点是 否存在指示域为0,表示内部节点不存在。该域可以避免在内部节点不存在时 不必要的搜索过程。
节点数据结构42、 43为两种不同形式的INODE示意图,节点数据结构 42通过前缀扩展位图加前缀指示位图的方法指示每个节点内所包含的匹配的 前缀,节点数据结构43采用前缀位图的方法表示每个节点内所包含的前缀。 节点数据结构44为LNODE示意图,其中,关联数据域用于存放前缀所对应 的下一跳信息。
除了 TNODE和INODE,在搜索树形数据结构查找最长匹配前缀时,还 可以根据具体情况定义不同类型的节点,以进一步加快查询速度。例如,当 一个节点没有子节点时,不需要再存放该节点的子节点位图和类型位图,可 以将内部位图放在节点内,这样会少读一次存储器,从而提高查询性能,这
24种节点可称为ENODE (End Node,结束节点),根据内部位图的两种表示方 法,ENODE可以采用节点数据结构45、 46两种格式中的任意一种,节点数 据结构45为内部位图采用前缀扩展位图加前缀指示位图的格式,节点数据结 构46为内部位图采用前缀位图的格式。当Trie上出现连续的单分支路径时, 可以采用SNODE ( Skip Node,跳读节点) 一次比较多个比特,从而加快查询 速度,节点数据结构47为SNODE示意图,比较长度表示一次比较的比特数。
SNODE和ENODE中偏移量域、分支指示比特域以及叶子节点指示域中 的定义采用与TNODE中相同的方式,不再赘述。
参照图5,为本发明实施例中一种搜索系统实施例结构示意图,用于查找 最长匹配的前缀,该搜索系统中,搜索装置51从包处理器52接收查询请求, 将查询结果返回给包处理器52,从维护处理器53接收各种指令,根据指令的 内容对各个DRAM 54和SRAM 55执行读、写操作,并将最终指令的执行结 果返回给维护处理器53。
搜索装置可以外挂至少一个DRAM,至少一个SRAM, SRAM可以是片 外SRAM,也可以是片内SRAM,各种节点都存放在存储器内,根据搜索速 率的需要, 一个节点可以存放在单独的RAM内,也可以存放在多个RAM内。 而一个DRAM可以包含多个单元(Bank ), 一个节点可以存放在一个DRAM 的一个单元内,也可以存i丈在一个DRAM的多个单元内。
下述以在一个Trie树中查找最长匹配前缀为例,详细描述本发明实施例 中所采用的最长前缀匹配方法
参照图6A-E,为本发明实施例中最长前缀匹配方法实施例二流程图,在 图4中,描述了实施例一所采用的TNODE、 INODE和LNODE,以及考虑到 节点所在路径上位置的不同,对TNODE进行优化后所得到的SNODE、 ENODE的结构,以下介绍读取到图4中所定义的不同类型的节点时,针对每 种不同的节点所执行的最长前缀匹配过程,与实施例一的不同之处在于,在 搜索过程中,可以首先判断节点类型,由于节点的类型不同,执行流程有所 不同,例如,当读取到一个跳读节点时,如果确定读取到的所述跳读节点的 分支指示域和搜索关键字的对应比特匹配,且所述跳读节点的比较数据与搜
25索关键字的对应比特相等时,可以根据所述跳读节点内指向子节点数组的指 针计算下一个要读取的节点的地址,并读取下一个节点以继续l^行搜索过牙呈。 当读取到 一个结束节点时,需要确定读取到的所述结束节点的分支指示域和 搜索关键字的对应比特是否匹配,如果匹配,可以根据所述结束节点的内部 位图和结束节点内指向叶子节点数组的指针计算出所述结束节点内与搜索关 键字匹配的长度最长的前缀,用计算结果更新当前最佳匹配指针,并计算所 述当前最佳匹配指针所对应的叶子节点地址。以下通过具体步骤进行详细说

601、 接收一个查询请求;
602、 判断是否需要查询SRAM;如果是,则执行步骤603;否则执行步 骤604;
603、 向SRAM发送读请求,得到SRAM返回的结果后,执行步骤605;
604、 根据节点在DRAM内的分布情况,从多个DRAM中选出一个 DRAM,向该DRAM发送读请求,得到DRAM的返回结果后,执行步骤605;
605、 判断节点类型是否是SNODE,如果是,则经由连接块6B继续执行 图6B中的步骤610,否则执行步骤606;
606、 判断节点类型是否是INODE,如果是,则经由连接块6C继续执行 图6C中的步骤617,否则执行步骤607;
607、 判断节点类型是否是LNODE,如果是,则执行步骤608,否则继续 执行步骤609;
.608、将LNODE的内容作为查询结果返回,搜索过程结束;
609、 判断当前节点类型是否是ENODE,如果是,则经由连接块6D继续 执行图6D中的步骤621 ,否则经由连接块6E继续执行图6E中的步骤627;
610、 判断读出的节点的偏移量域是否指示上一节点内存在匹配的前缀, 如果上一节点内不存在匹配的前缀,则执行步骤612;如果上一节点内存在匹 配的前缀,则执行步骤611;
611、 将上一节点内指向叶子节点数组的指针和本节点的偏移量域相加,用得到的结果更新当前最佳匹配指针,然后执行步骤612;
612、 判断当前节点的分支指示域和搜索关键字的对应比特是否匹配,即 是否出现查错路径的情况,如果查错路径,则执行步骤613,否则执行步骤 615;
613、 判断当前最佳匹配指针是否有效,如果无效,则查询失败,搜索过 程至此结束;如果有效,则执行步骤614;
614、 根据当前最佳匹配指针计算对应的LNODE的地址,才艮据计算出来 的地址以及节点在DRAM内的分布,计算出需要访问哪个DRAM或者 SRAM,向对应的RAM发出读请求,得到读回的结果后,经由连接块6A返 回图6A中并继续执行步骤605;
615、 判断搜索关键字内相应的比特是否和SNODE内的比较数据相等, 如果相等,则执行步骤616,否则执行步骤613;
其中SNODE内进行比较的比特数目可以由SNODE内的比较长度域指定。
616、 根据本节点内的指向子节点数组的指针计算下一个要读取的节点的 地址,根据计算出的地址以及节点在DRAM内的分布,计算出需要访问哪个 DRAM或者SRAM,向对应的RAM发送读请求,得到读回的结果后,经由 连接块6A返回图6A中并继续扭j行步骤605;
617、 根据搜索关键字和内部位图判断当前节点内是否存在匹配的前缀, 如果不存在,则执行步骤618,否则执行步骤620;
618、 判断当前最佳匹配指针是否有效,如果无效,则查询失败,搜索过 程至此结束;如果有效,则执行步骤619;
619、 根据当前最佳匹配指针计算对应的LNODE的地址,根据计算出来 的地址以及节点在DRAM内的分布,计算出需要访问哪个DRAM或者 SRAM ,向对应的RAM发出读请求,得到读回的结果后,经由连接块6A返 回图6A中并继续执行步骤605;
620、 根据内部位图和上一节点的指向叶子节点数组的指针计算当前节点
27内与搜索关键字匹配的长度最长的前缀,用计算的结果更新当前最佳匹配指
针,根据当前最佳匹配指针计算对应的LNODE的地址,根据计算出来的地址 以及节点在DRAM内的分布,计算需要访问哪个DRAM或者SRAM。向对 应的RAM发送读请求,得到读回的结果后,经由连接块6A返回图6A中继 续执行步骤605;
621 、判断读出的节点的偏移量域是否指示上一节点内存在匹配的前缀, 如果上一节点内不存在匹配的前缀,则执行步骤623;如果上一节点内存在匹 配的前缀,则执行步骤622;
622、 将上一节点内指向叶子节点数组的指针和本节点的偏移量域相加, 用得到的结果更新当前最佳匹配指针,并执行步骤623;
623、 判断当前节点的分支指示域和搜索关键字的对应比特是否匹配,如 果是,则执行步骤626;如果否,则执行步骤624;
624、 判断当前最佳匹配指针是否有效,如果无效,则查询失败,搜索过 程至此结束;如果有效,则执行步骤625;
625 、根据当前最佳匹配指针计算对应的LNODE的地址,根据计算出来 的地址以及节点在DRAM内的分布,计算出需要访问哪个DRAM或者 SRAM,向对应的RAM发出读请求,得到读回的结果后,经由连接块6A返 回图6A中继续4丸行步骤605;
626、 根据内部位图和当前节点的指向叶子节点数组的指针计算出当前节 点内与搜索关键字匹配的长度最长的前缀,用计算的结果更新当前最佳匹配 指针,根据当前最佳匹配指针计算对应的LNODE的地址,根据计算出来的地 址以及节点在DRAM内的分布,计算出需要访问哪个DRAM或者SRAM, 向对应的RAM发送读请求,得到读回的结果后,经由连接块6A返回图6A 中继续执行步骤605;
627、 判断读出的节点的偏移量域是否指示上一节点内存在匹配的前缀, 如果上一节点内不存在匹配的前缀,则执行步骤629;如果上一节点内存在匹 配的前缀,则执行步骤628;
628 、将上一节点内指向叶子节点数组的指针和本节点的偏移量域相加,用得到的结果更新当前最佳匹配指针,并执行步骤629;
629、 判断当前节点的分支指示域和搜索关键字的对应比特是否匹配,即 是否出现查错路径的情况,如果查错路径,则执行步骤630;如果没有查错路 径,则执行步骤632;
630、 判断当前最佳匹配指针是否有效,如果无效,则查询失败,搜索过 程至此结束;如果有效,则执行步骤631;
631、 根据当前最佳匹配指针计算对应的LNODE的地址,才艮据计算出来 的地址以及节点在DRAM内的分布,计算出需要访问哪个DRAM或者 SRAM,向对应的RAM发出读请求,得到读回的结果后,经由连接块6A返 回图6A中继续执行步骤605;
632、 根据搜索关键字判断当前节点的子节点位图内对应的比特是否为0, 如果是O,则执行步骤633;如果为1,则执行步骤635;
633 、判断当前节点内的内部节点是否存在指示域(INODE Exist Flag ) 是否为1,如果为1,则执行步骤634;如果为0,则执行步骤630;
634、 根据本节点内指向子节点数组的指针计算下一个要读取的节点的地 址,根据计算出来的地址以及节点在DRAM内的分布,计算出需要访问哪个 DRAM或者SRAM,向对应的RAM发送读请求,得到读回的结果后,经由 连4妄块6A返回图6A中继续执行步骤605;
635、 根据搜索关键字判断当前节点的类型位图内对应的比特是否为0, 如果为O,则执行步骤636,否则,执行步骤637;
636、 确定对应的路径延伸出本节点后有1个分支,并.执行步骤638;
637、 确定对应的路径延伸出本节点后有2个分支,并执行步骤638;
638、 根据当前节点的子节点位图、类型位图、指向子节点数组的指针以 及搜索关键字的对应比特,计算出下一个需要读取的节点的地址,根据计算 出来的地点以及节点在DRAM中的分布,计算出需要访问哪个DRAM或者 SRAM,向对应的RAM发送读请求,得到读回的结果后,经由连接块6A返 回图6A中继续执行步骤605;
29以上对搜索Trie树进行最长前缀匹配的过程进行了详细的描述,可以理 解的是,实施例中所述的执行顺序并不是唯一的,例如,可以先判断所读取 的节点的分支指示比特是否与搜索关键字的对应比特匹配,并在匹配时,再 判断节点类型。并且,判断节点类型的顺序没有一定的限制,例如,可以先 判断是否为TNODE,也可以最先判断是否为LNODE等等。
以下对本发明实施例中所采用的搜索装置进行对应描述
参照图7,为本发明实施例中搜索装置实施例一结构示意图,该装置用于 基于一个树形数据结构搜索匹配的长度最长的前缀,所述树形数据结构代表 多个前缀,前缀被区分为至少一个步,每个节点表示一步,所述搜索装置从 至少一个存储器中读取节点,该装置包括
读取单元71,用于读取树形数据结构中的节点;
最佳匹配指针确定单元72,用于确定读取的节点的偏移量域是否指示上 一级别的节点内存在匹配的前缀,并在存在匹配的前缀时,将上一级别的节 点内指向叶子节点数组的指针和所述节点的偏移量域相加,更新当前最佳匹 配指针;
分支指示域确定单元73,用于确定所述节点的分支指示域和搜索关键字 的对应比特是否匹配,并在匹配时,触发子节点位图确定单元74;
子节点位图确定单元74,用于根据子节点位图确定所述节点是否存在子 节点,在不存在子节点时,触发内部节点匹配单元75;
内部位图匹配单元75,用于读取所述节点的内部位图,并根据所述内部 位图和所述节点内指向叶子节点数组的指针,计算所述节点内存在的最长匹 配的前缀,用计算结果更新当前最佳匹配指针,并计算所述当前最佳匹配指 针所对应的叶子节点的地址。
本实施例中通过最佳匹配指针确定单元72确定当前最佳匹配指针,通过 分支指示域确定单元确定节点的分支指示域和搜索关键字的对应比特是否匹 配,并在匹配时触发子节点位图确定单元、并由子节点位图确定单元74确定 所述节点是否存在子节点,在所述节点不存在子节点时,触发内部位图匹配 单元75根据所述内部位图和所述搜索节点内指向叶子节点数组的指针,计算所述搜索节点内存在的最长匹配的前缀,用计算结果更新当前最佳匹配指针, 并计算所述当前最佳匹配指针所对应的叶子节点的地址。设读取的节点的步
长为r,采用本实施例中的搜索装置搜索, 一次可以确定搜索关键字的r+l比 特是否匹配,因此,可以提高查询速度。
可以对上述实施例作进一步的优化,以下通过几个具体实施例进行详细 说明
参照图8,为本发明实施例中搜索装置实施例二结构示意图,所述搜索装 置中,所述子节点位图确定单元还用于在存在子节点时,触发下一节点地址 计算单元81;
下一节点地址计算单元81,用于在子节点位图确定单元74确定所述节点 存在子节点时,根据所述节点的类型位图判断所述节点的分支数,并根据所 述节点的子节点位图、类型位图、指向子节点数组的指针以及搜索关键字的 对应比特,计算出下一个需要读取的节点的地址,并触发读耳又单元71,以读 取要搜索的节点。
该搜索装置可以对一个存在子节点的节点进行搜索,以查找最长匹配的前缀。
在上述实施例中,为提高查询速度,可以设置多个存储器,每个存储器 用于存储一级节点。
并且,所述节点的内部位图作为独立的内部节点与所述节点的子节点数 组连续存放,这样,如果存在匹配的下一级节点,则不需要读取所述内部节 点,如果不存在匹配的下一级节点,则读取内部位图,这样可以保证一次只 读取一个存储器,可以进一步提高查询速度。
还可以对实施例二作进一步优化,以下通过具体的实施例进4亍i兌明
参照图9,为本发明实施例中搜索装置实施例三结构示意图,该搜索装置 在实施例一基础上,还可包括跳读节点匹配单元91,用于当分支指示域确 定单元73确定读取到的跳读节点的分支指示域和搜索关键字的对应比特匹配 时,确定所读取的跳读节点的比较数据与搜索关键字的对应比特是否相等, 并在相等时,根据所述跳读节点内指向子节点数组的指针计算下一个要读取
31的节点的地址,并触发读取单元71读取下一个节点以继续:溲索。
可见,该搜索装置中,当树形数据结构上出现连续的单分支路径时,通 过跳读节点匹配单元判断所述连续的单分支路径与搜索关键字对应比特是否 匹配, 一次可以读取多个节点,因此可以进一步加快查询速度。
在实施例二和实施例三所描述的搜索装置中,还可包括结束节点匹配 单元,为描述方便,以在实施例一的基础上进行扩展说明,参照图10,为本 发明实施例中搜索装置实施例四结构示意图,该装置在实施例一基础上,还
包括结束节点匹配单元101,用于当分支指示域确定单元73确定读取到的 结束节点的分支指示域和搜索关键字的对应比特匹配时,根据所述结束节点 的内部位图和结束节点内指向叶子节点数组的指针计算出所述结束节点内与 搜索关键字匹配的长度最长的前缀,用计算结果更新当前最佳匹配指针,并 计算所述当前最佳匹配指针所对应的叶子节点地址。
所述搜索装置通过结束节点匹配单元查找结束节点内是否有匹配的长度 最长的前缀,结束节点没有子节点,因此节点内不需要存放节点的子节点位 图和类型位图,而将内部位图放在节点内,因此可以少读一次存储器,从而 提高查询性能。
在上述实施例中所描述的搜索装置中,还可以作进一步优化,参照图11, 为本发明实施例中搜索装置实施例五结构示意图,为在搜索装置实施例一基 础上进行扩展,所扩展的有效指针对应叶子节点地址计算单元111,用于当所 述分支指示域确定单元73确定当前读取到的节点的分支指示域和搜索关键字 的对应比特不匹配时,判断当前最佳匹配指针是否有效,并在有效时,根据 当前最佳匹配指针计算对应的叶子节点的地址。
可见,该实施例中通过有效指针对应叶子节点地址计算单元在当前最佳 匹配指针有效时,根据当前最佳匹配指针计算对应的叶子节点的地址,即使 读取到的节点的分支指示域和搜索关键字的对应比特不匹配时,即搜索到错 误的路径上,也可以保证所读取的叶子节点的地址正确。
本发明实施例中所述的搜索装置可以应用于多个领域中,例如,可以应 用于计算机或者通信技术领域,以下以在通信领域中所应用的一种装置进行
32i羊细i兌明
参照图12,为本发明实施例中路由器实施例结构示意图,该路由器包括
包处理器121,用于发送查询请求,并接收搜索引擎发送的查询结果;
至少一个存储器122,用于存储树形数据结构中的节点,所述树形数据结 构代表多个前缀,前缀被区分为至少一步,每个节点表示一步;
搜索引擎123,用于在接收到包处理器121的查询请求时,从存储器122 中读取节点,确定读取到的节点的偏移量域是否指示上一级别的节点内存在 匹配的前缀,并在存在匹配的前缀时,将上一级别的节点内指向叶子节点数 组的指针和所述节点的偏移量域相加,更新当前最佳匹配指针;在确定所述 节点的分支指示域和搜索关键字的对应是否匹配,并在匹配时,根据子节点 位图确定所述节点是否存在子节点,并在不存在子节点时,读取所述节点的 内部位图,并根据所述内部位图和所述节点内指向叶子节点数组的指针,计 算所述节点内存在的最长匹配的前缀,用计算结果更新当前最佳匹配指针, 并计算所述当前最佳匹配指针所对应的叶子节点的地址,并将计算结果返回 给包处理器121。
本实施例所介绍的路由器中,由搜索引擎123确定当前最佳匹配指针, 确定节点的分支指示域和搜索关键字的对应比特是否匹配,并在匹配时确定 所述节点是否存在子节点,在所述节点不存在子节点时,根据所述内部位图 和所述搜索节点内指向叶子节点数组的指针,计算所述搜索节点内存在的最 长匹配的前缀,用计算结果更新当前最佳匹配指针,并计算所述当前最佳匹 配指针所对应的叶子节点的地址。设读取的节点的步长为r,采用本实施例中 的路由器搜索, 一次可以确定搜索关键字的r+l比特是否匹配,因此,可以提 高查询速度。
可以对上述路由器实施例作进一步的优化,例如
所述搜索引擎123还可用于在确定所述节点存在子节点时,才艮据所述节 点的类型位图判断所述节点的分支数,并根据所述节点的子节点位图、类型 位图、指向子节点数组的指针以及搜索关键字的对应比特,计算出下一个需 要读取的节点的地址,并继续从存储器中读取下一个要搜索的节点。这样可以对一个存在子节点的节点进行搜索,以查找最长匹配的前缀。
所述搜索引擎123还可用于在确定读取到的跳读节点的分支指示域和搜 索关键字的对应比特匹配时,确定所读取的跳读节点的比较数据与搜索关键 字的对应比特是否相等,并在相等时,根据所述跳读节点内指向子节点数组 的指针计算下一个要读取的节点的地址,并读取下一个节点以继续搜索。
这样一来,当树形数据结构上出现连续的单分支路径时,通过搜索引擎 判断所述连续的单分支路径与搜索关键字对应比特是否匹配, 一次可以读取 多个节点,因此可以进一步加快查询速度。
所述搜索引擎123还可用于在确定读取到的结束节点的分支指示域和搜
索关键字的对应比特匹配时,根据所述结束节点的内部位图和结束节点内指 向叶子节点数组的指针计算出所述结束节点内与搜索关键字匹配的长度最长 的前缀,用计算结果更新当前最佳匹配指针,并计算所述当前最佳匹配指针 所对应的叶子节点地址。
由搜索引擎查找结束节点内是否有匹配的长度最长的前缀,结束节点没 有子节点,因此节点内不需要存放节点的子节点位图和类型位图,而将内部 位图放在节点内,因此可以少读一次存储器,从而提高查询性能。
所述搜索引擎123还可用于在确定读取到的节点的分支指示域和搜索关 键字的对应比特不匹配时,判断当前最佳匹配指针是否有效,并在有效时, 才艮据当前最佳匹配指针计算对应的叶子节点的地址。
这样,根据当前最佳匹配指针计算对应的叶子节点的地址,即使读取到 的节点的分支指示域和搜索关键字的对应比特不匹配时,即搜索到错误的路 径上,也可以保证所读取的叶子节点的地址正确。
可以理解的是,在以上实施例中所介绍的路由器中,还可包括维护处 理器,用于向所述搜索引擎发送指令;
所述搜索引擎还用于根据维护处理器发送的指令对存储器执行读或写操 作,并将指令执行结果返回给维护处理器。
在以上所介绍的路由器实施例中,存储器可以为SRAM,也可以为DRAM,用户可以根据需要灵活选择,并且,为了进一步提高查询速度,存
储器可以为多个,每个存储器可以分别用于存储一级节点。
而且,所述节点的内部位图作为独立的内部节点与所述节点的子节点数 组连续存放。这样,如果存在匹配的下一级节点,则不需要读:取所述内部节 点,如果不存在匹配的下一级节点,则读取内部位图,这样可以保证一次只 读取一个存储器,可以进一步提高查询速度。
.贝可。
是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机
可读存储介质中,该程序在执行时,包括如下步骤
A. 读取所述树形数据结构中当前级别的一个搜索节点;
B. 确定读出的所述搜索节点的偏移量域是否指示上一级别的节点内存在 匹配的前缀,如果存在,则将上一级别的节点内指向叶子节点数组的指针和 当前搜索节点的偏移量域相加,更新当前最佳匹配指针,并执行步骤C,否 则直接执行步骤C;
C. 当确定所述搜索节点的分支指示域和搜索关键字的对应比特匹配时, 根据子节点位图确定所述搜索节点是否存在子节点;
D. 当确定所述搜索节点不存在子节点时,读取所述搜索节点的内部位图, 并根据所述内部位图和所述搜索节点内指向叶子节点数组的指针,计算所述 搜索节点内存在的匹配的长度最长的前缀,用计算结果更新当前最佳匹配指 针,并计算所述当前最佳匹配指针所对应的叶子节点的地址。
上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上对本发明所提供的 一种基于树形数据结构的最长前缀匹配的方法和 装置进行了详细介绍,对于本领域的一般技术人员,依据本发明实施例的思 想,在具体实施方式
及应用范围上均会有改变之处,综上所述,本说明书内 容不应理解为对本发明的限制。
权利要求
1.一种基于树形数据结构的最长前缀匹配方法,其特征在于,所述树形数据结构代表多个前缀,前缀被区分为至少一个步,每个节点表示一步,所述方法包括A.读取所述树形数据结构中当前级别的一个搜索节点;B.确定读出的所述搜索节点的偏移量域是否指示上一级别的节点内存在匹配的前缀,如果存在匹配的前缀,则将上一级别的节点内指向叶子节点数组的指针和所述搜索节点的偏移量域相加,更新当前最佳匹配指针,并执行步骤C;如果不存在匹配的前缀,直接执行步骤C;C.当确定所述搜索节点的分支指示域和搜索关键字的对应比特匹配时,根据子节点位图确定所述搜索节点是否存在子节点;D.当确定所述搜索节点不存在子节点时,读取所述搜索节点的内部位图,并根据所述内部位图和所述搜索节点内指向叶子节点数组的指针,计算所述搜索节点内存在的匹配的长度最长的前缀,用计算结果更新当前最佳匹配指针,并计算所述当前最佳匹配指针所对应的叶子节点的地址。
2. 如权利要求1所述的基于树形数据结构的最长前缀匹配方法,其特征在于,进一步包括当确定所述搜索节点存在子节点时,根据所述搜索节点的类型位图判断当前节点的分支数,并根据所述搜索节点的子节点位图、类型位图、指向子节点数组的指针以及搜索关键字的对应比特,计算出下一个需要读取的节点的地址,并重复执行步骤A、 B、 C以继续执行搜索过程。
3. 如权利要求2所述的基于树形数据结构的最长前缀匹配方法,其特征在于,进一步包括确定读取到 一个跳读节点,所述跳读节点用于表示连续的单分支路径;当确定读取到的所述跳读节点的分支指示域和搜索关^lt字的对应比特匹配,且所述跳读节点的比较数据与搜索关键字的对应比特相等时,根据所述跳读节点内指向子节点数组的指针计算下一个要读取的节点的地址,并读取下 一个节点以继续执行搜索过程。
4. 如权利要求2所述的基于树形数据结构的最长前缀匹配方法,其特征在于,进一步包括读取到一个结束节点;当确定读取到的所述结束节点的分支指示域和搜索关键字的对应比特匹配时,根据所述结束节点的内部位图和结束节点内指向叶子节点数组的指针计算出所述结束节点内与搜索关键字匹配的长度最长的前缀,用计算结果更新当前最佳匹配指针,并计算所述当前最佳匹配指针所对应的叶子节点地址。
5. 如权利要求1或2所述的基于树形数据结构的最长前缀匹配方法,其特征在于,所述搜索节点的内部位图作为独立的节点与所述当前节点的子节点数组连续存储。
6. 如权利要求1至4任一项所述的基于树形数据结构的最长前缀匹配方法,其特征在于,进一步包括当确定当前读取到的节点的分支指示域和搜索关键字的对应比特不匹配时,判断当前最佳匹配指针是否有效,如果有,则根据当前最佳匹配指针计算对应的叶子节点的地址。
7. —种搜索装置,其特征在于,所述装置用于基于一个树形数据结构搜索匹配的长度最长的前缀,所述树形数据结构代表多个前缀,前缀被区分为至少一个步,每个节点表示一步,所述搜索装置从至少一个存储器中读取节点,包括读取单元,用于读取树形数据结构中的节点;最佳匹配指针确定单元,用于确定读取的节点的偏移量域是否指示上一级别的节点内存在匹配的前缀,并在存在匹配的前缀时,将上一级别的节点内指向叶子节点数组的指针和所述节点的偏移量域相加,更新当前最佳匹配指针;分支指示域确定单元,用于确定所述节点的分支指示域和搜索关^:字的对应比特是否匹配,并在匹配时,触发子节点位图确定单元;子节点位图确定单元,用于根据子节点位图确定所述节点是否存在子节点,在不存在时,触发内部节点匹配单元;内部位图匹配单元,用于读取所述节点的内部位图,并才艮据所述内部位图和所述节点内指向叶子节点数组的指针,计算所述节点内存在的最长匹配的前缀,用计算结果更新当前最佳匹配指针,并计算所述当前最佳匹配指针所对应的叶子节点的地址。
8. 如权利要求7所述的搜索装置,其特征在于,还包括下一节点地址计算单元,用于当子节点位图确定单元确定所述节点存在子节点时,;f艮据所述节点的类型位图判断所述节点的分支数,并根据所述节点的子节点位图、类型位图、指向子节点数组的指针以及搜索关键字的对应比特,计算出下一个需要读取的节点的地址,并触发读取单元,以读取要搜索的节点。
9. 如权利要求8所述的搜索装置,其特征在于,所述存储器为多个,每个存储器用于存储一级节点。
10. 如权利要求9所述的搜索装置,其特征在于,所述节点的内部位图作为独立的内部节点与所述节点的子节点数组连续存放。
11. 如权利要求8所述的搜索装置,其特征在于,还包括跳读节点匹配单元,用于当分支指示域确定单元确定读取到的跳读节点的分支指示域和搜索关键字的对应比特匹配时,确定所读取的跳读节点的比较数据与搜索关键字的对应比特是否相等,并在相等时,根据所述跳读节点内指向子节点数组的指针计算下一个要读取的节点的地址,并触发读取单元读取下一个节点以继续搜索。
12. 如权利要求8所述的搜索装置,其特征在于,还包括结束节点匹配单元,用于当分支指示域确定单元确定读取到的结束节点的分支指示域和搜索关键字的对应比特匹配时,根据所述结束节点的内部位图和结束节点内指向叶子节点数组的指针计算出所述结束节点内与搜索关键字匹配的长度最长的前缀,用计算结果更新当前最佳匹配指针,并计算所述当前最佳匹配指针所对应的叶子节点地址。
13. 如权利要求7至12任一项所述的搜索装置,其特征在于,还包括有效指针对应叶子节点地址计算单元,用于当所述分支指示域确定单元确定当前读取到的节点的分支指示域和搜索关键字的对应比特不匹配时,判断当前最佳匹配指针是否有效,并在有效时,根据当前最佳匹配指针计算对应的叶子节点的地址。
14. 一种路由器,其特征在于,包括包处理器,用于发送查询请求,并接收搜索引擎发送的查询结果;至少一个存储器,用于存储树形数据结构中的节点,所述树形数据结构代表多个前缀,前缀被区分为至少一步,每个节点表示一步;搜索引擎,用于在接收到包处理器的查询请求时,从存储器中读取节点,确定读取到的节点的偏移量域是否指示上一级別的节点内存在匹配的前缀,并在存在匹配的前缀时,将上一级别的节点内指向叶子节点数组的指针和所述节点的偏移量域相加,更新当前最佳匹配指针;在确定所述节点的分支指示域和搜索关键字的对应是否匹配,并在匹配时,4艮据子节点位图确定所述节点是否存在子节点,并在不存在子节点时,读取所述节点的内部位图,并根据所述内部位图和所述节点内指向叶子节点数组的指针,计算所述节点内存在的最长匹配的前缀,用计算结果更新当前最佳匹配指针,并计算所述当前最佳匹配指针所对应的叶子节点的地址,并将计算结果返回给包处理器。
15. 如权利要求14所述的路由器,其特征在于,所述搜索引擎还用于在确定所述节点存在子节点时,根据所述节点的类型位图判断所述节点的分支数,并根据所述节点的子节点位图、类型位图、指向子节点^t组的指针以及搜索关键字的对应比特,计算出下一个需要读取的节点的地址,并继续从存储器中读取下 一个要搜索的节点。
16. 如权利要求15所述的路由器,其特征在于,所述搜索引擎还用于在确定读取到的跳读节点的分支指示域和搜索关键字的对应比特匹配时,确定所读取的跳读节点的比较数据与搜索关键字的对应比特是否相等,并在相等时,根据所述跳读节点内指向子节点数组的指针计算下一个要读取的节点的地址,并读取下一个节点以继续搜索。
17. 如权利要求15所述的路由器,其特征在于,所述搜索引擎还用于在确定读取到的结束节点的分支指示域和搜索关键字的对应比特匹配时,根据所述结束节点的内部位图和结束节点内指向叶子节点数组的指针计算出所述结束节点内与搜索关键字匹配的长度最长的前缀,用计算结果更新当前最佳匹配指针,并计算所述当前最佳匹配指针所对应的叶子节点i也址。
18.如权利要求14至17任一项所述的路由器,其特征在于,所述搜索引擎还用于在确定当前读取到的节点的分支指示域和搜索关4建字的对应比特不匹配时,判断当前最佳匹配指针是否有效,并在有效时,才艮据当前最佳匹配指针计算对应的叶子节点的地址。
全文摘要
本发明公开了最长前缀匹配方法和装置,该方法包括A.读取一个搜索节点;B.确定读出的搜索节点的偏移量域是否指示上一级别的节点内存在匹配的前缀,如果存在,将上一级别的节点内指向叶子节点数组的指针加上该搜索节点的偏移量域,更新当前最佳匹配指针,并执行步骤C;如果不存在,执行步骤C;C.确定该搜索节点的分支指示域和搜索关键字的对应比特匹配时,确定该搜索节点是否存在子节点;D.确定该搜索节点不存在子节点时,读取该搜索节点的内部位图,根据内部位图和搜索节点内指向叶子节点数组的指针,计算该搜索节点内存在的最长匹配前缀,更新当前最佳匹配指针,计算当前最佳匹配指针对应的叶子节点的地址。该方法可以提高查询速度。
文档编号G06F17/30GK101577662SQ20081009690
公开日2009年11月11日 申请日期2008年5月5日 优先权日2008年5月5日
发明者娟 张, 猛 李, 军 梁, 沈士军, 睿 胡, 钧 龚 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1