专利名称:一种三重内容可寻址存储器路由表管理方法
技术领域:
本发明涉及计算机网络技术领域,尤其涉及使用TCAM(Ternary ContentAddressable Memory,三重内容可寻址存储器)实现路由表管理方面的技术,主要应用在路由器,交换机,防火墙,入侵检测系统等网络设备。
背景技术:
现今的网络设备中,路由是最基本的功能。目前主要是使用IPv4(InternetProtocol version 4,互联网协议第四版),其地址是32位,IPv6(Internet Protocolversion 6,互联网协议第六版)也已经开始慢慢应用起来,其地址是128位。实现路由查找对网络设备的性能是非常关键的,目前主要有两种途径,一种是使用软件实现,最典型的就是Trie表算法;另一种就是使用硬件实现,最典型的就是TCAM。当然硬件实现肯定比软件快很多,尤其是在一些高速网络中,一般都使用硬件进行加速。
TCAM是一种专用三重内容可寻址存储器,可以进行快速大量并行搜索。搜索的时候,存储器中所有的条目同时与搜索关键字比较,搜索结果就是匹配项的物理地址。在进行条目匹配时,条目的每个位可以是0、1、x三种状态,如果是x,那么该位不参与比较,默认是成功,否则关键字和条目的相应位进行比较,如果相同则成功否则失败。在比较过程中,如果某位不匹配,那么该条目匹配失败;如果所有位都匹配,那么该条目匹配成功。
TCAM硬件的固有特性使得TCAM非常适合做LPM(longest prefix match,最长前缀匹配)查找,而IPv4/IPv6路由就是使用LPM查找的,所以在高速网络比如10G网络中,使用TCAM进行路由查找是一个趋势。
普通TCAM的查找过程是采用最先匹配的原则,也就是说如果有多个匹配项,那么最先匹配的或者说地址最低的那个获胜。所以LPM表必须按prefix长度递减排序,这导致插入删除条目时需要对已有的表项进行移动,见图1。一般的TCAM都有几十K甚至几百K的条目,如果插入/删除的是第一个条目,按照最简单的方法移动的话,那么条目移动的次数是很大的,同时还要移动与条目相关联的数据,这根本无法满足高速网络的路由更新需求。论文《Fastincremental updates on Ternary-CAMs for routing lookups and packetclassification》(http://www.hoti.org/archive/hoti8papers/018.pdf)提出了两种方法实现TCAM路由表的管理第一个是PLO_OPT(prefix-length ordering),另一个是CAO_OPT(chain-ancestor ordering)。PLO_OPT算法虽然简单,但是平均更新效率较低,CAO_OPT算法的更新效率高,但是实现复杂度较高。
发明内容
本发明的目的在于解决TCAM实现IPv4/IPv6的路由表管理问题,提供一种简单高效的方法实现路由条目的更新。
为实现上述目的,本发明提出了一种三重内容可寻址存储器路由表管理方法,将路由表按照路由的前缀长度划分为多个区域,其中,更新所述路由表中的路由时,当区域实际空间不足或过大时,在所述路由表内的各个区域空间之间进行区域大小的动态调整。
上述的三重内容可寻址存储器路由表管理方法,其中,当在所述路由表中插入路由时,具体包括以下步骤步骤21,判断所要插入的路由所属的当前区域是否有空闲空间;步骤22,若是,则直接在所述当前区域最后的路由后面插入所述路由,若否,则在所述当前区域的上方和下方的其他区域寻址是否存在有空闲空间的区域;步骤23,若不存在,则插入失败,若存在,则扩大所述当前区域,缩小有空闲空间的区域,然后在所述当前区域中插入路由;步骤24,递增所述当前区域的路由计数,并递增所述路由表的总路由计数。
上述的三重内容可寻址存储器路由表管理方法,其中,若所述有空闲空间的区域在所述当前区域的上方,所述步骤23具体包括以下步骤步骤31,从所述有空闲空间的区域的下边界收缩一个条目的空间;步骤32,将所述有空闲空间的区域的下一个区域到所述当前区域的上一个区域之间的每个区域的最后一个条目移到同一个区域的第一个条目的上面;
步骤33,从所述当前区域的上边界扩大一个条目的空间,并在所述当前区域的上边界处插入路由。
上述的三重内容可寻址存储器路由表管理方法,其中,若所述有空闲空间的区域在所述当前区域的下方,所述步骤23具体包括以下步骤步骤41,将所述有空闲空间的区域的第一个条目移到最后一个条目的后面,并从所述有空闲空间的区域的上边界收缩一个条目的空间;步骤42,将所述有空闲空间的区域的上一个区域到所述当前区域的下一个区域之间的每个区域的第一个条目移到同一个区域的最后一个条目的下面;步骤43,从所述当前区域的下边界扩大一个条目的空间,并在所述当前区域的下边界处插入路由。
上述的三重内容可寻址存储器路由表管理方法,其中,当在所述路由表中删除路由时,具体包括以下步骤步骤51,查找所要删除的路由在TCAM中的位置,计算所述要删除的路由在所属的当前区域内的相对位置;步骤52,判断所述要删除的路由是否是所述当前区域的最后一个路由;步骤53,若是,则直接删除所述要删除的路由,若否,则将所述当前区域最后一个条目移到当前删除条目位置,再删除所述要删除的路由;步骤54,递减所述当前区域的前缀计数,并递减所述路由表的总前缀计数。
上述的三重内容可寻址存储器路由表管理方法,其中,还包括进行区域收缩的步骤,具体包括步骤61,判断所述当前区域的大小是否超过期望值;步骤62,若否,则不进行区域收缩,若是,则依次在所述当前区域的上方和下方查找是否有空间不足的区域;步骤63,若否,则停止区域收缩,若是,则收缩所述当前区域,扩大所述空间不足的区域。
上述的三重内容可寻址存储器路由表管理方法,其中,当所述空间不足的区域在所述当前区域上方时,具体包括以下步骤步骤71,将所述当前区域到所述空间不足的区域的下一个区域之间的每个区域的第一个条目移到该同一区域的最后一个条目的下面;
步骤72,在所述当前区域的下边界缩小一个条目的空间;步骤73,将所述空间不足的区域的下边界扩大一个条目的空间。
上述的三重内容可寻址存储器路由表管理方法,其中,当所述空间不足的区域在所述当前区域下方时,具体包括以下步骤步骤81,将所述当前区域的下一个区域到所述空间不足的区域之间的每个区域的最后一个条目移到该同一个区域的第一个条目的上面;步骤82,将所述当前区域的下边界缩小一个条目的空间;步骤83,从所述空间不足的区域的下边界扩大一个条目的空间。
上述的三重内容可寻址存储器路由表管理方法,其中,还包括前缀分布自学习过程,具体包括步骤91,路由更新进行计数;步骤92,判断计数值是否到达采样周期,若否,结束自学习过程,若是,判断当前路由条目数是否超过门限值;步骤93,若否,结束自学习过程,若是,对每个前缀区域进行重新计算,公式如下区域的新期望值=区域的旧期望值×(1-δ)+按照区域当前前缀所占比例算得的区域理想大小×δ,δ是一个系数,用于调整区域理想大小所占的比重。
上述的三重内容可寻址存储器路由表管理方法,其中,路由表初始化时,根据设定的前缀长度分布概率分配每个路由区域的期望值大小,所述期望值初始化时与分配给每个区域的大小相同。
采用本发明所述方法可以简单高效的解决TCAM实现IPv4/IPv6的路由表管理问题。它的优点如下1.实现简单,没有复杂的算法和数据结构;2.更新效率非常高添加路由平均移动条目数≈0,删除路由平均移动条目数≈1;3.具有自动调整恢复功能,可以保持稳定的更新效率;4.具有智能自学习功能,可以根据实际路由分布情况自动调整;5.可以扩展应用到其它LPM表的管理。
图1是本发明LPM表在TCAM中的排列顺序示意图;图2是本发明初始化后的前缀区域分布图;图3是本发明插入路由的流程图;图4是本发明前缀区域扩展例子;图5是本发明删除路由的流程图;图6是本发明前缀区域收缩例子;图7是本发明前缀分布学习流程图。
具体实施例方式
下面结合附图详细说明本发明实施例如下。
图1是本发明LPM表在TCAM中的排列顺序示意图。图2是本发明初始化后的前缀区域分布图。如图所示假设路由长度为N,那么系统有N个前缀区域,每个前缀区域有一组信息,如下upper_boundary——上边界lower_boundary——下边界prefix_num——前缀个数region_size——区域实际大小expected_size——区域期望大小全局信息g_region[N]——所有区域的信息,结构如上所述g_prefix_total——路由表前缀总个数g_start——路由表在TCAM中的起始位置g_capability——路由表总容量根据以前统计信息预设每个区域大小,并初始化区域相关信息以及全局信息。每个区域的分配比例存放在percentage[N]数组中。
全局信息初始化如下g_prefix_total=0g_start=路由表在TCAM中的起始位置
g_capability=路由表总容量区域N信息首先初始化如下g_region[N].expected_size=g_region[N].region_size=g_capability×percentage[N]g_region[N].upper_boundary=g_startg_region[N].lower_boundary=g_region[N].upper_boundary+g_region[N].region_size-1g_region[N].prefix_num=0区域I(N>I>0,I从N-1→1)信息依次初始化如下g_region[I].expected_size=g_region[I].region_size=g_capability×percentage[I]g_region[I].upper_boundary=g_region[I+1].lower_boundary+1g_region[I].lower_boundary=g_region[I].upper_boundary+g_region[I].region_size-1g_region[I].prefix_num=0图3是本发明插入路由的流程图。图4是本发明前缀区域扩展例子。如图所示,假设插入的路由前缀长度是I,具体步骤描述如下S301,判断插入的路由所在的前缀区域I是否有空闲的条目,判断方法是g_region[I].region_size>g_region[I].prefix_num。如果有空闲空间,那么在g_region[I].upper_boundary+g_region[I].prefix_num处插入路由,然后跳到S311。
S302,前缀区域I没有空闲空间,这时可以考虑扩展该区域。首先判断整个路由表是否有空闲空间,判断方法如下g_capability>g_prefix_total。如果整个路由表都没有空闲空间,那么插入失败,跳到S312。
S303,路由表有空闲空间,可以进行前缀区域扩展。依次在区域I的上下区域查找有空闲空间的前缀区域J,判断条件如下g_region[J].region_size>g_region[J].prefix_num判断过程是一个迭代过程,为了使移动的次数最少,判断方法是先判断J+1、J-1,然后判断J+2、J-2,直到找到有空闲空间的前缀区域。
S304,如果J<I,跳到步骤S308。区域扩展例子参见图4。
S305,空闲区域J在区域I的上面。从区域J的下边界缩小一个条目的空间g_region[J].region_size--g_region[J].lower_boundary--S306,将区域J-1到I+1之间的每个区域x(每个区域都是满的)依次进行如下操作(上移)g_region[x].upper_boundary--Move(g_region[x].lower_boundary→g_region[x].upper_boundary),将区域最后一个条目移到同一个区域的第一个条目的上面,移动条件是g_region[x].prefix_num>0g_region[x].lower_boundary--S307,从区域I的上边界扩大一个条目的空间g_region[I].region_size++g_region[I].upper_boundary--并在g_region[I].upper_boundary处插入路由,然后跳到S311。
S308,空闲区域J在区域I的下面。
Move(g_region[J].upper_boundary→g_region[J].upper_boundary+g_region[J].prefix_num),将区域第一个条目移到区域最后一个条目的后面,移动条件是g_region[x].prefix_num>0从区域J的上边界缩小一个条目的空间g_region[J].region_size--g_region[J].upper_boundary++S309,将区域J+1到I-1之间的每个区域x(每个区域都是满的)依次进行如下操作(下移)g_region[x].lower_boundary++Move(g_region[x].upper_boundary→g_region[x].lower_boundary),将区域第一个条目移到同一个区域的最后一个条目的下面,移动条件是g_region[x].prefix_num>0。
g_region[x].upper_boundary++S310从区域I的下边界扩大一个条目的空间
g_region[I].region_size++g_region[I].lower_boundary++并在g_region[I].lower_boundary处插入路由。
S311,更新前缀计数信息g_region[I].prefix_num++g_prefix_total++S312,插入结束。
图5是本发明删除路由的流程图。图6是本发明前缀区域收缩例子。如图所示,假设删除的路由前缀长度是I,具体步骤描述如下S501,查找路由在TCAM中的位置location,计算路由在前缀区域I内部的相对位置rela_loca=location-g_region[I].upper_boundary。
S502,判断路由是否是区域内部最后一个路由,判断方法如下rela_loca=g_region[I].prefix_num-1。如果是则直接在location处删除该路由,否则将区域最后一个条目移到当前删除条目位置Move(g_region[I].upper_boundary+g_region[I].prefix_num-1→locaion)。
S503,更新前缀计数信息g_region[I].prefix_num--g_prefix_total--S504,判断是否需要进行区域收缩,这主要是为了防止路由频繁动荡导致区域分布恶化,进而降低平均更新效率。在更新过程中主动调整恢复前缀区域分布可以有效的保证删除时最多移动一个条目,而插入则不用移动条目,这样就可以维持很高的更新效率。判断是否需要进行区域收缩的方法如下g_region[I].region_size>g_region[I].expected_size。如果不需要则跳到S513。
S505,需要进行区域收缩。依次在区域I的上下区域查找满足下面条件的区域Jg_region[J].region_size<g_region[J].expected_size判断过程是一个迭代过程,为了使移动的次数最少,判断方法是先判断J+1、J-1,然后判断J+2、J-2,直到找到空间不足的前缀区域。
S506,如果J<I,跳到步骤S510。区域收缩例子参见图6。
S507,空闲区域J在区域I的上面。将区域I到J-1之间的每个区域x依次进行如下操作(下移)g_region[x].lower_boundary++Move(g_region[x].upper_boundary→g_region[x].upper_boundary+g_region[x].prefix_num),将区域第一个条目移到区域最后一个条目的后面,移动条件是g_region[x].prefix_num>0g_region[x].upper_boundary++S508,从区域I的下边界缩小一个条目的空间(注意区域I已经下移过)g_region[I].region_size--g_region[I].lower_boundary--S509,从区域J的下边界扩大一个条目的空间g_region[J].region_size++g_region[J].lower_boundary++然后跳到S513S510,空闲区域J在区域I的下面。将区域I-1到J之间的每个区域x依次进行如下操作(上移)g_region[x].upper_boundary--Move(g_region[x].upper_boundary+g_region[x].prefix_num→g_region[x].upper_boundary),将区域最后一个条目移到该同一个区域的第一个条目的上面,移动条件是g_region[x].prefix_num>0g_region[x].lower_boundary--S511,从区域I的下边界缩小一个条目的空间g_region[I].region_size--g_region[I].lower_boundary--S512从区域J的下边界扩大一个条目的空间(注意区域J已经上移过)g_region[J].region_size++g_region[J].lower_boundary++S513,删除结束。
当路由更新非常频繁时,那么原始设定的区域expected_size值可能不能适应当前的前缀分布情况,这时可以采用一种动态调整的技术,使得区域expected_size按一定周期进行更新,这就可以保证区域expected_size反映当前路由表中实际前缀的分布比例,这其实就是一种智能的路由前缀分布自学习功能。
因为只有当添加删除路由时才会引起前缀分布的变化,所以只需要在路由更新时进行学习即可。最精确的反映当前前缀的分布莫过于每次路由更新时都进行学习,但是这样CPU性能会消耗很多,所以不可取,这时可以设定一个采样周期sample,具体实施方法如下。
图7是本发明前缀分布学习流程图。如图所示,包括以下步骤S701,每次进行路由更新时都更新计数counter。
S702,当counter MOD sample=0时就进行前缀分布学习。
S703,在学习前首先还需要判断当前状态是否值得学习,只有当g_prefix_total>threadshold时即路由条目超过一定门限后才进行学习,这样可以确保学习的准确性,因为采样样本越大,计算结果越准确。
每次前缀分布学习方法如下对每个前缀区域I(1≤I≤N)的expected_size进行重新计算。
S704,首先,对I赋值I=1。
S705,判断I是否超过N,如果超过,则结束学习。
S706,如果I没有超过N,则按照下面的公式进行计算g_region[I].expected_size=((g_region[I].expected_size÷g_capability)×(1-δ)+(g_region[I].prefix_num÷g_prefix_total)×δ)×g_capability=g_region[I].expected_size×(1-δ)+(g_region[I].prefix_num÷g_prefix_total)×g_capability×δ(0<δ<0.5,建议取0.1)。
S707,计算完成后,赋值I=I+1,然后返回S705。
上面公式的含义如下区域I的新期望值=区域I的旧期望值×(1-δ)+按照区域I当前前缀所占比例算得的区域I理想大小×δ。其中δ是一个系数,用于调整区域I理想大小所占的比重,由于路由一直在不停的变化,所以δ值不能大,否则会使路由表管理一直处于一种动荡状态。
上面是智能前缀分布学习功能的基本原理,详细流程图参见图7,只要在每次路由更新时调用即可实现前缀分布学习功能。
智能前缀分布学习功能是可以启用的选项,如果在实际的应用中路由更新的不频繁,那么可以不启用该功能;如果更新比较频繁,那么建议启用该功能,采样周期sample的值随着更新的频繁度递减,具体值可以根据实际的应用进行确定。
当然,本发明还可有其它多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的普通技术人员当可根据本发明做出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。
权利要求
1.一种三重内容可寻址存储器路由表管理方法,将路由表按照路由的前缀长度划分为多个区域,其特征在于,更新所述路由表中的路由时,当区域实际空间不足或过大时,在所述路由表内的各个区域空间之间进行区域大小的动态调整。
2.根据权利要求1所述的三重内容可寻址存储器路由表管理方法,其特征在于,当在所述路由表中插入路由时,具体包括以下步骤步骤21,判断所要插入的路由所属的当前区域是否有空闲空间;步骤22,若是,则直接在所述当前区域最后的路由后面插入所述路由,若否,则在所述当前区域的上方和下方的其他区域寻址是否存在有空闲空间的区域;步骤23,若不存在,则插入失败,若存在,则扩大所述当前区域,缩小有空闲空间的区域,然后在所述当前区域中插入路由;步骤24,递增所述当前区域的路由计数,并递增所述路由表的总路由计数。
3.根据权利要求2所述的三重内容可寻址存储器路由表管理方法,其特征在于,若所述有空闲空间的区域在所述当前区域的上方,所述步骤23具体包括以下步骤步骤31,从所述有空闲空间的区域的下边界收缩一个条目的空间;步骤32,将所述有空闲空间的区域的下一个区域到所述当前区域的上一个区域之间的每个区域的最后一个条目移到同一个区域的第一个条目的上面;步骤33,从所述当前区域的上边界扩大一个条目的空间,并在所述当前区域的上边界处插入路由。
4.根据权利要求2所述的三重内容可寻址存储器路由表管理方法,其特征在于,若所述有空闲空间的区域在所述当前区域的下方,所述步骤23具体包括以下步骤步骤41,将所述有空闲空间的区域的第一个条目移到最后一个条目的后面,并从所述有空闲空间的区域的上边界收缩一个条目的空间;步骤42,将所述有空闲空间的区域的上一个区域到所述当前区域的下一个区域之间的每个区域的第一个条目移到同一个区域的最后一个条目的下面;步骤43,从所述当前区域的下边界扩大一个条目的空间,并在所述当前区域的下边界处插入路由。
5.根据权利要求1所述的三重内容可寻址存储器路由表管理方法,其特征在于,当在所述路由表中删除路由时,具体包括以下步骤步骤51,查找所要删除的路由在TCAM中的位置,计算所述要删除的路由在所属的当前区域内的相对位置;步骤52,判断所述要删除的路由是否是所述当前区域的最后一个路由;步骤53,若是,则直接删除所述要删除的路由,若否,则将所述当前区域最后一个条目移到当前删除条目位置,再删除所述要删除的路由;步骤54,递减所述当前区域的前缀计数,并递减所述路由表的总前缀计数。
6.根据权利要求5所述的三重内容可寻址存储器路由表管理方法,其特征在于,还包括进行区域收缩的步骤,具体包括步骤61,判断所述当前区域的大小是否超过期望值;步骤62,若否,则不进行区域收缩,若是,则依次在所述当前区域的上方和下方查找是否有空间不足的区域;步骤63,若否,则停止区域收缩,若是,则收缩所述当前区域,扩大所述空间不足的区域。
7.根据权利要求6所述的三重内容可寻址存储器路由表管理方法,其特征在于,当所述空间不足的区域在所述当前区域上方时,具体包括以下步骤步骤71,将所述当前区域到所述空间不足的区域的下一个区域之间的每个区域的第一个条目移到该同一区域的最后一个条目的下面;步骤72,在所述当前区域的下边界缩小一个条目的空间;步骤73,将所述空间不足的区域的下边界扩大一个条目的空间。
8.根据权利要求6所述的三重内容可寻址存储器路由表管理方法,其特征在于,当所述空间不足的区域在所述当前区域下方时,具体包括以下步骤步骤81,将所述当前区域的下一个区域到所述空间不足的区域之间的每个区域的最后一个条目移到该同一个区域的第一个条目的上面;步骤82,将所述当前区域的下边界缩小一个条目的空间;步骤83,从所述空间不足的区域的下边界扩大一个条目的空间。
9.根据权利要求1所述的三重内容可寻址存储器路由表管理方法,其特征在于,还包括前缀分布自学习过程,具体包括步骤91,路由更新进行计数;步骤92,判断计数值是否到达采样周期,若否,结束自学习过程,若是,判断当前路由条目数是否超过门限值;步骤93,若否,结束自学习过程,若是,对每个前缀区域进行重新计算,公式如下区域的新期望值=区域的旧期望值×(1-δ)+按照区域当前前缀所占比例算得的区域理想大小×δ,δ是一个系数,用于调整区域理想大小所占的比重。
10.根据权利要求9所述的三重内容可寻址存储器路由表管理方法,其特征在于,路由表初始化时,根据设定的前缀长度分布概率分配每个路由区域的期望值大小,所述期望值初始化时与分配给每个区域的大小相同。
全文摘要
本发明公开了一种三重内容可寻址存储器路由表管理方法,将路由表按照路由的前缀长度划分为多个区域,其特征在于,更新所述路由表中的路由时,当区域实际空间不足或过大时,在所述路由表内的各个区域空间之间进行区域大小的动态调整。本发明可以解决三重内容可寻址存储器实现IPv4/IPv6的路由表管理问题,提供了一种简单高效的方法实现路由条目的更新。
文档编号G06F17/30GK101039252SQ20061001149
公开日2007年9月19日 申请日期2006年3月15日 优先权日2006年3月15日
发明者王俊川, 邵庆华, 刘文龙 申请人:中兴通讯股份有限公司