摘要
  随着路由器接口速率的提高,传统的软件路由查找机制已经不能满足要求。目前常见的硬件解决方案是采用TCAM实现高速路由查找。由于路由查找具有最长前缀匹配的特点,因此采用TCAM 需要解决路由表如何存储和管理等问题。本文设计和实现了基于TCAM 的高速路由查找机制,重点解决了路由表的存储和管理机制。该方案已经用于国家“863”重大项目“核心路由器”中,取得了良好的效果。
关键词
  TCAM,路由查找,最长前缀匹配。
1、引言
  路由器转发IP 分组时,转发引擎需要在路由表中查找该IP 报文中目的地址所对应的路由信息,从而决定IP 报文的转发方式。在报文转发的这一系列工作过程中,以路由查找过程最为关键,因此设计快速的路由查找算法已经成为提高路由器整体性能的关键之一。随着路由器接口速率的提高,传统的基于软件的路由查找机制已经不能满足要求。本文设计和实现了一种基于TCAM 的硬件路由查找机制,重点解决了路由表的存储和管理。
2、CAM 与TCAM
  目前研究人员已经提出了基于RAM 的路由查找算法。但是工业界中使用最多的硬件实现路由查找的方法仍然是使用内容寻址存储器(CAM,Content Addressable Memory)来进行快速的路由查找,CAM 或者全相联存储器能够在一个硬件时钟周期内完成关键字的精确匹配查找。我们常用的随机存储器通过输入地址来返回该地址处所对应的数据信息,但是CAM 的访问方式不同,它只需要输入关键字的内容,CAM 就会将此关键字与CAM 中所有的表项同时进行匹配比较,最后返回匹配表项在CAM 中所对应的地址。
  路由查找具有最长前缀匹配的特点,为了能够使用CAM 来进行最长前缀路由的查找,我们可以为每一类可能的地址前缀长度使用一个CAM,每个CAM 保存对应长度的所有前缀集合。对于IPv4 来说,一共需要使用32 个CAM。这种方法有一个明显的缺点,在对地址前缀长度具体分布没有准确的了解之前,为了能够保证能够存储N 个前缀表项,每个CAM都需要有N 个表项的空间,因此CAM 存储空间的利用率大大降低了。
  为了能够克服上述方法的缺点,又提出了一种CAM 实现机制TCAM (ternary CAM) ,TCAM 的优点是它所保存的表项在长度要求上非常灵活,可以在同一个TCAM 芯片中保存任意长度的关键字表项。
  TCAM 中每一个表项都是以<地址、掩码>序偶的形式保存,假设地址关键字的长度范围从1 到W,那么地址和掩码分别占用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 需要在这些匹配的表项中选取一个表项作为最后的查找结果,TCAM 规定在所有匹配的表项中选取地址最低的表项作为最后的结果。
为了能够进行最长前缀路由的查找,我们就需要保证在TCAM 的低地址存储前缀较长的关键字表项,而在地址高的区域存储前缀较短的关键字表项。
TCAM 具有速度快、实现简单的优点,但是它也具有三个不足之处:
第一、与一般的随机存储器RAM 相比,  单位比特的TCAM 更为昂贵,而且存储芯片的容量相对要小一些;
第二、由于TCAM 使用的是  并行匹配比较方式,所以TCAM 芯片的  功耗较大。  查找过程所有关键字表项都进行了比较,但是实际能够匹配上的关键字只是几项,因此  大部分的比较操作都被浪费了;
第三、  TCAM 需要保证前缀较长的关键字保存在前缀较短的关键字之前,这种关键字之间的顺序关系使得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 端口的线速转发的要求。

基于TCAM 的高速路由查找相关推荐

  1. 基于TCAM的路由查找及表项管理

    本文是对TCAM相关知识的整理:D. 背景 为了取出RAM中的数据,操作系统必须给出存储数据的内存地址才能取出数据,CAM正相反, CAM通过对内容本身执行查询,CAM将此关键字与CAM中所有的表项同 ...

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

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

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

    摘要: 现代信号处理系统通常需要在不同处理器之间实现高速数据通信,SRIO协议由于高效率.低延时的特性被广泛使用.本文研究了在FPGA和DSP两种处理器之间实现SRIO协议的方法,并通过电路设计和利用 ...

  4. 子网ip和子网掩码不匹配_【详解】你知道什么是IP路由查找的“最长匹配原则”吗?...

    最长匹配原则是CISCO IOS路由器默认的路由查找方式. 当路由器收到一个IP数据包时,会将数据包的目的IP地址与自己本地路由表中的表项进行bit by bit的逐位查找,直到找到匹配度最长的条目, ...

  5. 群晖openwrt旁路由_[openwrt监控]如何配置Check MK进行基于openwrt的软路由监控

    最近用吃灰的nuc搭建了一个基于OpenWrt的软路由,用的旁路由模式.日常待机10W左右,用着还不错. 下面讲一下如何用check_mk来监控OpenWrt系统: 1.点击右边导航栏中的Monito ...

  6. 路由ssr服务器信息不完整,基于Nuxt构建动态路由SSR服务

    大约两年前曾经分享过基于Vue的SSR框架Nuxt的简单使用<基于Vue.js的SSR方案之Nuxt.js>,今天因为有SSR需求又重新做了一些尝试. 由于目前在做的是一个能够动态构建页面 ...

  7. 【翻译】基于 Create React App路由4.0的异步组件加载(Code Splitting)

    基于 Create React App路由4.0的异步组件加载 本文章是一个额外的篇章,它可以在你的React app中,帮助加快初始的加载组件时间.当然这个操作不是完全必要的,但如果你好奇的话,请随 ...

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

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

  9. linux路由内核实现分析(三)---路由查找过程

    ------------------------------------------------------------------------------------------ 以下是我根据 li ...

最新文章

  1. 【单页应用】全局控制器app应该干些什么?
  2. 4.8 计算机网络之网络层设备路由器
  3. 1.多彩的幕布CCLayerColor,CCLayerGradient
  4. svn提交时自动设置 needs-lock
  5. 云开发0基础训练营第二期热力来袭!
  6. 文本预处理跑得慢?抱抱脸团队又放福利,1GB文本语料分词只需20s!
  7. 计算机视觉 || Canny算子实现边缘分割并进一步处理
  8. linux centos 回收站,centos下实现回收站功能
  9. lightbox灯箱效果
  10. python中的scaler_使用时值错误scaler.inverse_变换在Python中
  11. 团队作业8----第二次项目冲刺(Beta阶段) 第二天
  12. -Cannot use v-for on stateful component root element because it renders multiple elements
  13. modbus4j.jar实现modbus urt模式
  14. AsciiDoc 的相关整理
  15. html学习(06)-网页制作【学成在线】
  16. Mariadb数据库之主从复制同步配置实战
  17. 彻底理解并解决服务器出现大量TIME_WAIT - 第三篇
  18. CVE-2010-2729(MS10-061)
  19. 家庭影院投影仪比较,哪个投影仪的牌子好
  20. 火山PC布局器套布局器

热门文章

  1. Meld Diff for windows 安装配置
  2. 缓存雪崩的基于事前+事中+事后三个层次的完美解决方案
  3. lol丢失base.dll文件怎么办?base.dll文件下载
  4. zookeeper--ClientCnxn
  5. 使用C#通过串口控制IT6333B电流源
  6. win10 软件安装出现错误代码 2502/2503
  7. Altium Designer学习
  8. 【android】 如何把gif图片下载到本地
  9. szshunjia储存不干胶标签的心得简述分享
  10. 维度数据建模的概念和术语