[网络工程师]-路由算法

目录

1、静态路由算法

2、动态路由算法

2.1 距离矢量路由算法

2.1.1 工作原理

2.1.2 慢收敛问题

2.1.3 解决办法

2.1.4 特点

2.2 链路状态路由算法

2.2.1 工作原理

2.2.2 特点


        路由算法一般分为静态路由算法、动态路由算法,而动态路由算法包括距离矢量路由算法(例如RIP)、链路状态路由算法(例如OSPF)等。

1、静态路由算法

        静态路由是固定的(Fixed)或显式的(Explicit)非适应性路由。源和目标之间的路由在源节点事先决定的,不需要协议交互最新的网络状况,所有路由器中的路由表必须由管理员手工配置。此算法一旦确定,可保持一段时间不变,不再对网络的流量和拓扑变化做出反应,故也叫非自适应路由算法

        静态路由算法主要有最短路径算法:一般来讲,网络节点直接相连,传输时延也不是绝对最小,这与线路质量、网络节点“忙”与“闲”状态,节点处理能力等很多因素有关。定量分析中,常用“费用最小”作为网络节点之间选择依据,节点间的传输时延是决定费用的主要因素。

        最短路径法是由Dijkstra提出的,其基本思想是:将源节点网络中所有节点的最短通路都找出来,作为这个节点的路由表,当网络的拓扑结构不变、通信量平稳时,该点到网络内任何其他节点的最佳路径都在它的路由表中。如果每一个节点都生成和保存这样一张路由表,则整个网络通信都在最佳路径下进行。每个节点收到分组后,查表决定向那个后继节点转发。

2、动态路由算法

        在动态路由模式中,所有节点都参与路由选择,按照既定的准则确定最佳路由。这种路由模式称为跳到跳路由(Hop-by-Hop),比较适合尽力而为的报文转发服务。该算法又叫自适应路由算法

        准静态路由和动态路由都能适应于网络拓扑的变化,它们需要路由协议的支持。静态路由和动态路由可以在网络中并存,例如可以在边界网络配置静态路由,而骨干网络使用动态路由协议。

        提示:静态路由和动态路由之间的协调一般不是自动的,需要手工配置。

        动态路由协议中有一个重要的概念-收敛(Convergence)。如果网络中所有的路由器对某些网络前缀的可达性达成一致,则称为前缀收敛;如果网络中所有的前缀收敛,则网络收敛。路由协议的收敛性指的是通过该路由协议传递前缀的可达性信息并使其收敛。影响收敛的因素有很多,包括网络的规模、拓扑结构、路由方法及路由策略等。

2.1 距离矢量路由算法

        距离矢量(Distance-Vector,V-D)路由算法是基于Bellman-Ford的数学研究结果,因此有时也将该算法称为Bellman-Ford算法。V-D算法要求路由器之间周期地交换路由更新报文,路由更新报文中包含到所有目的网络的距离矢量。

