前一篇簡單闡述了靜態路由中的相關知識(傳送門)
本篇就整理一下動態路由的相關內容
動態路由基本概念
動態路由主要是基於以下兩點
- 能否設計一種機制使各個路由器根據自己靜態的不完整的信息“學習”出比較複雜的,甚至是全局的路由信息?
- 如果靜態路由中的某些節點/路徑失效,能否設計一種機制,使路由器自動將失效路由更新爲可行的新路由信息?
顯然在實際大型網絡拓撲結構中,實現這兩點有着重要的意義,所以動態路由應運而生
下面貼幾張圖演示一下動態學習的過程
以R4爲例,首先收到相鄰節點R2,R3的路由信息,並增加自己沒有的信息
R4的路由表產生了更新,於是向鄰居廣播,希望鄰居都能得到其更新的信息,
鄰居們獲得了R4的更新並隨即學習更新了自身的路由信息,此時他們的路由信息也發生變化,於是繼續廣播給鄰居
得到新信息的鄰居繼續學習更新自己的路由表,經過這一動態過程,網絡域中的所有節點都動態學習到了所有的網絡信息
而正是基於這種不斷廣播,不斷學習,不斷更新的過程,使得鏈路失效後,有效路由也能重新建立,下面給出鏈路失效後重新建立連接的例子
動態路由協議
動態路由協議本質上都是依靠各個路由器上運行的特殊進程在路由器之間不斷交換路由信息來推斷,學習出網絡的全局路由。
距離-矢量動態路由協議:RIP
RIP協議的工作機理就像上圖描述的一樣,從路由啓動的初始狀態開始,通過與相鄰路由不斷交換信息來學習新路由,在RIP協議中,一個路由器發送的表項爲<目標網絡,最短到達距離>,從接收的信息中計算出最短路由的下一站路由器。如果有多條最短路由則取其中一條,下面給出僞代碼
/* T 是來自鄰接路由器R 的路由報告;
本路由器是R0 , 其當前路由表是T0 */
Vector_Distance_Shortest_Route_Discover(R, T) {
for( T的每一項(Nk , Dk)) {
if(T0中不存在形如(Nk ,﹒,﹒)的表項) {
insert(T0, (Nk , R, Dk+1)); /* R0 發現了一個新目標網絡及其路由*/
continue;
}
if(T0中存在形如(Nk , R, D)的表項&& D≠Dk+1) {
/* R0 到目標網絡N的路由的距離發生了變化, R0無條件地接受這一變化3 */
將T0的表項(Nk , R, D)更新爲(Nk , R, Dk+1);
continue;
}
if(T0中存在形如(Nk , Rk, D)的表項&& Dk +1<D) { /* 這時一定R≠Rk */
/* R0發現了到達目標網絡Nk的距離更短的路由*/
將T0的表項(Nk , Rk, D)更新爲(Nk , R, Dk+1);4
continue;
}
}
}
/* T 是來自鄰接路由器R 的路由報告;
本路由器是R0 , 其當前路由表是T0 */
Vector_Distance_Shortest_Route_Discover_RIP(R, T) {
for( T的每一項(Nk , Dk)) {
if(Dk==16&& T0中存在形如(Nk , R, D)的表項&& D≠16){ /*失效的路由*/
將T0的表項(Nk , R, D)更新爲(Nk , R, 16);
啓動表項(Nk , R, 16)的失效-刪除定時器;
/* 超時後若該失效項仍存在則將其永久刪除 */
continue;
}
if(T0中不存在形如(Nk ,﹒,﹒)的表項) {
insert(T0, (Nk , R, Dk+1)); /* R0 發現了一個新目標網絡及其路由*/
啓動表項(Nk , R, Dk+1)的壽命定時器;
continue;
}
if(T0中存在形如(Nk , R, D)的表項) {
if( D≠Dk+1) {
/* R0 到目標網絡N的路由的距離發生了變化, R0無條件地接受這一變化5*/
將T0的表項(Nk , R, D)更新爲(Nk , R, Dk+1);
}
啓動表項(Nk , R, Dk+1)的壽命定時器; /*復位-重啓*/
continue;
}
if(T0中存在形如(Nk , Rk, D)的表項&& Dk +1<D) { /* 這時一定有R≠Rk */
/* R0發現了到達目標網絡Nk的距離更短的路由*/
將T0的表項(Nk , Rk , D)更新爲(Nk , R, Dk+1);6
啓動表項(Nk , R, Dk+1)的壽命定時器;
continue;
}
}
}
RIP 的報告週期爲 30 秒,路由表項的壽命時限爲 180 秒,刪除定時器時限爲 120 秒。路由表的刪除動作在定時器的時間超限例程中執行,這裏沒有寫出。
路由振盪
距離-矢量路由算法如果收斂,則一定收斂到最短距離的路由。但從實用的角度看,不僅要求路由發現算法能夠收斂,而且收斂時間越短越好。一個收斂時間過長的算法是沒有實用價值的。距離-矢量路由算法的收斂時間一般會有多長? 甚至有沒有可能不收斂?通過分析我們將看到即使對這樣一個非常簡單的網絡,如果不進行特殊的處理,距離-矢量算法確實有可能不收斂。這種不收斂或長時間進行路由更新而達不到穩態路由的現象,稱爲路由振盪。
貼張圖解釋一下
比如R1到N距離是d,那麼R2到N即是d+1,某一時刻R1到N的路徑失效,此時R1到達N的距離變爲無窮(在實際中常將距離設爲16表示不可達),此時R1要尋找新的路徑,當他詢問R2時,R2到達N的距離還保留着d+1,那麼R1就會將自己到達N的距離更新成d+2,但顯然二者都是互相指向對方,形成了環路。若此時到達廣播週期,R1就會將表項廣播給R2,但是R2的距離來源即是R1,因此受到R1的更新後,R2無條件地+1變成d+3,之後二者就會循環遞增直到達到上限被捨棄。這就是振盪過程。爲抑制路由振盪,常採用以下方法
1.觸發更新
若網絡中沒有變化,則按通常的30秒間隔發送更新信息。但若有變化,路由器就立即發送其新的路由表。這個過程叫做觸發更新。
觸發更新可提高穩定性。每一個路由器在收到有變化的更新信息時就立即發出新的信息,這比平均的15秒要少得多。雖然觸發更新可大大地改進路由選擇,但它不能解決所有的路由選擇問題。例如,用這種方法不能處理路由器出故障的問題。
2.水平分割(split horizon update)
讀者從上面的分析中能看到,之所以出現路由振盪,原因在於 R1 不能認識到 R2 所報告的關於網絡 N 的路由實際上恰恰來自於自己從前的報告,對 R2 也是一樣。如果抑制這種反向報告,即規定如果一個路由器從某個近鄰的報告中學習到一組新路由,則永遠不再向該近鄰發佈包含這些路由項的報告,或更準確地說,是不再向該近鄰所在的網段上組播包含這些路由項的報告。
然而,水平分裂並非適合於所有網絡,即使遵循水平分裂規則也仍然存在路由振盪現象。
3.毒性逆轉(poisoned reverse)
毒性逆轉(poison reverse)是水平分割的一種變型。使用這種方法時,路由器收到的信息用來更新路由表,然後通過所有的接口發送出去。但是,已經從一個接口來的一個路由表項目在通過同樣的接口發送出去時,就要將其度量置爲16。
4.抑制計時(holddown timer)
一條路由信息無效之後,一段時間內這條路由都處於抑制狀態,即在一定時間內不再接收關於同一目的地址的路由更新。如果,路由器從一個網段上得知一條路徑失效,然後,立即在另一個網段上得知這個路由有效。這個有效的信息往往是不正確的,抑制計時避免了這個問題,而且,當一條鏈路頻繁起停時,抑制計時減少了路由的浮動,增加了網絡的穩定性。
然而,以上並非完美的解決方案,主要問題是根據 RIP 路由更新算法,及時報告機制會觸發連鎖的及時報告,結果是雖然逆向毒化及時通告了路由失效,但卻在短時間內引起網絡負荷劇烈增加,特別是在一個網段上連接了多個路由器的情形。實際上,路由振盪是距離-矢量算法的內在矛盾,要徹底解決這一問題需要開發新的、基於不同機理的動態路由協議。
開放最短路優先:OSPF
OSPF使用鏈路狀態算法,包括LS分組分發,在每個節點使用拓撲圖,使用Dijkstra算法的路由計算,即每一個節點存儲的不是相鄰節點的靜態信息,而是整個網絡全局的拓撲圖。
OSPF相對與RIP主要有以下優點
- 安全性: all OSPF messages authenticated (to prevent malicious intrusion)
- 運行多條費用相同的路徑(在RIP中僅一條路徑)
- 對每條鏈路,對不同的TOS(服務類型),設置多種費用度量(如衛星鏈路費用置爲用於盡力而服務爲“低”,高爲實時服務)
- 綜合的單播和多播支持: 多播OSPF (MOSPF)使用與OSPF相同的拓撲數據庫
- 在大域中層次的OSPF
在實際中更是應用層次OSPF提高運行能力
- 兩級層次: 本地, 主幹
- 鏈路狀態通告僅在本地
- 每個節點具有詳細的區域拓撲;僅知道到其他區域網絡的方向(最短路)
- 區域邊界路由器 : “摘要”到在自己區域網絡的距離,向其他區域邊界路由器通告
- 主幹路由器 : 運行OSPF 選路限制到主幹
- 邊界路由器 : 連接到其他AS
邊界網關協議:BGP
- 路由器的對(BGP對等方)交換選路信息通過半永久的TCP連接: BGP會話
- 注意到BGP會話不對應着物理鏈路(覆蓋網絡)
- 當AS2向AS1通告一個前綴, AS2則承諾它將轉發任何指向該前綴的數據報,其中AS2和AS1都是兩個自治域,即劃分出的一小塊網絡域
- 自治域內部執行iBGP,自治域間執行eBGP
路由算法
距離矢量算法 dv
Bellman-Ford方程 (動態規劃)
dx(y) := 從x到y最低代價路徑的代價
dx(y) = min {c(x,v) + dv(y) } 其中min對x的所有鄰居
舉個例子:
- 好消息傳播得快
- 壞消息傳播得慢—“計數到無窮”
- 毒性逆轉以解決計數到無窮
基本思想:每個節點週期性的發送它自己的距離矢量以估計到其鄰居;當節點x接收到來自鄰居的新DV估計,它使用B-F方程更新其自己的DV :
鏈路狀態算法ls
Dijkstra算法
- 所有節點知道網絡拓撲、鏈路費用
- 經“鏈路狀態廣播”完成
- 所有節點具有相同信息
- 從一個節點(源)到所有其他節點計算最低費用路徑
- 給出對這些節點的轉發表
- 迭代: k次迭代後,得知到k個目的地的最低費用路徑
- c(x,y): 從節點x到y的鏈路費用; = ∞ 如果不是直接鄰居
- D(v):從源到目的地v路徑費用的當前值
- p(v): 從源到v沿路徑的前任節點
- N‘: 已知在最小費用路徑中的節點集合
LS和DV算法的比較
報文複雜性
- LS: 對n個節點,E條鏈路, 發送O(nE) 報文
- DV: 僅在鄰居之間交換
- 收斂時間變化
收斂速度
- LS: O(n2) 算法要求 O(nE)報文
- 可能具有振盪
- DV: 收斂時間變化
- 可能有選路環路
- 計數到無窮問題
健壯性: 如果路由器異常,將發生什麼現象?
- LS:
- 節點可能通告不正確的鏈路代價
- 每個節點僅計算它自己的表
- DV:
- DV節點通告不正確的路徑費用
- 每個節點表能由其他人使用
- 差錯通過網絡傳播
Hierarchical Routing(分層路由)
與其說是一種算法,不如說是一種思想,將路由分層管理,即形成自治域autonomous systems (AS),這樣每個自治域內的路由只需交互自治域內的信息,域間的路由器才進行多個域之間的信息傳遞,應用熱土豆選擇,即是選擇經過域最少的,域內經過路由最少的