- 1
- 0
- 约1.54万字
- 约 12页
- 2021-10-31 发布于湖北
- 举报
标题页
本章介绍作者归纳的 15 条实现原则。这些实现原则是从比较成功的协议实
现中归纳出来的。 其实许多实现者已经有意无意地使用了这些原则, 本章只是更
清楚地将它们表达出来,以使实现者可以更加主动地去运用它们。
3.1 运用实现原则的例子:更新 TCAM
下面用一个例子来说明为什么要使用原则。
使用 TCAM 进行 IP 地址查找
图 3.4 是 TCAM 用于 IP 地址查找的例子。 IP 地址前缀是长度为 32 比特的三
态字符串,通配符都在字符串的尾部。我们稍微改变一下表示法,使得 * 表示任
意数量的通配符。
按照 TCAM 的工作原理以及最长前缀匹配的要求, TCAM 中的地址前缀必
须按照前缀长度从大到小的顺序排列。
路由表是动态变化的,如何在 TCAM 中添加或删除一条地址前缀,与此同
时仍然保持前缀长度从大到小的排列顺序?
假定在图 3.4 的 TCAM 中需要添加一条新的前缀 11*。假定 TCAM 是向上扩
展空间的,最朴素的方法是在长度为 2 的前缀表项中插入前缀 11*,比如插在前
缀 0* 的前面,为此,需将前缀 10*至前缀 010001*整体向上移动一个位置。对于
包含大量路由表项的路由器来说,这种更新的速度太慢了。
有没有快一点的方法呢?我们再来看一下图 3.4 的前缀排列方法:长度相同
的前缀排列在一起, 按照从长到短的顺序排列, 相同长度的前缀还按照大小进行
了排序。
事实上,相同长度前缀的顺序对于 TCAM 执行最长前缀匹配不是必须的,
因为一个 IP 地址不可能同时匹配两个相同长度的前缀。我们只需要按照前缀长
度进行排序,并不需要相同长度前缀之间排序, 因此这是一个可以利用的自由度。
理解并利用自由度( 1)
利用该自由度, 我们可将 11*插入到 00* 和 111*之间。当然,如果为此将 111*
及以上前缀向上移动一个位置, 则不会有多大优化的效果。 我们的想法是将 111*
移出,将 11*插入 111*的位置,然后再为 111*寻找一个插入位置。 尽管这个问题
和原来的差不多,仍然要向 TCAM 中插入一条前缀,但是问题的规模缩小了一
点。
理解并利用自由度( 2 )
我们可以将这个方法推广: …… 。显然我们可以采用递归的思想来设计一个
算法。
使用算法技术 — 采用递归
实现的时候展开递归: …… 。
如果每一种长度的前缀都有(即最坏情况) ,需要(32-i )次访存。对于较小
的 i ,访存次数接近 32。这个算法已经比朴素的算法好了很多,但是不是最好了
呢?还能减小最坏情况下的访存次数吗?(想一想)
我们再来看这张图,这张图假设空闲空间在 TCAM 的顶部,实际上空闲空
间可以放在 TCAM 的任何地方,因此空闲空间的位置也是一个设计自由度。
进一步利用自由度
利用这个自由度,可以将空闲空间放在中间,比如放在长度为 16 的前缀项
后面,这时最坏情况下的访存次数可以减少一半。
当然,空闲空间的数量也可以是一个自由度,可以进一步减少最坏情况下的
访存次数。
除了空闲空间的位置及数量之外,还有没有可以利用的自由度了呢?提示:
长的前缀是否一定要出现在短的前缀之前?比如, 010* 能否放在 1110
原创力文档

文档评论(0)