《OSPF中的最短路径算法》由会员分享,可在线阅读,更多相关《OSPF中的最短路径算法(8页珍藏版)》请在金锄头文库上搜索。
1、OSPF中的最短路径算法测试中心 陈旭盛现实生活中的网络拓扑,可以抽象成由节点(路由器)和边(路由器之间的链路)构成的有向连通图,链路的代价可以抽象成边的权函数。之所以称图为有向图,是因为同一条链路(边)不同方向的权值可能不一样。我们知道,对于有向连通图,以任意一个节点为起点,利用最短路径算法可以计算出到其他节点的最短路径。那么,对于能抽象成有向连通图的网络拓扑来说,也可以利用最短路径算法先计算出以任意一台路由器为起点,到达其他路由器的最短路径,然后根据各路由器的网络连接情况可以得到到各个网络的路由路径。OSPF中用到的Dijkstra算法和RIP中用到的距离向量算法一样,都是相当经典的最短路
2、径算法。本文将对Dijkstra算法进行系统的描述,并给出一个简洁的证明。1 Dijkstra 算法介绍算法介绍在数学上,以某个节点为起点,计算到其他节点的最短路径的算法,称为“单源最短路径” 算法。求“单源最短路径”的问题在数学上可以精确描述如下:“单源最短路径单源最短路径” 问题:问题:已知一个有n个节点(V0.n)构成的有向连通图G(V,E),以及图中边的权函数C (E),其中V代表节点集合,E表示所有边的集合,并假设所有权非负,求由G中指定节点V0到其他各个节点的最短路径。Dijkstra算法是很经典的求解上述问题的算法,其基本想法是设计一种最短路径树的构造方法,按非降次序逐条构造从V
3、0到各个节点的最短路径,第一步找到和V0相距最短的节点以及到这个节点的路径,第二步找到和V0相距次短的节点以及到这个节点的路径,如此反复,最后找到V0到所有节点的最短路径,构造出整棵最短路径树。对上述构造方法的一个直观考虑是:和V0相距最短的节点应该在和V0直接相邻的节点中,和V0相距次短的节点要么在和V0直接相邻的节点中,要么在和这些相邻节点相邻的节点中,如此逐步扩散考虑,应该就可以找到和V0相距最短、次短、.第n短的节点以及对应的路径,而且因为是连通图,最后肯定所有节点都能全部考虑到,也就能完成整棵最短路径树的构造。事实上,上述直观考虑是对的,Dijkstra算法是对上述过程的一个提炼和优
4、化:和V0相距最短的节点是和V0直接相连的节点没错;相距次短的节点范围可以缩小为,和V0直接相邻的节点,加上跟刚选中的最短节点直接相邻的节点;相距第三短的节点的范围可以类推得到,即在上一步考察的节点的基础上,加上和次短节点直接相邻的节点。如此逐步构造,可以按非降次序找到到所有节点的最短路径。为了从数学上精确描述上述构造过程,引入了集合的概念对节点和路径进行分类。我们把节点分成两个集合:A:已经选入最短路径树的节点的集合。B:剩余的其他节点的集合。对于路径,我们分成三个集合:I:已经选入最短路径树的路径的集合II:候选路径集合:下一条加入最短路径树的路径将从这个集合中选入。III:剩余的其他路径
5、的集合(被废弃的路径或者还未考虑的路径)。为了更好的理解,有必要对这里的路径定义进行一下强调:路径是指以V0为起点,其他节点为终点的由一条或多条边组成的一个有序集。边,可以理解为路径中的一段,只有到和V0直接相邻的节点的路径才直接对应一条边。从V0到所有节点,都可能存在一条或多条路径,非最短路径在计算过程中将会被废弃,放入集合III。从前面的描述中可以明显看出,Dijkstra算法是一个递归构造过程,因为任何递归都必须有明确的初始状态,所以我们有必要先得到上述Dijkstra算法中定义的集合的初始值:以V0为起点计算最短路径的话,初始状态时显然有且只有V0在集合A中,所以集合A的初始值为V0。
6、集合B的初始值为剩余节点。前面提到过,下一个加入集合A的节点,一定是和V0直接有边相连的节点,因此,加入最短路径树的第一条路径也必然在这些和V0直接相连的边所代表的路径中产生,所以集合II的初始值就是和V0直接相连的边构成的路径。另外,初始状态最短路径树为空,所以集合I的初始值为空。集合I、II明确了的话,集合III自然明确。下面我们开始展开递归构造最短路径树的过程:第一步:从集合II中选择一条最短的路径,放入最短路径树,相应的,这条路径的终点对应的节点(这里记为X)应该从集合B移入集合A。第二步:考察所有从X出发的边的终点,考虑其中不属于集合A的节点,这里记为Y,计算从V0出发经X到达Y的路
7、径值,计算方法为:最短路径树中V0到节点X的路径值加上(X,Y)这条边的值。为了描述方便,我们把从V0出发经X到达Y的路径记为(V0X)Y。接着考察集合II中的候选路径,如果其中没有到节点Y的路径,则直接把路径(V0X)Y作为候选路径加入集合II;如果集合II中已经有到节点Y的路径,则进行比较,如果这条路径值小于或等于路径 (V0X)Y的路径值,那么路径 (V0X)Y作为被废弃的路径放入集合III,否则原集合II中到Y的路径被废弃放入集合II,(V0X)Y作为候选路径放入集合II。对于Y节点有多个的情况,按第二步的方法一个一个的计算和比较。重复第一步和第二步,直到集合II和集合B为空。第二步事
8、实上是对候选路径的一个重新计算过程,因为在集合A中引入了新的节点后,考察的范围变大了,很可能在原来节点范围内认为到某个节点的最短路径已经不再是最短路径了,这时候,需要根据第二步的方法进行调整。为了让大家更好的理解这一构造过程,这里举一个较为典型的例子,如下是一个有向图:计算这个有向连通图的最短路径树的过程如下:V0V1V2V4V3501045101535302015候选路径 集合路径 长度最短路径 树中的节 点(集合 A)最短路径树说明V0V1 V0V2 V0V450 10 45V0Null在初始状态,最短路径树中只有节点 V0,候选路径就是 V0 直接相连的边代 表的路径。V0V1 V0V4
9、 V0V2V350 45 35V0、V2V0V0 V0V2V0V2 在所有候选路径中最短,所以放 入最短路径树,V2 放入集合 A。考察所 有以刚放入集合 A 的节点 V2 为起点的 边的终点,对其中不在集合 A 中的节点, 这里只有节点 V3,计算从 V0 出发经节 点 V2,到达 V3 的路径 V0V2V3 的值, 因为候选路径中没有到 V3 的路径,所 以 V0V2V3 路径直接放入候选路径集合。V0V1 V0V4 V0V2V3V1 V0V2V3V450 45 45 55V0、V2、 V3V0V0 V0V2 V0V2V3V0V2V3 在所有候选路径中最短,所以 放入最短路径树,V3 放入
10、集合 A。考察 所有以刚放入集合 A 的节点 V3 为起点 的边的终点,对其中不在集合 A 中的节 点,这里是节点 V1,V4,计算从 V0 出 发经节点 V3,到达这两个节点的路径 V0V2V3V1 和 V0V2V3V4 的路径值, 并和候选路径中已有的到达 V1、V4 的 路径值进行比较:V0V2V3V1 小于 V0V1,所以 V0V1 从候选路径中删除, V0V2V3V1 放入候选路径集合; V0V2V3V4 比 V0V4 大,所以 V0V4 在 候选路径中保留,V0V2V3V4 路径废弃 不用。V0V2V3V145V0、V2、 V3、V4V0V0 V0V2 V0V2V3 V0V4V0V
11、4 和 V0V2V3V1 路径值相等,任意 选择 V0V4 放入最短路径树,V4 放入集 合 A。考察所有以刚放入集合 A 的节点 V4 为起点的边的终点,其中不在集合 A 中的节点没有(虽然有边 V4V3,但 V3 已经在集合 A 中了),所以不进行 选择和计算。V0、V2、 V3、V4、 V1V0V0 V0V2 V0V2V3 V0V4 V0V2V3V1候选路径 V0V2V3V1 放入最短路径树, 这时候选路径集合为空,并且所有节点 已经放入了集合 A。计算结束。2 Dijkstra 算法的证明算法的证明对Dijkstra算法进行证明,实际上就是要证明其构造过程构造的树一定是最短路径树。为了
12、给出证明,我们先分析一下构造过程。分析构造过程的第二步,可以得出结论一结论一。结论一结论一:对一个还没有选入集合对一个还没有选入集合A的节点的节点Y,其候选路径是所有从,其候选路径是所有从V0出发,中途只经出发,中途只经过集合过集合A中的节点到达中的节点到达Y的路径中路径值最小的的路径中路径值最小的。这个结论根据第二步候选路径的构造过程,很容易得出:因为在第一次构造到Y的候选路径时,从V0出发经刚加入集合A的节点到Y的路径,是被直接放入候选路径集合中的,这说明第一次构造的到Y的候选路径满足条件“从V0出发,中途只经过集合A中的节点”。另外,集合A中每加入一个新节点,都会考虑从V0出发经过这个新
13、节点到达Y的路径,并和原候选路径比较,选择两者中较小的那个,这种过程一直持续到Y被选入集合A中为止。这个过程显然保证了Y的候选路径一直保持了特性“从V0出发,中途只经过集合A中的节点”,而且因为遍历了所有A中的节点,所以是所有这种特性路径中最短的。有了结论一结论一,证明Dijkstra算法可以弱化为证明结论二结论二。结论二结论二:假设构造过程中下一步将选择的是节点假设构造过程中下一步将选择的是节点Y,那么这时到达,那么这时到达Y的最短路径必然是的最短路径必然是从从V0出发,中途只经过集合出发,中途只经过集合A中的节点到达中的节点到达Y的路径的路径。如果“结论二结论二”成立的话,结合“结论一结论
14、一”,说明Y的最短路径和候选路径具有相同的属性“从V0出发,只经过集合A中的节点”,而“结论一结论一”中明确说明,候选路径是这种属性的路径中的最小者,所以对于下一步即将选入集合A中的节点Y,其最短路径值就是候选路径,也即证明了算法中构造最短路径树过程的正确性。下面我们证明“结论二结论二”。证明很简单,使用反证法:假设到达Y的最短路径中途不只经过集合A,那么必然经过一个不在集合A中的节点W,于是这条路径中肯定包含一条从V0到W的路径,这条路径显然比从V0出发经过W到Y的路径更短,而Y是下一步要放入集合A中的节点,根据我们按非降次序构造最短路径树的过程(第一条最短,第二条次短.),从V0出发到W的
15、这条路径应该已经在最短路径树中了,也即节点W应该已经在集合A中,矛盾,得证。3 OSPF 协议中对协议中对 Dijkstra 算法的使用算法的使用从理论上来说,只要描述清楚了节点之间的连接和边的属性,就描述清楚了有向图,也就可以使用Dijkstra算法计算出最短路径树。对于使用基于Dijkstra算法的路由协议来说,如果能描述清楚整个网络拓扑(对应有向图),并让区域内的每台路由器都清楚的知道整个区域的网络拓扑,则每台路由器都可以独立的计算出最短路径树。从这个意义上说,对于一个使用Dijkstra算法的路由协议来说,需要要解决以下问题:网络拓扑的描述问题。网络拓扑描述信息的传播问题。效率问题:路
16、由协议的目的是在耗费最少资源的情况下,在最短时间内动态发现到其他网段的最优路径。另外,还需要考虑路由协议的网络应用位置(IGP或者EGP,适合于多大网络等)以及和其他路由协议的互操作等问题。以上几个问题有一定的关联性,互相影响。例如,网络拓扑描述的优化可以减少描述信息,从而减轻传播和计算过程的消耗,提高了效率。本文的着力点是Dijkstra算法及其在OSPF中的应用,所以这里只说明与之相关的网络拓扑的描述和最短路径计算两个内容,网络拓扑的描述也只涉及的几类基本LSA。3.1OSPF 对网络拓扑的描述OSPF中使用链路状态通告(LSA)来描述网络拓扑(即有向图)。OSPF中,Router LSA被用来描述路由器(节点)之间的连接和链路(边)的属性,具备了理论上计算最短路径的可能。但是仅仅是理论而已,从实践的角度,针对特殊的网络情况和应用场景,需要作一些优化工作。先考虑一个有n个节点的广播网,如果使用Router LSA来描述的话,需要描述n个节点两两相连的n*(n-1)/2条链路,而且n个节点间需要建立建立n*(n-1)/2个邻