路由选择算法 LS DV

一、全局式路由选择算法

以所有结点之间的连通性及所有链路的费用为输入。链路状态算法LS。

二、分散式路由选择算法

以迭代、分布式的方式计算出最低费用路径。没有结点有关于所有网络链路费用的完整信息,每个结点仅有与其直接相连的链路的费用知识即可开始工作。然后通过迭代计算过程并与相邻结点交换信息,一个结点逐渐计算出到达某目的节点或一组目的结点的最低费用路径。距离向量算法DV。

链路状态路由选择算法LS

网络拓扑和所有链路费用都是已知的,可用作LS算法输入。实践中通过让每个结点向网络中所欲其他结点广播链路状态分组来完成,其中每个链路状态分组包含它所连接的链路的特征和费用。实践中(例如使用OSPF路由选择协议),经常由链路状态广播算法来完成。

ls算法的步骤流程

1、确认在物理上与之相连的路由器并获得它们的IP地址。当一个路由器开始工作后,它首先向整个网络发送一个“HELLO”分组数据包。每个接收到数据包的路由器都将返回一条消息,其中包含它自身的IP地址。

2、测量相邻路由器的延时(或者其他重要的网络参数,比如平均流量)。为做到这一点,路由器向整个网络发送响应分组数据包。每个接收到数据包的路由器返回一个应答分组数据包。将路程往返时间除以2,路由器便可以计算出延时。(路程往返时间是网络当前延迟的量度,通过一个分组数据包从远程主机返回的时间来测量。)该时间包括了传输和处理两部分的时间——也就是将分组数据包发送到目的地的时间以及接收方处理分组数据包和应答的时间。

3、向网络中的其他路由器广播自己的信息,同时也接收其他路由器的信息。 
在这一步中,所有的路由器共享它们的知识并且将自身的信息广播给其他每一个路由器。这样,每一个路由器都能够知道网络的结构以及状态。

4、使用一个合适的算法,确定网络中两个节点之间的最佳路由。 
在这一步中,路由器选择通往每一个节点的最佳路由。它们使用一个算法来实现这一点,如Dijkstra最短路径算法。在这个算法中,一个路由器通过收集到的其他路由器的信息,建立一个网络图。这个图描述网络中的路由器的位置以及它们之间的链接关系。每个链接都有一个数字标注,称为权值或成本。这个数字是延时和平均流量的函数,有时它仅仅表示节点间的跃点数。例如,如果一个节点与目的地之间有两条链路,路由器将选择权值最低的链路。

Dijkstra算法点击打开链接

Dijkstra算法执行下列步骤:

1、路由器建立一张网络图,并且确定源节点和目的节点,在这个例子里我们设为V1和V2。然后路由器建立一个矩阵,称为“邻接矩阵”。在这个矩阵中,各矩阵元素表示权值。例如,[i, j]是节点Vi与Vj之间的链路权值。如果节点Vi与Vj之间没有链路直接相连,它们的权值设为“无穷大”。 
2、路由器为网路中的每一个节点建立一组状态记录。此记录包括三个字段: 
前序字段——表示当前节点之前的节点。 
长度字段——表示从源节点到当前节点的权值之和。 
标号字段——表示节点的状态。每个节点都处于一个状态模式:“永久”或“暂时”。 
3、路由器初始化(所有节点的)状态记录集参数,将它们的长度设为“无穷大”,标号设为“暂时”。 
4、路由器设置一个T节点。例如,如果设V1是源T节点,路由器将V1的标号更改为“永久”。当一个标号更改为“永久”后,它将不再改变。一个T节点仅仅是一个代理而已。 
5、路由器更新与源T节点直接相连的所有暂时性节点的状态记录集。 
6、路由器在所有的暂时性节点中选择距离V1的权值最低的节点。这个节点将是新的T节点。 
7、如果这个节点不是V2(目的节点),路由器则返回到步骤5。 
8、如果节点是V2,路由器则向前回溯,将它的前序节点从状态记录集中提取出来,如此循环,直到提取到V1为止。这个节点列表便是从V1到V2的最佳路由。

距离向量路由选择算法DV

