基于TCAM 的高速路由查找

摘要
  随着路由器接口速率的提高,传统的软件路由查找机制已经不能满足要求。目前常见的硬件解决方案是采用TCAM实现关键词
  TCAM,路由查找,最长前缀匹配。
1、引言
  路由器转发IP 分组时,转发引擎需要在路由表中查找该IP 报文中2、CAM 与TCAM
  目前研究人员已经提出了基于RAM 的路由查找算法。但是工业界中使用最多的硬件实现路由查找的方法仍然是使用  路由查找具有  为了能够克服上述方法的缺点,又提出了一种CAM 实现机制任意长度的关键字表项
  TCAM 中每一个表项都是以地址和掩码分别占用W 比特。对于关键字长度为Y(1≤Y≤W)的表项来说,它的掩码前Y 个比特为1,而剩下的W-Y 比特为0,它的地址后W-Y 个比特可以是0 或者1
  例如,假设W 为5,那么地址前缀10*就可以用序偶<10000,11000>表示。在表项的匹配查找中,TCAM 判断(查找关键字Bitwise And掩码)是否与(目的地址Bitwise And 掩码)相等,如果相等表示关键字与该表项匹配;否则不匹配。
  TCAM 的查找结构如图1 所示。
    基于TCAM 的高速路由查找 - loving you - 天道酬勤
  TCAM 通过保存的关键字更新工作变得相对复杂了
  例如,当加入一条新的表项时,为了能够仍然保持关键字间的顺序关系,就需要移动一些前缀长度比新表项要长的一些表项,因此TCAM 的更新操作较为复杂。
  由于TCAM 具有非常高的查找速度,目前TCAM 厂商提供的芯片每秒钟可以完成50M 次的最长地址前缀查找,因此TCAM 可以满足骨干路由器的高速查找要求。
3、基于TCAM 的路由查找
  图2 是使用Ternary CAM 进行路由查找的示意图。
 
基于TCAM 的高速路由查找 - loving you - 天道酬勤
  图中的所有表项按照路由前缀的长度降序排列,假设为目的地址103.23.3.7 的IP 报文查找转发路径,CAM 同时将它保存的所有表项与关键字103.23.3.7 进行匹配查找,发现表项P1 以及P2均与关键字相互匹配,但是TCAM 的优先级仲裁器返回地址最小的匹配表项,即表项P1。
     由于TCAM 需要维持所有的路由表项按照前缀长度有序,所以对于路由的动态更新来说,效率就会比较低
  还是以图2 为例,假设现在需要在转发表中增加新的表项 103.23.128/18,按照表项组织的方式,新的表项应该保存在表项103.23.3/24(P1)和表项103.23/16(P2)之间,但是目前在这两个表项之间没有空闲的表项空间,所以需要通过移动其它表项的方式来为新表项腾出空间
4、TCAM 表项管理算法 
基于TCAM 的高速路由查找 - loving you - 天道酬勤
  4.1 顺序移动法
  整个TCAM 表按照图3 的方式组织,所有关键字表项按照它们的前缀长度组成一个个表项集合块,并且从TCAM 的低地址开始顺序排列,所有的空闲空间存放在TCAM 的高地址
  图2 采用的就是这种方式。如果我们需要在TCAM 中加入长度为20 的地址前缀,该地址前缀应该保存在表项P1 和P2 之间。为了能够在P1和P2 之间腾出一个空闲空间,那么最简单的方法就是将P2 到P5 这四个表项依次向下移动一个位置,这种方式的效率很低,最差情况下的算法复杂度为O(N),其中N 为目前TCAM 中保存的表项数目。 
  4.2 预留表项空间的顺序移动法
  为了尽量避免表项插入造成其它表项大规模的移动,可以为每个长度的前缀集合预留一些空闲的表项,如图4 所示。
  当需要加入新的前缀表项时,如果对应前缀长度的前缀集合中包含空闲表项,那么就不需要进行表项移动操作;如果不存在空闲表项,那么需要从相邻的前缀集合块中借用空闲表项,路由更新带来的表项移动次数大大降低了。这种方法能够提高路由更新的平均效率,但是在最差情况下,路由更新的算法复杂度仍然为O(N)。
  4.3 选择移动法
  TCAM 要求所有的路由按照前缀长度降序排列,令Pj 代表的是前缀长度为j 的所有路由集合,如果j>k,那么所有Pj中的路由表项都应该保存在Pk中的路由表项之前。TCAM 只要求前缀长度集合块之间的顺序关系,对于每个前缀长度集合块内部各个路由前缀之间的顺序关系没有严格规定。选择移动法就利用了这一思想,算法实现如图5 所示。
 
基于TCAM 的高速路由查找 - loving you - 天道酬勤
  当需要在TCAM中加入长度为k(8≤k≤32)的路由前缀时,首先从长度8 的前缀块开始,将前缀块的第一项移动到最后一项(即TCAM的空闲表项区域),这样在长度为8 的前缀块处就有了一个空闲表项;然后将长度为9 前缀块中的第一项移动到这一个空闲表项处,使得长度为9 前缀块中出现了空闲表项;以此类推,直到新加入表项所在的前缀块为止,那时就只需要将该新表项加入到分配处的空闲表项处就
可以了。显然,这种算法的复杂度为O(W),其中W 是路由前缀的长度。使用选择移动法,在图2 的例子中,只需要移动P5、P4、P2 三个表项就可以在P1 与P2 之间腾出空间并且仍然保持TCAM 前缀长度有序。 
  还可以对选择移动法进行改进来提高算法的效率,如图6 所示,我们将TCAM 的空闲前缀块从TCAM 的底部移动到TCAM 的中间,其它算法的思想维持不变,显然此时算法的复杂度进一步降低为O(W/2)
  与顺序移动法相比,选择移动法大大减少了更新过程的表项移动次数,因而提高了算法的运行效率。
  4.4  预留表项空间的选择移动法
  可以将预留表项空间的思想运用到选择移动法当中,预留表项空间的选择移动法是TCAM 更新平均性能最好的管理算法
  4.5 表项管理算法的实现
  为了维护整个TernaryCAM 的路由前缀结构,我们设计了一个struct tcamBlock 数据结构来表示每一个路由前缀块的状态信息,其中start 变量指示该路由前缀块在TCAM 中的起始位置,end 变量指示路由前缀块在TCAM 中的终止位置,number 表示路由前缀块中真正有效的路由前缀表项数。这三个表量之间的关系为number≤end-start+1,其中等号成立当且仅当该路由前缀块中不存在无效路由前缀表项。 
  基于TCAM 的高速路由查找 - loving you - 天道酬勤  
  由于选择移动法的性能远远优于顺序移动法,所以我们设计实现了选择移动法(包括改进算法)和预留表项的选择移动法。不管采用哪一种实现方案,TCAM 更新过程的操作都可以归纳为路由前缀块上移或者路由前缀块下移这两种基本的路由移动方法。
5、结论  
  本文所提出的基于TCAM 的路由管理方案已经在“863”重大项目“核心路由器”中实现了。具体实现时采用的是LaraTech 公司的CAM 存储器条LTM7160,每条由8 片LTI7020构成,一共可以支持256K 个表项。我们采用两条进行度级联以满足512k 路由表项的存储要求。性能测试表明,我们实现的基于TCAM 的路由查找引擎完全能够支持2.5Gbps速率的OC-48 端口的线速转发的要求。
来源:http://blog.csdn.net/jeason29/article/details/45364661
posted @ 2018-03-15 18:47  mull  阅读(1228)  评论(0编辑  收藏  举报