这部分内容以选择和填空题较多,如2019年10月 20题
又如2019年4月 30题
答:
共分为两大类:
一、全局式路由选择算法
以所有结点之间的连通性及所有链路的费用为输入。链路状态算法LS。
二、分布式路由选择算法
以迭代、分布式的方式计算出最低费用路径。没有结点有关于所有网络链路费用的完整信息,每个结点仅有与其直接相连的链路的费用知识即可开始工作。然后通过迭代计算过程并与相邻结点交换信息,一个结点逐渐计算出到达某目的节点或一组目的结点的最低费用路径。距离向量算法DV。
了解以上这些,对于考试而言就足够了,但这部分其实还是挺有用的,所以多记录了下。
链路状态路由选择算法LS
实践中(用OSPF路由选择协议),经常由链路状态广播算法来完成。
ls算法的步骤流程
1、确认在物理上与之相连的路由器并获得它们的IP地址。当一个路由器开始工作后,它首先向整个网络发送一个“HELLO”分组数据包。每个接收到数据包的路由器都将返回一条消息,其中包含它自身的IP地址。
2、测量相邻路由器的延时(或者其他重要的网络参数,比如平均流量)。为做到这一点,路由器向整个网络发送响应分组数据包。每个接收到数据包的路由器返回一个应答分组数据包。将路程往返时间除以2,路由器便可以计算出延时。(路程往返时间是网络当前延迟的量度,通过一个分组数据包从远程主机返回的时间来测量。)该时间包括了传输和处理两部分的时间——也就是将分组数据包发送到目的地的时间以及接收方处理分组数据包和应答的时间。
3、向网络中的其他路由器广播自己的信息,同时也接收其他路由器的信息。
在这一步中,所有的路由器共享它们的知识并且将自身的信息广播给其他每一个路由器。这样,每一个路由器都能够知道网络的结构以及状态。
4、使用一个合适的算法,确定网络中两个节点之间的最佳路由。
在这一步中,路由器选择通往每一个节点的最佳路由。它们使用一个算法来实现这一点,如Dijkstra最短路径算法。在这个算法中,一个路由器通过收集到的其他路由器的信息,建立一个网络图。这个图描述网络中的路由器的位置以及它们之间的链接关系。每个链接都有一个数字标注,称为权值或成本。这个数字是延时和平均流量的函数,有时它仅仅表示节点间的跃点数。例如,如果一个节点与目的地之间有两条链路,路由器将选择权值最低的链路。详见自已的算法《迪科斯特算法》
距离向量路由选择算法DV
计算机网络通常使用动态路由算法,因为这类算法能够适应网络的拓扑和流量变化。
距离矢量路由算法”的基本思想如下:每个路由器维护一个距离矢量(通常是以延时是作变量的)表,然后通过相邻路由器之间的距离矢量通告进行距离矢量表的更新。每个距离矢量表项包括两部分:到达目的结点的最佳输出线路,和到达目的结点所需时间或距离,通信子网中的其它每个路由器在表中占据一个表项,并作为该表项的索引。每隔一段时间,路由器会向所有邻居结点发送它到每个目的结点的距离表,同时它也接收每个邻居结点发来的距离表。这样以此类推,经过一段时间后便可将网络中各路由器所获得的距离矢量信息在各路由器上统一起来,这样各路由器只需要查看这个距离矢量表就可以为不同来源分组找到一条最佳的路由。
现假定用延时作为距离的度量,举一个简单的例子,如图7-37所示。假设某个时候路由器Y收到其邻居路由器X的距离矢量,其中m是Y估计到达路由器X的延时。若Y路由器知道它到邻居Z的延时为n,那么它可以得知Z通过Y到达X需要花费时间m+n。如果Z路由器还有其他相邻路由器,则对于从其他每个邻居那儿收到的距离矢量,该路由器执行同样的计算,最后从中选择费时最小的路由作为Z去往X的最佳路由,然后更新其路由表,并通告给其邻居路由器。
图7-37 距离矢量路由算法简单实例
选路环路(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(此时Z还没有更新,所以还是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(环路形成后的Y的向量) = 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了,也就避免了环路问题。
我们将毒性逆转技术应用于上例。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收到报文后,发现最低耗费并没有改变,因此算法进入静止状态。
LS算法和DV算法的比较:
- 报文复杂性
LS 算法要求每个结点都知道网络中每条链路的费用,要发送O(|N|*|E|)个报文。而且无论何时一条链路的费用改变时,必
须向所有结点发送新的链路费用。
DV算法要求在每次迭代时,在两个直接相连邻居之间交换报文。当链路费用改变时,DV 算法仅当在新的链路费用导致与该链路相连结点的最低费用路径发生改变时,才传播已改变的链路费用。
- 收敛速度
LS算法的实现是一个要求O(|N|*|E|)个报文的O(|N|^2)算法。
DV 算法收敛较慢,且在收敛时会遇到路由选择环路,还会遭遇无穷计数的问题。
- 健壮性。
如果一台路由器发生故障、行为错乱或受到破坏时
LS算法:路由器能够向其连接的一条链路广播不正确费用。作为LS广播的一部分,一个结点也可损坏或丢弃它收到的任何LS广播分组。但是每个LS结点都仅计算自己的转发表。因此路由计算在某种程度上是分离的,提供了一定程度的健壮性。
DV算法:一个结点可向任意或所有目的结点通告其不正确的最低费用路径。因此一个不正确的结点计算值会扩散到整个网络。