分布式的,因为每个结点都要从一个或多个直接相连邻居接收某些信息,执行计算,然后将其计算结果分发给邻居;迭代的,此过程一直要持续到邻居之间无更多信息要交换为止;异步的,不要求所有结点相互之间步伐一致地操作。

请参考

7.5.3  距离矢量路由算法

    现代计算机网络通常使用动态路由算法,因为这类算法能够适应网络的拓扑和流量变化,其中最流行的两种动态路由算法是“距离矢量路由算法”和“链路状态路由算法”。

    距离矢量路由算法Distance Vector RoutingDVARPANET网络上最早使用的路由算法,也称Bellman-Ford路由算法和Ford-Fulkerson算法,主要在RIPRoute Information Protocol)协议中使用。CiscoIGRPEIGRP路由协议也是采用DV这种路由算法的。

    “距离矢量路由算法”的基本思想如下:每个路由器维护一个距离矢量(通常是以延时是作变量的)表,然后通过相邻路由器之间的距离矢量通告进行距离矢量表的更新。每个距离矢量表项包括两部分:到达目的结点的最佳输出线路,和到达目的结点所需时间或距离,通信子网中的其它每个路由器在表中占据一个表项,并作为该表项的索引。每隔一段时间,路由器会向所有邻居结点发送它到每个目的结点的距离表,同时它也接收每个邻居结点发来的距离表。这样以此类推,经过一段时间后便可将网络中各路由器所获得的距离矢量信息在各路由器上统一起来,这样各路由器只需要查看这个距离矢量表就可以为不同来源分组找到一条最佳的路由。

    现假定用延时作为距离的度量,举一个简单的例子,如图7-37所示。假设某个时候路由器Y收到其邻居路由器X的距离矢量,其中mY估计到达路由器X的延时。若Y路由器知道它到邻居Z的延时为n,那么它可以得知Z通过Y到达X需要花费时间m+n。如果Z路由器还有其他相邻路由器,则对于从其他每个邻居那儿收到的距离矢量,该路由器执行同样的计算,最后从中选择费时最小的路由作为Z去往X的最佳路由,然后更新其路由表,并通告给其邻居路由器。

7-37  距离矢量路由算法简单实例

    现以一个如图7-38所示的示例介绍距离矢量算法中的路由的确定流程,各段链路的延时均已在图中标注。ABCDE代表五个路由器,假设路由表的传递方向为:A → B → C → D → E(这与路由器启动的先后次序有关)。下面具体的流程。 

   (1)初始状态下,各路由器都只收集直接相连的链路的延时信息,各路由器结点得出各自的初始矢量表如图7-39所示。因为各结点间还没有交换路由信息,所以它们的初始状态的路由表也如它们的矢量表。 

 

图7-38 距离矢量算法路由确定示例

图7-39 初始状态下各结点的矢量表

   (2) 现在路由器A把它的路由表发给路由器B。此时它会综合从A路由器发来的路由表和它自己的初始路由表,更新为一个新的矢量表,如图7-40左图所示(最终的矢量表如图中深颜色部分)。从图中可以看出,从B结点到达E结点此时存在两条路径,一条是直达的,一条是通过A结点到达的。而且这两条线的开销不同,经过A结点到达E结点的开销(7)比直达线路的开销(8)更低,所以最终在形成的路由表中,把到达E结点的线路改为经由A结点这条线路,如图7-40右图所示。

