当链路状态路由算法构建完LSDB后,接下来节要调用SPF算法,对LSDB内的LSA进行处理,计算出所有路径。SPF算法在《Routing TCP/IP volmun I》的OSPF章节中有描述。

SPF算法简单描述如下(LSDB已收敛):

一、选定根节点;

二、遍历该选定节点的所有直连节点。遍历过程中,若根与某节点的分支为

新分支,则添加该分支到分支列表,并记录分支的权重、根的下一跳;

已存在于分支列表,则与分支列表中已存在分支的权重值比较优劣,并把较优值更新到分支列表中;

已存在于权重列表,则忽略;

三、分支列表中的最优分支移出至权重列表,并选定该分支的节点;

四、分支列表非空,则继续步骤三;否则算法结束。

算法结束后,权重列表即为最短路径树,用于生成路由表或其它后续工作。

下面举个简单例子,箭头方向为节点配置链路权重(metric),注意权重是单向的,修改权重一般情况下要确保两端一致。a为运行SPF算法的节点,LSDB已收敛:

SPF算法介绍_第1张图片

*下述显示含义为节点(下一跳权重

一、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