什么是?
所谓路由的过程就是从入站接口接收到数据包,经过CPU的处理(查找路由表,重构二层帧),把“新”包放入到相应的 接口的过程。这个过程实际上可以 转化成下面的模型:一辆汽车(数据包)走到了十字路口,注意,此时它是有目的地的(目的IP地址),比如这辆汽车想去往北京,到了这个十字路口, 看到了有几个牌子上面写着“北京,石家庄,唐山”,那么这个时候驾驶员(CPU)就应该来选择那个去往北京的路口(出站接口),这样也就完成了路由功能。
更进一步,微观上的路由查询是怎么进行的。
这里所说的微观,并不去讨论路由转发的各种算法,而是去讨论如何去查找路由表。
我们先来看一个简单的拓扑
有四个路由器,分别是POOH,TIGGER,PIDET,RABBIT,在这个拓扑下面显示的是POOH的路由表,可以 看到,现在已经可以从POOH上查询到了五个网段,也就是说现在达到了全网互通。
举
例来说,如果想达到网段10.1.10.0,CPU开始查找路由表,发现了一个路由条目是到达10.1.10.0的,通过192.168.1.194,而
这个地址就是piglet路由器最左边的那个端口,那么这个192.168.1.194又是怎么到达呢?再一次查找路由表,找到了一个网段
192.168.1.192,这里面就包含了192.168.1.194这个地址,而到达它是通过192.168.1.66来实现的。那么
192.168.1.66又是应该怎么到达?还得继续查找路由表。192.168.1.194
这个过程在周而复始的进行,形成一个递归的过程,知道路由器找到直连网段位置,按照上面的那个实例来说就是当找到192.168.1.64这个条目。
好了,这就是路由器递归查询的过程。
但是,这样的查询方法有什么用途呢?你是否考虑过呢?
先让我们回到一个比较本质的问题上去,路由器和交换机的作用是什么?其实无非是两个作用,一是考虑如何把数据包正确的送到目的地址,二是如何更快的送到。 至于其他的各种安全技术,QoS等等都是为这两个终极目标服务的。
由于本篇不涉及到交换机的内容所以在此略过不提,单说路由器,工程师们为了让路由器更好的完成这两个任务做出了不懈的努 力,其中一个就是不断改进的包交换方法以达到快速的转发包的目的。
先让我们从历史的角度看一下
最早诞生的是“进程交换”
这种交换很传统,路由器每收到一个包就会通过CPU查找路由表然后送到出站端口,每过来一个包就会这样做一次。这种方法是没有问题的,但是却很慢,明显的 效率不高。
为了解决这个问题,“快速交换”诞生了
这
里面有一个前提,也是能开发出“快速交换”的一个先提条件,那就是我们的数据一般都是以流的形式传播的,流,这个词十分形象,就是一串数据包都去往同一个
地方。当工程师发现了这个规律之后,“快速交换”的想法诞生了,所谓快速交换就是,先分析每个流的第一个包,按照进程交换的方式进行查询,然后出站同时把
这个查询的结果保存在一个独立的缓存中。当这个流中剩下的包进站时,路由器不是去查路由表而是去查缓存,这样就能节省CPU的资源,直接把包转发出去。这
样不但提高了包转发的速度,实际上也提高了CPU的使用效率。
最后就是CEF
思科的快速交换,CEF有太多的内容需要讲,相对于前两种交换方式有很大的不同,我在这里只取其在交换形式上的差别。进程交换是当一个新数据流来了后路由 第一个包,然后把信息记入缓存来对转发进行加速。而CEF的做法更绝!
连第一个包都不用查了,直接进行缓存操作!而且是在包之前就进行了缓存。
也就是大名鼎鼎的FIB表。
当一个数据包入站的时候,直接查询FIB表而不是路由表,这样就能大大增加转发的速度。
也
许你有疑问,我当初就是有疑问的,本来有好好的路由表,现在又建立了一个FIB表,一个数据包到了不还是需要查找吗?这样有什么作用?很显然现在一般的图
书上并没有写明原因,没有给我一个合理的解释。不过对于这个问题,以及对于CEF的专题讨论我会在下周的时候单独写一篇文章来叙述,让你明白CEF!
现在让我们尊重一个事实,CEF更快!
我用了大量的篇幅来写看似与本篇主题无关的“路由器交换”,我想告诉大家的是“加快交换,远离路由表”,CPU路由查询的次数越少转发的效率越高!
那么现在让我们回到本篇文章的主题“递归路由的查询”,强烈的困惑!人家查一次路由表都嫌多,你却使用递归查询查了那么多遍路由表!
确实,这就是递归查询的最大缺点!也是我们在设计网络的时候必须要考虑的一个问题。不过仔细想一下,既然这是一个极为“不成功”的方法,那么为什么还会允 许它的存在呢?这又是为了什么?
递归查询的优势!无与伦比的优势!
我们来看一下这个拓扑,注意一下SANDERZ的静态路由的设计。
这就是一个典型的递归路由的使用案例,可以仔细的看一下。
这里我们先设计一个情景,从显示的路由路由信息来看,现在到达右侧网段的所有数据都要从HEFFALUMP路由器通过,这个时候如果HEFFALUMP坏 了,那么必须要从WOOZLE进行路由。
这个时候网络管理员只需要调整一条路由就可以了。
Sanderz(config)# ip route 10.87.14.0 255.255.255.0 10.23.5.95
Sanderz(config)# no ip route 10.87.14.0 255.255.255.0 10.23.5.20
这样就完成了任务。
那么如果不使用递归路由呢?那么图中的每一个路由都要重新设置,如果按照上图的案例来说,我们需要重新写26条路由条目。如果你觉得这样的数量还能忍受,
那么如果有100个,400个网段呢?你要重写200条,800条路由!这个工作量就大了吧,你还能忍受吗?同样是400个网段,使用递归路由还是上面的
两条命令。
借用并改造算法中时间复杂度的概念:不使用递归路由的时间复杂度为O(n),而使用了递归路由的时间复杂度为O(1)!
这也就是递归路由最大的优点!
面对递归路由的优点与缺点,确实是很难办,是需要斟酌的。(这是《ROUTING TCP/IP VOL.1 》的说法)
不过我想其实并不是那么“难办”
从实际的网络应用来讲,现在能够使用静态路由的网络拓扑不会很大,相对于路由器CPU的处理能力来讲不是很大的负担,也就不会很影响速度,所以为了管理的 方便我们是可以放心的使用递归路由的。
但是,我这种说法并不包含 两个大的园区网之间用静态路由的情况(教育网),这样的情况还是使用最普通的路有方式吧。
具体情况具体分析,相必大家对与递归路由的优势和缺点也是很熟悉了,能够在其间取舍。
阅读(1902) | 评论(0) | 转发(0) |