當鏈路狀態路由算法構建完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 |