发新话题
打印

这里有个好东冬:路由器算法

这里有个好东冬:路由器算法

路由协议的实现算法 (声明:摘自《计算机世界》)

路由协议

  路由协议(Routing Protocol)是路由器之间实现路由信息共享的一种机制,它允许路由器之间相互交换和维护各自的路由表。当一台路由器的路由表由于某种原因发生变化时,它需要及时地将这一变化通知与之相连接的其他路由器,以保证数据的正确传递。路由协议不承担网络上终端用户之间的数据传输任务。Cisco路由器中用于TCP/IP的路由协议包括RIP(路由信息协议,Routing Information Protocol)、IGRP(内部网关路由协议,Interior Gateway Routing Protocol)、OSPF(Open Shortest Path First)、NLSP(Netware链路服务协议,Netware Link Services Protocol)和EIGRP(增强IGRP)。

  在过去的几年里,因特网的规模以每年近100%的速度在增长,而因特网通信量的增长速度更高达每年400%。伴随着网络规模的不断扩大,路由器在沟通子网连接和实现信息交换方面的重要作用逐渐被人们所认知。但是,路由器究竟是如何交换信息的呢?

  本文主要介绍两种基本的路由算法,即距离向量法和链路状态算法。这里要注意的是,路由协议和路由算法只适用于动态路由。

距离向量法(Distance Vector Routing)

  在距离向量法中,相邻路由器之间周期性地相互交换各自的路由表备份。当网络拓扑结构发生变化时,路由器之间也将及时地相互通知有关变更信息。

图1 路由表传递示意

     在图1中,每一个路由器从与之直接相邻的路由器处获得对方的路由表。例如,路由器B从路由器A和C获得路由信息后,对自己的路由表进行加工,加工后的路由表再传送给路由器A和C。路由器通过这种方法不断地积累路由信息,直到最终收敛为止。

  1. 路由表的建立与更新

图2 路由表内容列表

  在图2中,有三个路由器:A、B和C。路由器A的两个网络接口E0和S0分别连接在10.1.0.0和10.2.0.0网段上;路由器B的两个网络接口S0和S1分别连接在10.2.0.0和10.3.0.0网段上;路由器C的网络接口S0和E0分别连接在10.3.0.0和10.4.0.0网段上。

  如图2中各路由器路由表的前两行所示,通过路由器的网络接口到与之直接相连的网段的网络连接,其向量距离设置为0。这即是最初的路由表。

  当路由器B和A以及B和C之间相互交换路由信息后,它们会更新各自的路由表。例如,路由器B通过网络端口S1收到路由器C的路由信息(10.3.0.0,S0,0)和(10.4.0.0,E0,0)后,在自己的路由表中增加一条(10.4.0.0,S1,1)路由信息。该信息表示: 通过路由器B的网络接口S1可以访问到10.4.0.0网段,其向量距离为1,该向量距离是在路由器C的基础上加1获得的。同样的道理,路由器B还会产生一条(10.1.0.0,S0,1)路由,这条路由是通过网络端口S0从路由器A获得的。如此反复,直到最终收敛,形成图2所示的路由表。
概括地说,距离向量算法要求每一个路由器把它的整个路由表发送给与它直接连接的其他路由器。路由表中的每一条记录都包括目标逻辑地址、相应的网络接口和该条路由的向量距离。当一个路由器从它的邻居处收到更新信息时,它会将更新信息与本身的路由表相比较。如果该路由器比较出一条新路由或是找到一条比当前路由更好的路由时,它会对路由表进行更新:将从该路由器到邻居之间的向量距离与更新信息中的向量距离相加作为新路由的向量距离。

  2. 收敛

  所谓收敛,是指直接或间接交换路由信息的一组路由器在网络的拓扑结构方面或者说在网络的路由信息方面达成一致。路由协议必须通过某种算法使各路由器尽快达到收敛状态。
要实现收敛,必须解决路由器之间的路由环路(Routing Loops)问题。下面比较直观地举例讲述路由环路问题的产生。

  假设在图2中,网络10.4.0.0发生故障,在网络发生故障前,路由器A、B、C的路由表已经收敛为图2的状态。

  网络发生故障后,路由器C检测到故障,停止通过接口E0向外发送数据包,并通过接口S0通知路由器B。在路由器A没有收到故障通知前,它仍然相信可以通过路由器B访问到10.4.0.0(路由器A路由表的最后一行),这条路径的距离为2。

  由于路由器B的路由表中指示有一条通往10.4.0.0的路径,因此,如果路由器B在收到路由器C的故障通知前将路由表发送到C,C会认为通过B可以访问10.4.0.0,并在此基础上修改自己的路由表,将路由表中第二条记录修改为(10.4.0.0,S0,2),其中S0表示通过接口S0可以访问10.4.0.0,其距离为2。

  这样一来,路由器A、B、C都认为通过其他的路由器存在着一条通往10.4.0.0的网络路径,结果导致目标地址为10.4.0.0的数据包在这三个路由器之间来回地传递,从而造成一条路由环路。

  一般地,人们采用4种方法解决路由环路问题。

  (1) 水平分割(split horizon)

图3 路由内容选择示意

  这种方法规定,路由器必须有选择地将路由表中的路由信息发送给相邻的其他路由器,而不是发送整个路由表。具体地说,即一条路由信息不会被发送给该信息的来源方向。这里仍以图2为例。图3是图2中路由器B的路由表,通过图3中的注释我们可以看到,每一条路由信息都不通过该条路由信息中所指的网络端口向外发送。这样就可以避免路由环路的产生。

(2) 定义一个最大值

  定义一个向量距离的最大值,可以在一定程度上防止形成路由环路,例如RIP协议定义Hop Count的最大值为16。使用这种方法,路由协议在向量距离超过协议允许的最大值前,允许路由环路的存在,一旦路由信息的向量距离超过规定的最大值,该路由信息将被标记为不可到达。

  与此相关的另外一个概念是TTL(Time To Live)。TTL是一个包含在数据包中的参数,数据包每经过一次路由器的路由处理,TTL值减1,当TTL值等于0时,路由器将放弃对该数据包的处理,这样会避免数据包在某个环路中无休止的传递。

      

TOP

这种土文章就不要发表了      

TOP

人家也是好意,不要打消积极性,不是每个人都知道这些的      

TOP

发新话题