OSPF核心算法
OSPF,英文全称Open Shortest Path First。是中大型园区网乃至数据中心用的最多的IGP。而作为一名网络工程师,在学习该协议的时候,一般从OSPF的网络状态、网络类型、LSA等方面入手。但该协议/技术的核心,我觉得还是迪杰斯特拉/最短路径优先算法。今天,经过我对迪杰斯特拉算法的学习和思考,整理出下列内容,不足之处还请各位大神多多指教。
迪杰斯特拉算法的核心
通过学习,我觉得迪杰斯特拉算法的核心就是:第一、以自身节点为源,寻找该源到达首跳最短路径的节点(路径距离需要是非负值)。第二、根据首跳最短路径节点依次寻找去往其他节点最短路径,并将去往该点的最优路径记录到源节点的最短路径表中。第三、重复执行上述两个步骤,直至源节点到所有节点的最短路径均进行计算。
例子
先来看下面的一张图
首先,我们以A为节点,计算到达各个节点的最短路径。A则会将每次计算的结果放入如下的表中。
目的节点 | 目的节点距离A的距离 | 该目的节点的上一节点 | 是否最优路径 |
---|---|---|---|
X | … | … | … |
*其中“目的节点”代表目的节点的名称,“目的节点距离A点的距离”则表示A点到该目的节点的距离,而“该目的节点的上一节点”则表示目的节点的倒数第二个节点(例如,A去往F的路径为A->B->C->E->F,那么从A去往F的倒数第二个节点就是E。)
一、当A执行根据迪杰斯特拉算法执行第一次运算时,会以自身A为源,计算到达A的最优路径,因为A到(自己)A为最优,所以A会将相关信息更新到表内,如下所示:
目的节点 | 目的节点距离A的距离 | 该目的节点的上一节点 | 是否最优路径 |
---|---|---|---|
A | 0 | 是 | |
B | ∞ | ||
C | ∞ | ||
D | ∞ | ||
E | ∞ | ||
F | ∞ |
二、A以自身为源节点,寻找附近节点,找到附近的节点B和C,距离分别为1和5,因为A点离B点的路径距离比A点到达C点的路径距离更小,数值越小路径越优,所以确定A确认到达B的路径为最优路径。并形成如下表格。
目的节点 | 目的节点距离A的距离 | 该目的节点的上一节点 | 是否最优路径 |
---|---|---|---|
A | 0 | 是 | |
B | 1 | A | 是 |
C | 7 | B | |
D | ∞ | ||
E | ∞ | ||
F | ∞ |
二、A选出第一个节点的最后路径后,A则以B节点源节点,寻找附近节点,找到B节点相邻的节点为C和D(A点已经是最优,默认不进行计算),B到C的距离为2,B到D的距离为7;由此可计算出A经过B到C的最优距离为3,路径是A->B->C,而路径A->C因为距离为7,所以被A从表中进行剔除。A经过B进一步计算到达D的距离,为8,于是A形成如下表格。
目的节点 | 目的节点距离A的距离 | 该目的节点的上一节点 | 是否最优路径 |
---|---|---|---|
A | 0 | 是 | |
B | 1 | A | 是 |
C | 3 | B | 是 |
D | 8 | B | |
E | ∞ | ||
F | ∞ |
三、A确定到达C节点的最优路径之后。于是A以C节点源节点,寻找附近节点,找到C节点相邻的节点为B和E(B点已在源A中存在最优路径,不进行计算),C到E的距离为4,所以A经过C到达E节点的路径为9,A将这部分信息记录到下述表格中。
目的节点 | 目的节点距离A的距离 | 该目的节点的上一节点 | 是否最优路径 |
---|---|---|---|
A | 0 | 是 | |
B | 1 | A | 是 |
C | 3 | B | 是 |
D | 8 | B | |
E | 7 | C | |
F | ∞ |
四、此时目的节点D和E并未确定最优路径。于是选择路径距离较小的D进行SPF计算,D附近的节点为EF(B点已在源A中存在最优路径,不进行计算),D到达E的路径距离为9,所以A经D到达E的路径为A->B->D->E,路径距离为17,劣于A->B->C->E的路径距离。所以A形成如下表项。
目的节点 | 目的节点距离A的距离 | 该目的节点的上一节点 | 是否最优路径 |
---|---|---|---|
A | 0 | 是 | |
B | 1 | A | 是 |
C | 3 | B | 是 |
D | 8 | B | |
E | 7 | C | 是 |
F | ∞ |
五、确定E的最优路径之后,E附近节点为DF(C点已在源A中存在最优路径,不进行计算)。E到达D的路径距离为9,A经E到达D的距离为16(A->B->C->E->D),劣与A表所记载的A到D的距离(路径为A->B->D);同时,E到达F的路径距离为1,A经过E到达F的路径距离为8。所以A会形成下述表项。
目的节点 | 目的节点距离A的距离 | 该目的节点的上一节点 | 是否最优路径 |
---|---|---|---|
A | 0 | 是 | |
B | 1 | A | 是 |
C | 3 | B | 是 |
D | 8 | B | 是 |
E | 7 | C | 是 |
F | 8 | E |
五、确定D的最优路径之后,D附近节点为F(E点已在源A中存在最优路径,不进行计算)。D到达F的路径距离为3,A经D到达F的距离为11(A->B->D->F),劣于A表所记载的A到F的距离9(路径为A->C->E->F)。所以A形成如下表项。
目的节点 | 目的节点距离A的距离 | 该目的节点的上一节点 | 是否最优路径 |
---|---|---|---|
A | 0 | 是 | |
B | 1 | A | 是 |
C | 3 | B | 是 |
D | 8 | B | 是 |
E | 7 | C | 是 |
F | 8 | E | 是 |
以上是以A为源,运用迪杰斯特拉算法计算A到达各目的节点的最短路径。其他节点的计算方法则不一一进行列举。
本文主要参考了https://www.youtube.com/watch?v=JLARzu7coEs中所提及关于迪杰斯特拉算法的讲解