2.1.1 工作原理

        V-D路由算法的工作原理就是邻居路由器之间定期交换距离矢量表。每当接收到邻居路由器发来的距离矢量表时,路由器重新计算到每个目的节点的距离,并更新路由表。

        距离矢量只包含到所有目的节点的距离,距离的度量单位可以是延迟、物理距离或其他参数。在V-D路由算法中,必须假定每个路由器都知道到邻居路由器的“距离”。如果度量标准是跳步数,则1跳表示的距离是1;如果度量标准是延迟,则路由器可以通过发送一个“回应请求(Echo Request)”报文,等待邻居路由器的“回应请求(Echo Reply)”回来后,测出它到路由器的延迟。

        V-D路由算法的工作原理是,每隔一段时间(通常以ms计算)邻居路由器之间交换距离矢量表,每个路由器根据各个邻居路由器报告的路由信息更新自己的路由表。

        如下图所示,假设某路由器Y从邻居路由器X收到一张距离矢量表,路由器X告诉Y它到路由器I的延迟是XI ms,而路由器Y知道它到X的延迟为t ms,则路由器Y就知道它通过路由器X到达路由器I的延迟是(XI+t)ms。同样的道理,路由器Y收到另一个邻居路由器Z发来的距离矢量表,路由器Z告诉Y它到路由器I的延迟是ZI ms,而路由器Y知道它到Z的延迟为r ms,则路由器Y就知道通过路由器Z到达路由器I的延迟是(ZI+r)ms。通过这样的计算,路由器Y就可以找到一条到达路由器I的延迟最短的路径,然后路由器Y就将该条路径记录在路由表中,同时更新距离矢量表。

                           

        为了更好地说明V-D路由算法的工作原理,来看一个例子。下图给出了某网络拓扑结构,在这个例子中,用延迟来作为“距离”的度量标准,并且假定网络中的每个路由器都知道其邻居路由器的延迟。

                   

 

        上述例子的更新过程如下图所示。前4列表示路由器J从邻居路由器A、I、H和K收到的距离矢量表。路由器A告诉J,它到B的延迟是12ms,到C的延迟为25ms,到D的延迟为40ms等等。同样的道理,路由器I、H和K都分别告诉路由器J它们到网络中每一个节点的延迟。

                 

        假定路由器J已经知道它到邻居路由器A、I、H和K的延迟分别为8ms、10ms、12ms和6ms。下面考察一下J怎样更新到路由器G的延迟。路由器J知道经A到G的延迟是38ms(因为A告诉J它到G的延迟是30ms,而J到A的延迟是8ms,因此J经过A到达G的延迟为30ms+8ms=38ms)。

        同样的道理,J可以计算出经过I、H、和K到G的延迟分别为27+10=37ms、10+12=22ms和41+6=47ms。比较这些延迟,J就知道经H到G的延迟最小为22ms,因而在J的新路由表中填充到G的延迟为22ms,输出线路为H。同时J更新它将要发给邻居路由器的距离矢量表,把到G的距离设为22ms,但是在距离矢量表中并没有指出是通过H到G的,这就会带来下面将要重点讨论的慢收敛问题。

        当然V-D算法刚开始工作的时候,每个路由器的距离矢量表中都是包含到每个邻居路由器的距离,而到其他非邻居路由器的距离都是无穷大。但是,随着时间的推移,邻居路由器之间不断地交换距离矢量表,于是每个路由器都能计算出到达其他路由器的最短距离了。

2.1.2 慢收敛问题

        所谓收敛是指网路中所有路由器对网络的可达性达成一致。在V-D路由算法中,存在慢收敛问题,为了说明这个问题,看下图所示例子(图中A、B、C、D和E为路由器,距离度量单位是跳数,而且图中的距离值都是针对以A为目的节点的)。

               

        假定刚开始时,A到B的线路不通,因此B、C、D和E到A的距离为∞。假设某时刻,A、B线路恢复了,则A会向B发送它的距离矢量表。经过第一次距离矢量表交换后,B收到A发来的距离矢量表,并且A告诉B它到A的距离是0,因此B就知道A可达,且B到A的距离为1。而此时,C、D和E到A的距离还是∞,也就是说,B、C和E都还不知道A、B的线路已经恢复了。

        第2次交换后,B会告诉C,它到A的距离为1,因此C知道通过B到A的距离为2;同时D会告诉C,它到A的距离为∞(即不可达);结果C在它的距离矢量表中填上到A的距离为2,输出线路是B。而此时D和E到A的距离还是∞。再经过第3次和第4次交换后,D和E都知道A的线路畅通了,都在自己的距离矢量表中填上最短距离和输出线路。

        很明显,A、B线路恢复通畅这样的“好消息”的传播是每交换一次距离矢量表往前推进一步。对于最长路径为N的网络,经过N次交换后,网络上的所有路由器都能知道线路恢复或路由器恢复的“好消息”,这就是所谓的好消息传播快。

        再来看下图所示的情况。假定刚开始时,所有的线路和路由器都是正常的,此时B、C、D和E到A的距离分别是1、2、3和4.

                

        突然间,A、B之间的线路断了。第一次距离矢量表交换后,B收不到A发来的距离矢量表,按理说就可以断定A是不可达的,应该在B的距离矢量表中将A的距离设为∞(如果B此时能按照此原理进行工作,也就不存在慢收敛的问题了)。遗憾的是,C会告诉B说:“别担心,我到A且距离为2(B并不能知道C到A的路径还要经过B本身,因为C通过距离矢量表告诉B到A的距离,但是C并没有告诉B它到A的2跳距离本身就是通过B。B可能会认为C可能还有其他路径到达A且距离为2)”,结果B就认为通过C可以达到A且距离为3.此时,B到A的路径是这样构成的:B->C,C->B,B->A,B和C之间存在路径环。但经过第1次交换后,D和E并不更新其对应于A的表项。

        第2次交换后,C注意到它的两个邻居B和D都声称有一条通往A的邻居,且距离为3,因此它可以任意选择一条邻居作为下一站,并将到A的距离设为4,此时B将它的无效路由又传递给C了。同样的道理,经过第三次、第四次交换后,B、C、D和E到A的距离会慢慢增加,当超过网络最大直径(最长距离)后,最终设为∞,即不可达。也就是说,B、C、D和E到底什么时候才能知道A是不可达的,取决于网络中对于无穷大的取值究竟是多少,这就是慢收敛问题(坏消息传播慢)。可以采用的方法之一是将∞设为网络的最长路径长度加1,一旦路由的距离度量达到这个值,就宣布该路由无效。对于上面的例子,由于网络的最长路径长度为4,因此,可以将∞设置为5,当B、C、D和E到A的距离计数值到5时,就可以认定A是不可达的,即宣布A不可达,因此有时也将上述问题称为计数到无穷问题。

