摘要
  随着路由器接口速率的提高,传统的软件路由查找机制已经不能满足要求。目前常见的硬件解决方案是采用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 通过保存的关键字更新工作变得相对复杂了。
  例如,当加入一条新的表项时,为了能够仍然保持关键字间的顺序关系,就需要移动一些前缀长度比新表项要长的一些表项,因此TCAM 的更新操作较为复杂。
  由于TCAM 具有非常高的查找速度,目前TCAM 厂商提供的芯片每秒钟可以完成50M 次的最长地址前缀查找,因此TCAM 可以满足骨干路由器的高速查找要求。
3、基于TCAM 的路由查找
  图2 是使用Ternary CAM 进行路由查找的示意图。
 
  图中的所有表项按照路由前缀的长度降序排列,假设为目的地址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 表项管理算法 
  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中加入长度为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 更新过程的操作都可以归纳为路由前缀块上移或者路由前缀块下移这两种基本的路由移动方法。
5、结论  
  本文所提出的基于TCAM 的路由管理方案已经在“863”重大项目“核心路由器”中实现了。具体实现时采用的是LaraTech 公司的CAM 存储器条LTM7160,每条由8 片LTI7020构成,一共可以支持256K 个表项。我们采用两条进行深度级联以满足512k 路由表项的存储要求。性能测试表明,我们实现的基于TCAM
的路由查找引擎完全能够支持2.5Gbps速率的OC-48 端口的线速转发的要求。
来源:http://blog.csdn.net/jeason29/article/details/45364661

基于TCAM 的高速路由查找的更多相关文章

  1. 利用nf_conntrack机制存储路由,省去每包路由查找

    IP是无连接的,因此IP路由是每包一路由的,数据包通过查找路由表获取路由,这是现代操作协议协议栈IP路由的默认处理方式.可是假设协议栈具有流识别能力,是不是能够基于流来路由呢?答案无疑是肯定的. 设计 ...

  2. 基于PCIe的高速接口设计

    基于PCIe的高速接口设计 由 judyzhong 于 星期四, 03/03/2016 - 13:49 发表 作者:李晓宁,姚远程,秦明伟 2016年微型机与应用第1期 摘要:PCIe总线是第三代I/ ...

  3. FPGA和DSP间基于SRIO的高速通信系统设计

    作者:陈婷,岳强,汪洋 解放军信息工程大学 摘要: 现代信号处理系统通常需要在不同处理器之间实现高速数据通信,SRIO协议由于高效率.低延时的特性被广泛使用.本文研究了在FPGA和DSP两种处理器之间 ...

  4. Tair LDB基于Prefixkey中期范围内查找性能优化项目总结

    "Tair LDB基于Prefixkey该范围内查找性能优化"该项目是仅一个月.这个月主要是熟悉项目..以下从几个方面总结下个人在该项目上所做的工作及自己的个人所得所感. 项目工作 ...

  5. 基于zuul实现自定义路由源码分析

    ZuulFilter定义 通过继承ZuulFilter我们可以定义一个新的过滤器,如下 public class IpAddressFilter extends ZuulFilter { @Autow ...

  6. 第二百六十四节,Tornado框架-基于正则的动态路由映射分页数据获取计算

    Tornado框架-基于正则的动态路由映射分页数据获取计算 分页基本显示数据 第一步.设置正则路由映射配置,(r"/index/(?P<page>\d*)", inde ...

  7. 第二百六十三节,Tornado框架-基于正则的动态路由映射

    Tornado框架-基于正则的动态路由映射 1.在路由映射条件里用正则匹配访问路径后缀2.给每一个正则匹配规则(?P<设置名称>)设置一个名称,3.在逻辑处理的get()方法或post() ...

  8. 《深入理解Linux网络技术内幕》阅读笔记 --- 路由查找

    概述 1.不论是入口还是出口流量,都是利用fib_lookup来查找路由表,fib_lookup是对每一个路由表所提供的查找函数的包裹函数,当不支持策略路由时,查找函数版本针对的是local表和mai ...

  9. 基于express+redis高速实现实时在线用户数统计

    作者:zhanhailiang 日期:2014-11-09 本文将介绍怎样基于express+redis高速实现实时在线用户数统计. 1. 在github.com上创建项目uv-tj.将其同步到本地: ...

随机推荐

  1. 11.1-uC/OS-III就绪列表

    准备好运行的任务被放到就绪列表中, 如图6-1.就绪列表是一个数组( OSRdyList[]),它一共有OS_CFG_PRIO_MAX条记录,记录的数据类型为OS_RDY_LIST(见OS.H).就绪 ...

  2. jQuery Mobile的默认配置项具体解释,jQuery Mobile的中文配置api,jQuery Mobile的配置说明,配置大全

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/xmt1139057136/article/details/35258199 学习jQuery Mob ...

  3. java String[] 初始化

    String[] 初始化 String[] s1 = {"hello", "world"}; String[] s2 = new String[]{" ...

  4. 屏幕适配(UGUI)非UI

    using UnityEngine; public enum Suit_UIType { Background, Effect, } [RequireComponent(typeof(Transfor ...

  5. web前端学习历程--跨域问题

    一.同源策略 一个页面的ajax只能获取这个页面相同源(协议.域名.端口号都必须相同)的数据. 二.jsonp方法 1.json和jsonp JSON(JavaScript Object Notati ...

  6. Nginx 多域名配置

    nginx绑定多个域名可又把多个域名规则写一个配置文件里,也可又分别建立多个域名配置文件,我一般为了管理方便,每个域名建一个文件,有些同类域名也可又写在一个总的配置文件里.一.每个域名一个文件的写法  ...

  7. C# AsyncCallback异步回调用法示例

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  8. Flask最强攻略 - 跟DragonFire学Flask - 第十四篇 Flask-SQLAlchemy

    前不久刚刚认识过了SQLAlchemy,点击这里复习一下 当 Flask 与 SQLAlchemy 发生火花会怎么样呢? Flask-SQLAlchemy就这么诞生了 首先要先安装一下Flask-SQ ...

  9. python split()函数的用法

    转自: https://blog.csdn.net/orangefly0214/article/details/80810449 函数:split() Python中有split()和os.path. ...

  10. 使用shiro框架,注销问题的解决

    在使用shiro框架的时候,有时候会因为登录问题找不到注销的controller.所以会报404的错误,下面是解决办法: 1.首先写一个类SystemLogoutFilter继承LogoutFilte ...