本文講述路由算法中的鏈路狀態路由,鏈路狀態路由的核心算法是Dijkstra算法,本文也會詳細描述
1979年以前ARPANET(Advanced Research Project Agency)一直使用的是距離矢量路由算法,但是在此之後便改爲使用鏈路狀態路由算法。當今,鏈路狀態路由算法的變種算法——IS-IS(Intermediate System-Intermediate System)還有OSPF成爲了使用最爲廣泛的路由算法。
鏈路路由算法分爲下列5步:
(1)每個路由器發現它的鄰居節點,並瞭解鄰居節點的網絡地址
(2)設置到每個鄰居節點的距離或者成本度量值
(3)構造一個包含所有獲得的鏈路向信息包
(4)將這個鏈路信息包發送給網絡中其他路由器,同時也接受其他路由器發送過來的鏈路信息包
(5)計算出到其他路由器的最短路徑(這一步就會使用到核心算法Dijkstra算法)
下面將具體介紹每一步的細節:
1、發現鄰居:
當一個路由器啓動時,路由器會找出哪些路由器是它的鄰居。實現這個的方法就是在每一條點到點線路上發送一個特殊的HELLO數據包。然後線路的另外一個路由器做出一個答覆。
2、設置鏈路成本:
一種常用的方法就是使成本和鏈路帶寬成反比,越高帶寬的成本越低,這樣可以使高容量的路徑成爲路由器更好的選擇。如果網絡是在地理上分散的,那麼可以將延遲作爲成本的組成部分,延遲高的成本也高,這樣可以找出延遲最低的路徑。
3、構造鏈路狀態包:
狀態包中包括了這些內容:發送方的標識符,序號,年齡,鄰居列表。
4、分發鏈路狀態包:
路由器將會進行記錄,如果是個新的數據包,那麼就轉發它,如果是個重複的數據包,就丟棄,如果數據報的序號小於當前所看到的最大的序號,那麼就當做過時的數據包而拒絕接受。
5、計算新路由:
每條鏈路可能被表示了兩次,每個方向可能不同。也就是說實際情況中,A到B的和B到A的最短路徑可能是不同的。這裏將要詳細介紹下當每個路由器收到了鏈路狀態包之後怎麼去計算到網絡中其他路由器的最短路徑(Dijkstra算法):
Dijkstra算法是一種迭代算法,它的性質是經過算法的第K次迭代之後,可以知道到K個目的結點的最低費用路徑。我們先定義下列符號,目的是爲了更好地理解算法的內容:
D(v):到算法的本次迭代,從源節點到目的結點v的最低費用路徑的費用
p(v):從源結點到目的結點v的最短路徑中倒數第二個結點(也就是v結點之前的結點)
N ' :結點子集,如果從源節點到某個結點的最低費用路徑已經確認,那麼這個結點就應該添加到N '中
下面就用僞代碼描述下Dijkstra算法的具體實現,該算法由一個初始化步驟和後面的循環組成。循環的次數和網絡中的結點個數相同。
// Initialization
N ' = {u}
for all nodes v
if v is a neighbor of v
then D(v) = c(u,v)
else D(v) = max
// Loop
find w not in N ' and D(w) is a minium
add w to N '
update D(v) for each neighbor v of w and v is not in N '
D(v) = min( D(v) , D(w) + D(w,v) )
until N ' = N