2.1.3 解决办法

        对于慢收敛这个问题有几种不完善的解决方法。其中的一种方法是使用一个较小的数作为无穷大的近似值。例如,某网络的最大跳数不会超过16,因此可以选择16来表示无穷大。这样至少可以限制计数到无穷大所花费的时间。当然,如果网络中节点间距多余16跳时,就又会出现新的问题。

        (1)水平分割。其思想是任何一个节点并不把从它邻居路由器学到的路由再回送给那些邻居路由器,即当路由器从某个网络接口发送路由更新报文时,其中不能包含从该接口学到的路由信息。

        (2)毒性反转。使用毒性反转方法时,C仍然把来自B的达到A的路由信息回送给B,但在该距离矢量表中这一项的距离是无穷大以确保B不会使用C的路由即C把(A,∞)这一距离矢量发送给B。而且为了加强毒性反转的效果,最好同时使用触发更新(Trigged Update)技术,即一旦某节点检测到网络故障,就立即发送距离矢量表,而不必等到下一个周期。而其他路由器一旦发现路由表有更新,就立即发送距离矢量表。

        采用了毒性反转方法后,再来看看A、B线路断开后的路由交换情况。在第一次交换距离矢量表后,B发现直达A的线路断了,于是B就知道A不可达(B是通过在规定的时间之内没有收到A发来的距离矢量表来判断或者是B到A的线路出故障了,或者路由器A出故障了),而C此时报告给B它到A的距离是∞,由于B的两个邻居都到不了A,B就将它到A的距离设置为∞。第二层交换后,C也发现从它的两个邻居都到不了A,C也将A标为不可达。经过第三次、第四次交换后,D和E依次发现A是不可达的。

2.1.4 特点

        距离矢量路由算法是非常简单的算法,基于这种算法的路由协议(如RIP)容易配置、维护和使用。因此,它对于非常小的、几乎没有冗余路径且无严格性能要求的网络非常有用。

        距离矢量路由算法的最大问题是收敛慢,并且在收敛过程中,可能产生路由环路问题。有许多措施来防止这种情况发生,但是不能从根本上加以解决。

2.2 链路状态路由算法

        在V-D路由算法中产生慢收敛问题的本质原因是路由器不可能得到有关网络拓扑结构,因为V-D算法只在邻居路由器之间交换设为部分路由信息,也就是说,在V-D路由算法中,路由信息的交换是不充分的。因此必须引入一种全新的路由算法,这种算法就是链路状态(Link-State)路由算法,简称L-S路由算法。