图7-40  B结点新的矢量表和路由表

   (3B再把最终形成的路由表发给路由器C。同样,路由器C也要把它原来的初始路由表与从B路由器发来的路由表进行综合,形成新的矢量表,如图7-41左图所示(最终的矢量表如图中深颜色部分)。在新的矢量表中,除了最初的直接连接的BD结点间的矢量外,还新收集了到达AE结点的矢量信息。因为C结点没有与AE结点的直接连接,在初始路由表中并没有到达这两个结点的路由信息,所以现在只有采用从B路由器发来的路由表中,经过B结点到达AE结点的路径。

    这里要注意一点,因为在B结点路由表中就已识别了直接通过B结点到达E结点的开销(8)还比依次通过BA结点到达E结点的开销(7)大,所以在C结点路由表中是采用依次通过BA结点到达E结点这条路径。最终形成的路由表如图7-41右图所示。

第二行为C改为B

图7-41  C结点新的矢量表和路由表

  (4)路由器 C再把它的最终路由表发给路由器D。同样,路由器D也要把它原来的初始路由表与从C路由器发来的路由表进行综合,形成新的矢量表,如图7-42左图所示(最终的矢量表如图中深颜色部分)。在新的矢量表中,除了最初的直接连接的CE结点间的矢量信息外,还新收集了到达AB结点的矢量信息。因为D结点没有与AB结点的直接连接,所以在其最初的路由表中并没有到达这两个结点的矢量信息,此时仍采用经过C结点到达AB结点的路径。

   在这里同样要注意一点,从D结点到达E结点也有两条路径:一是直接到达,二是依次通过CBA结点到达,经过比较发现直接连接到达的开销(2)要比通过CBA结点到达E结点路径的开销(10)要小,所以在D结点中,到达E结点是采用直接连接这条线路。最终形成的路由表如图7-42右图所示。

   (5)路由器 D再把它的最终路由表发给路由器E。同样,路由器E也要把它原来的初始路由表与从D路由器发来的路由表进行综合,形成新的矢量表,如图7-43左图所示(最终的矢量表如图中深颜色部分)。在新的矢量表中,除了最初的直接连接的ABD结点间的矢量外,还新收集了到达C结点的矢量信息,因为E结点没有与C结点的直接连接。此时仍采用经过D结点到达C结点的路径。

 

图7-42  D结点新的矢量表和路由表

   在这里有两个要注意的地方:一是从E结点到达A结点的路径问题,因为此时E结点与A结点是直接连接的,而且其开销(1)要比原来从D路由口器发来的路由表中提供的通过DCB结点到达A结点路径开销(11)要小,所以在最终的E结点路由表中,到达A结点是采用直接连接这条线路。二是E结点虽然也是与B结点直接连接,但它的开销(8)还要比原来从D路由器发来的路由表中提供的依次经过DC这两个结点到达B结点的开销(5)大,所以在最终的E结点路由表中,到达B结点是采用依次经过DC两个结点这条路径。最终形成的路由表如图7-43右图所示。

 

图7-43  E结点新的矢量表和路由表

    通过以上步骤,网络中各路由器就完整了整个路由表的确定,当然在拓扑结构发生变化时,各路由器的路由表又会发生变化,重新进行更新。

点击打开链接

选路环路(routing loop)和计数到无穷(count-to-infinity)


当某条链接的费用减少时,我们称之为有一个“好消息”。在网络中,好消息的传递往往很迅速。
例如,存在这样一个网络:
某一时刻,Y检测到它到X的链路费用由4减少为1,好消息当然要告诉大家了,于是它更新了自己的距离向量,并通知了Z。Z在收到Y的更新报文后,也更新了自己的距离向量(由5减为2),并向邻居们发送更新报文。而后,Y又收到了Z的更新报文,但它发现并没有改变自己的最低费用,于是保持不变。这样,仅仅经过了两次迭代网络就达到了静止。好消息通过网络得到了迅速传播。

但是,当链路费用增加(甚至断开)时,就不会这么简单了。
我们看下面这个例子:
还是X、Y、Z三个节点。此时Y检测到它到X的路径费用由4增加到了60。此时节点Z的距离向量为:d(X) = 5, d(Y) = 1, d(Z) = 0。于是Y在更新向量时发现,咦,Z到X的距离只有5诶,那可以先到Z再到X,于是Y的距离向量更新为:d(x) = 5 + 1 = 6, d(Y) = 0, d(z) = 1。我们可以发现,这个逻辑显然是错误的,因为Z到X的距离为5的前提是要经过Y,但Y更新后的路径又要经过Z,这就形成了一个选路环路(routing-loop)问题。因为Y的距离向量更新了(虽然是错误的),但它还是向Z发送了更新报文。Z收到更新报文后,比较了下邻居们到X的距离,发现经过Y的路径距离为1 + 6 = 7,小于直接到X的距离,于是Z也更新的自己的距离向量,然后又将更新后的距离向量发给Y。Y收到后又更新向量为8,然后再发给Z。。。这样循环往复,更新报文在Y和Z之间传来传去,直到第44次迭代后,Z算出它经由Y的路径费用大于50为止。此时,Z最终确定到X的最短路径费用是直接到达X的费用50,而Y也得到了最短路径是经Z到X的费用51。
可以看出,虽然最后还是得到了正确的信息(最后的50和51是正确的!),但坏消息的传播与好消息相比实在是慢太多了!而且,如果X和Y之间的费用为10000,Z和X的费用是9999时,就会出现计数到无穷(count-to-infinity)的问题!

毒性逆转方法(The Reverse-Poison(Split-horizon) Hack)


上述的选路环路问题可以通过毒性逆转的技术加以避免。它的基本思想是:如果Z的最短路径要通过邻居Y,那么它将告诉Y自己到目的节点的距离是∞。这样,Z向Y撒了一个善意的谎言,使得只要Z经过Y选路到X,它就会一直持续讲述这个谎言,这样Y也就永远不会尝试从Z选路到X了,也就避免了环路问题。(可见,有时善意的谎言也不是件坏事,也是为了你好啊T^T)
我们将毒性逆转技术应用于上例。Y在更新自己的距离向量时,发现Z到X的距离是∞,于是它将d(x)无奈地更新为60,并向Z发送了更新报文。Z收到报文后更新自己的d(X)为50(直接选路到X),并发给Y更新报文(此时因为Z不需要经过Y进行选路,因此将告诉Y自己到X的距离为50)。Y在接收到Z的报文后,重新将距离更新为1 + 50 = 51,并告诉Z自己到X的距离是∞(实际是51)。Z收到报文后,发现最低耗费并没有改变,因此算法进入静止状态。

但是,当涉及3个或更多节点(而不仅仅是两个直接相连的邻居节点)的环路将不能被毒性逆转技术检测到,如下例:

当C和D之间的连接断开时,依次发生如下事件:
  1. A收到来自C的坏消息,然后将选择从B到达D
  2. A向C发送更新报文
  3. C向B发送更新报文
这种问题出现的原因是,A和B无法同时收到来自C的更新报文然后更新自己的距离向量。比如这里,B与A相比得到的更新报文时间要晚,这就给A造成了“错觉”,在A看来,虽然从C到不了D,但是选B也可以。然后它又把这个错误的好消息告诉了C,让C也以为自己又和D团聚了。最后,终于想到忽略了B,又发送了报文给B。这样,A、B、C都以为自己和D联系上了!但实际上D和它们已经隔离了。。。


点击打开链接

LS算法和DV算法,这两种算法各有特点,分述如下。

1、工作原理的不同。LS算法中,网络拓扑和所有的链路费用都是已知的,也就是说可用来做LS算法的输入。在实践中,这是通过让每个节点向网络中所有其他路由器广播状态分组来完成,其中每个链路分组包含它所连接的链路的特征和费用,这经常用链路广播算法来完成。节点广播的结果是所有节点具有了该网络的同一个以及完整的视图。于是每个节点都可像其他节点一样,运行LS算法并计算相同的最低费用路径集。在此算法中,每个节点经广播于所有其他节点交谈。DV算法中,每个节点仅与他的直接邻居交谈,但它为他的邻居提供了从其自己到网络中所有其他节点的最低费用。DV算法要求每个路由器都要向其他邻接的路由器发布一个距离向量,距离向量是该路由器到其他已知的各网络的相对距离。通告内容基本上是告诉其邻接的路由器:你可以通过我到达网络X,距离是Y。从本地路由器到X的有效距离等于该路由器从各邻接路由器接收到的最短距离,再加上他与该邻接路由器之间的链路距离。
2、算法结构不同。显然LS算法是一种全局信息的算法,而DV算法是一种迭代的,异步的和分布式的算法。说它是分布式的,是因为每个节点都要从一个或多个直接相连邻居接受某些信息,执行计算,然后将计算结果发回给邻居。说它是迭代的,是因为此过程一直要持续到邻居之间没有更多要交换的信息为之。说该算法是异步的,是因为他不要求所有节点相互之间锁步,即步伐一致的工作。
3、时间复杂性。考虑LS算法,即给定n个节点,考虑最坏情况下需要经多少次计算才能找到从源节点到所目的节点的最低费用呢。在第一次迭代时,我们需要搜索所有的n个节点已确定出节点w,w不在N’中且具有最低费用。第二次我们需要检查所有的n-1个节点已确定最低费用,第三次,需要检查n-2个节点,依此类推。因此,我们在所有迭代中需检索n+(n-1)+(n-2)+…+1=n(n+1)/2个节点。所以我们可以得出LS算法在最差情况下的时间复杂度为n的平方阶。考虑DV算法,它存在对好消息的反应迅速,但对坏消息却反应迟钝。特别是对坏消息存在计数无穷大问题。当链路的权值变化很大时,它的时间复杂性也就很难确定了。
4、报文复杂性。LS算法要求每个节点知道网络中每条链路的费用。这就要发送○(|N||E|)个报文。DV算法要求在每次迭代时,在两个直接相连的邻居之间交换报文。在链路费用改变时,DV算法仅当在新费用导致与该链路相连节点的最低费用路径发生改变时,才传播以改变的链路费用。
5、收敛速度。收敛是路由算法选择时所遇到的一个重要问题。收敛时间是指从网络的拓扑结构发生变化到网络上所有的相关路由器都得知这一变化,并且相应地做出改变所需要的时间。这一时间越短,网络变化对全网的扰动就越小。收敛时间过长会导致路由循环的出现。LS在直接相连的路由之间维护正常的邻居关系。这允许路由更快收敛。链路状态路由协议在会话期间通过交换Hello包(也叫链路状态信息)创建对等关系,这种关系加速了路由的收敛。而DV算法收敛较慢,且在收敛过程中会遇到选路环路。DV算法还会遭到计数无穷大的问题。
6、跳数的限制。DV使用跳数或向量来确定从一个设备到另一个设备的距离。不考虑每跳链路的速率。LS没有跳数的限制,使用“图形理论”算法或最短路径优先算法。
7、路由表的更新。DV算法根据相邻节点的路由信息更新自己的路由表。LS算法,每个节点都有一个全局的拓扑结构,根据此拓扑结构计算路由表。不像DV那样,更新时发送整个路由表。DV的这种特性随着路由表的增大,需要消耗更多的CPU资源,并消耗了内存。LS只广播更新的或改变的网络拓扑,这使得更新信息更小,节省了带宽和CPU利用率。另外,如果网络不发生变化,更新包只在特定的时间内发出(通常为30min到2h)。
8、健壮性。如果一台路由器发生故障,行为错乱或受到破坏时情况会怎样呢?对于LS算法,路由器能够像其连接的的一条链路广播不正确费用。一个节点也可损坏或丢弃他收到的任何LS广播分组作为LS广播的一部分。但是一个LS节点仅计算自己的转发表:其他节点为自己做类似的计算。这就意味这在LS算法下,路由计算是有些孤立的,提供了一定程度的健壮性。在DV算法下,一个节点可向任意或所有的目的节点通告其不正确的最低费用路径。DV算法中一个不正确的节点计算值会扩散到整个网络。
9、可扩展性。DV算法可扩展性差。相对而言,LS算法可扩展性好,可靠。
10、环路。尽管最基本的DV协议描述和实现起来非常简单,但是会导致网络中的最短通路树在短时间内出现环路。一个基于DV的网络路由可能需要花费几十秒到几分钟才能汇聚到一个无环路的拓扑。如果本地路由器对于本地链路以外的网络属性只能掌握一些二手的,已被解释过的信息,那么在任何一种这样的方案中低速汇聚都是一种跟本的局限性。LS协议,虽然与DV协议相比较,即便是对于最基本的形式,它的描述和实现都是很复杂的,但它有一个优点,当链路状态发生变化时,在变化的信息传播到网络中以后,我们立即就可以得到不存在环路的最短通路树


猜你喜欢

转载自blog.csdn.net/qq_22238021/article/details/80496138
dv
ls