本文讲述路由算法中的链路状态路由,链路状态路由的核心算法是Dijkstra算法,本文也会详细描述
1979年以前ARPANET(Advanced Research Project Agency)一直使用的是距离矢量路由算法,但是在此之后便改为使用链路状态路由算法。当今,链路状态路由算法的变种算法——IS-IS(Intermediate System-Intermediate System)还有OSPF成为了使用最为广泛的路由算法。
链路路由算法分为下列5步:
(1)每个路由器发现它的邻居节点,并了解邻居节点的网络地址
(2)设置到每个邻居节点的距离或者成本度量值
(3)构造一个包含所有获得的链路向信息包
(4)将这个链路信息包发送给网络中其他路由器,同时也接受其他路由器发送过来的链路信息包
(5)计算出到其他路由器的最短路径(这一步就会使用到核心算法Dijkstra算法)
下面将具体介绍每一步的细节:
1、发现邻居:
当一个路由器启动时,路由器会找出哪些路由器是它的邻居。实现这个的方法就是在每一条点到点线路上发送一个特殊的HELLO数据包。然后线路的另外一个路由器做出一个答复。
2、设置链路成本:
一种常用的方法就是使成本和链路带宽成反比,越高带宽的成本越低,这样可以使高容量的路径成为路由器更好的选择。如果网络是在地理上分散的,那么可以将延迟作为成本的组成部分,延迟高的成本也高,这样可以找出延迟最低的路径。
3、构造链路状态包:
状态包中包括了这些内容:发送方的标识符,序号,年龄,邻居列表。
4、分发链路状态包:
路由器将会进行记录,如果是个新的数据包,那么就转发它,如果是个重复的数据包,就丢弃,如果数据报的序号小于当前所看到的最大的序号,那么就当做过时的数据包而拒绝接受。
5、计算新路由:
每条链路可能被表示了两次,每个方向可能不同。也就是说实际情况中,A到B的和B到A的最短路径可能是不同的。这里将要详细介绍下当每个路由器收到了链路状态包之后怎么去计算到网络中其他路由器的最短路径(Dijkstra算法):
Dijkstra算法是一种迭代算法,它的性质是经过算法的第K次迭代之后,可以知道到K个目的结点的最低费用路径。我们先定义下列符号,目的是为了更好地理解算法的内容:
D(v):到算法的本次迭代,从源节点到目的结点v的最低费用路径的费用
p(v):从源结点到目的结点v的最短路径中倒数第二个结点(也就是v结点之前的结点)
N ' :结点子集,如果从源节点到某个结点的最低费用路径已经确认,那么这个结点就应该添加到N '中
下面就用伪代码描述下Dijkstra算法的具体实现,该算法由一个初始化步骤和后面的循环组成。循环的次数和网络中的结点个数相同。
// Initialization N ' = {u} for all nodes v if v is a neighbor of v then D(v) = c(u,v) else D(v) = max // Loop find w not in N ' and D(w) is a minium add w to N ' update D(v) for each neighbor v of w and v is not in N ' D(v) = min( D(v) , D(w) + D(w,v) ) until N ' = N