当链路状态路由算法构建完LSDB后,接下来节要调用SPF算法,对LSDB内的LSA进行处理,计算出所有路径。SPF算法在《Routing TCP/IP volmun I》的OSPF章节中有描述。
SPF算法简单描述如下(LSDB已收敛):
一、选定根节点;
二、遍历该选定节点的所有直连节点。遍历过程中,若根与某节点的分支为
l 新分支,则添加该分支到分支列表,并记录分支的权重、根的下一跳;
l 已存在于分支列表,则与分支列表中已存在分支的权重值比较优劣,并把较优值更新到分支列表中;
l 已存在于权重列表,则忽略;
三、把分支列表中的最优分支移出至权重列表,并选定该分支的节点;
四、若分支列表非空,则继续步骤三;否则算法结束。
算法结束后,权重列表即为最短路径树,用于生成路由表或其它后续工作。
下面举个简单例子,箭头方向为节点配置链路权重(metric),注意权重是单向的,修改权重一般情况下要确保两端一致。a为运行SPF算法的节点,LSDB已收敛:
*下述显示含义为节点(下一跳) 权重
一、SPF把a、b、c、d、e、f、g、h置为未遍历状态,并以本节点(R1)为根。添加a(a)到权重列表,权重为0,下一跳为a。接着遍历a的直连节点b、c、d,并把b(b) 50,c(c) 85,d(d) 20添加到分支列表。其中d(d)的权重最优,为20。添加d(d)到权重列表,权重为20,下一跳为d,并选定d;
二、遍历d所有连接的节点。这里d-b 20,d-c 20,d-g 20,d-h 20。分支列表中b(b)从50改为40,下一跳改为d;c(c)从85改为40,下一跳改为d;添加g(d) 40,h(d) 40。这时分支列表包含:b(d) 40,c(d) 40,g(d) 40,h(d) 40。添加b(d)到权重列表,权重为40,下一跳为d,并选定b;
三、遍历b所有连接的节点。这里分支为b-e 80,b-d 20,由于d已以被添加到权重列表,不再考虑。分支列表中添加e(d) 120。这时分支列表包含:c(d) 40,g(d) 40,h(d) 40,e(d) 120。添加c(d)到权重列表,权重为40,下一跳为d,并选定c;
四、遍历c。这里分支为c-f 20,c-d 20,由于d已被添加到权重列表,不再考虑。分支列表添加f(d) 60。这时分支列表包含:g(d) 40,h(d) 40,e(d) 120,f(d) 60。添加g(d) 到权重列表,权重为40,下一跳为d,并选定g;
五、遍历g。g分支为g-e 20,g-h 50。分支列表修改e(d) 60。这时分支列表包含:h(d) 40,e(d) 60,f(d) 60。添加h(d)到权重列表,权重为40,下一跳为d,并选定h;
六、遍历h。h分支为h-g 50,h-f 20。g已被添加到权重列表,不考虑;而a-d-c-f和a-d-h-f同为60,下一跳同为d,该新分支与分支列表中的分支并无差异。这时分支列表包含:e(d) 60,f(d) 60。添加e(d)到权重列表,权重为60,下一跳为d,并选定e;
七、遍历e。分支为e-b 80,e-g 20,由于b、g已在权重列表,分支列表无需改变,为f(d) 60。添加f(d)到权重列表,权重为60,下一跳为d。
八、由于分支列表为空,因此SPF算法结束。这时权重列表为:
节点
|
a
|
d
|
b
|
c
|
g
|
e
|
f
|
权重
|
a
|
d
|
d
|
d
|
d
|
d
|
d
|
下一跳
|
0
|
20
|
40
|
40
|
40
|
60
|
60
|
本文转自 gole_huang 51CTO博客,原文链接:http://blog.51cto.com/golehuang/920865