2.2.1 工作原理

        L-S路由算法的基本工作过程如下:

        (1)路由器之间形成邻居关系。

                当某个路由器启动之后,要做的第一件事是知道它的邻居是谁,这可以通过向其邻居发送问候(Hello)报文来做到。

        (2)测量线路开销。

                链路状态路由算法要求每个路由器都知道它到邻居路由器的延迟。获得到邻居路由器延迟的最直接方式就是发送一个要求对方立即响应的特殊的Echo报文,通过计算来回延迟再除以2,就可以得到延迟估计值。如果想要得到更精确的结果,可以重发这一过程,再取平均值。

        (3)构造链路状态报文。

                一旦路由器获得所有邻居路由器的延迟,下一步就是构造链路状态报文。链路状态报文包含构造该报文的路由器标识,以及到每个邻居路由器的延迟。下图给出了某网络的拓扑结构,以及对应的6个链路状态报文。

                                

                      

                构造链路状态报文并不是意见困难的事情,难在何时构造这些报文。一种方法是定期进行;另一种方法是当网络出现大的变化时(如线路断开或重新连通、邻居路由器故障或恢复等情况)就构造新的链路状态报文。

        (4)广播链路状态报文。

                链路状态路由算法的最重要也是最具有技巧性的部分就是如何将链路状态报文可靠地广播到网络中的每一个路由器。

                完成链路状态报文广播的基本思想是利用扩散。由于扩散将导致网络中存在大量的重复报文,为了控制重复报文的数量,在每一个链路状态报文中加上一个序号,该序号在每次广播新的链路状态报文是加1.每个路由器记录它所接收过的链路状态报文中的信息对(源路由器,序号),当路由器接收到一个链路状态报文时,先查看一下该报文是否已接收过。将新接收的报文序号与路由器记录的最大序号进行比较,如果前者小于或等于后者,则说明该报文是重复报文,将其丢弃;否则该报文就是新的,应将它扩散到所有的输出线路上(除了接收该报文的线路外)。

                仅仅使用序号来控制重复报文会有问题,但这些问题是可以控制的。首先是序号的循环使用可能会导致序号冲突,解决的办法是使用32位的序号,这样即是是每秒钟广播一次链路状态报文,得花137年才能使计数循环回来,避免了发生冲突的可能性。其次,如果某路由器由于故障而崩溃了,当此路由器重新启动后,如果它的序号再从0开始,那么后面的链路状态报文可能会被其他路由器当作重复报文而丢弃。第三,如果链路状态报文在广播过程中序号出现错误,如将序号5变为1027(一位出错),那么序号为5到1027的报文将会被当成重复报文而丢弃,因为路由器认为当前的序号是1027,所有序号小于或等于1027的报文都认为是重复报文。

                为了解决重复报文这个难题,还可以在每个链路状态报文上加上生存期(Age)字段,且每隔1秒钟减1.当生存期变为0时,报文被丢弃。

                还可以对链路状态报文的广播过程作一些细微修改,使算法更强壮一些。如路由器接收到链路状态报文后,并不立即将它放入 输出队列进行排队等待转发,而是首先将它送到一个缓冲区等待一会儿。如果已有来自同一路由器的其他链路状态报文先行到达,则比较一下他们的序号。如果序号相等,丢弃任何一个重复报文;否则丢弃老的报文。为了防止因为路由器之间的线路故障而导致链路状态报文的丢失,所有的链路状态报文都要进行应答。一旦通信线路空闲,路由器就会循环扫描缓冲区以选择发送一个链路状态报文或者应答报文。

                对于上面的网络拓扑图,路由器B的报文缓冲区如下图所示:

                

                这里每一行对应于一个新到的但未完全处理完毕的链路状态报文。这张表记录了报文来自何处、报文的序号、生存期以及链路状态报文。另外,对应于B的每个邻居(到A、C和F)各有一个发送标志和应答标志。发送标志位用于标识必须将链路状态报文发送到该邻居,应答标志位用于标识必须给该邻居发送应答报文。在图中,A产生的链路状态报文可直接到达B,而B必须将此报文再扩散到C和F,同时B必须向A发送赢啊报文。类似的,F产生的链路状态报文到达B后,B必须向A和C进行转发,同时B向F发送应答报文。

                但是,对于来自E的报文就有所不同。假设B两次收到来自E的报文,一次经过EAB,另一次经过EFB。因此,B只需将E产生的链路状态报文发往C即可。但要向A和F发送应答报文。

                如果重复报文在前一个报文未出缓冲区时到达,表中的标志位就得进行修改。例如,当B还未处理完由C产生的链路状态报文,又接收到一个从F传来的C的状态报文时,此时应将C行的标志位由101010改为100011,表示要向F发送应答报文,而不必将C的链路状态报文再发向F。

 

        (5)计算最短路径。

                由于网络上的每个路由器都可以获得所有其他路由器的链路状态报文,每个路由器都可以构造出网络的拓扑结构图。此时路由器可以根据Dijkstra算法算出到所有目的节点的最短路径,并把计算结果填到路由器的路由表中。

2.2.2 特点

        链路状态路由算法使用事件(链路中断或路由器崩溃等事件)来驱动链路状态更新,而且当网络拓扑结构发生变化时能快速收敛。另外链路状态路由算法有良好的扩展性,能够运用于大规模网络中。但链路状态路由算法对链路带宽及路由器的处理能力和存储空间都要求比较高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

579YOU

对您有用的话给个鼓励吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值