把我與誰連接告訴所有的路由器,那么所有的路由器就都具有了一幅網絡圖 由這副圖計算每條具體的路徑
所以實現的關鍵在於
鏈路狀態信息的可靠分發
根據鏈路狀態信息計算路由
步驟
- 發現鄰接點, 獲得鄰居的網絡地址.
- 每一個點對點鏈路發送 HELLO 分組
- 鄰居返回響應
- 多個路由器通過LAN連接,路有器的一個端口有多個鄰居,如何抽象?
- 把 LAN 當做一個節點 LAN上指定的一個路由器來運行路由協議
- 測量到每一個鄰居的代價
- 發送一個 ECHO 分組,鄰居迅速返回響應
- 測量往返時間, / 2即是到鄰居的延遲
- 多測幾次取平均值
- 構造鏈路狀態分組(鄰居信息)
- LSP (Link-State Packet,鏈路狀態分組)
- 和路由計算相關的項
- 產生 LSP節點的ID
- 直接相連的鄰居列表
- 到每個鄰居的代價
- 和可靠性相關的項
- 序號( sequence number),區分新舊消息
- 年齡 ( age)
- 更新
- 計時器超時 通常幾十分鍾
- 網絡變化時
- 直接連接的鏈路斷開 可以用鏈路層協議檢測
- 直接連接的鄰居下線 通過定期發送 “hello” 檢測
- 分發鏈路狀態包(發送給所有其它路由器).
- 目的:保證所有參加路由的節點得到其它所有節點的鏈路狀態信息的一個拷貝
- 方法:可靠泛洪(Reliable Flooding)
- 將 LSP發送到所有直接相連的鏈路
- 收到 LSP 的節點將它轉發到所有其它鏈路
- 存儲每個節點的最新 LSP
- 向所有相鄰節點轉發每個LSP,但不發送給發來該LSP的節點
- 相鄰路由器之間有確認和重傳的機制
- 控制泛洪規模
- Packet: 包含一個序號 保證擁有最新 copy
- 序號存在的問題
- 問題1:序號回轉 解決:使用大的序號空間,如32bit
- 問題2:一個路由器崩潰了, 將丟失所有序號記錄,恢復后從0開始 ,將會拒絕正常分組
- 問題3:序號本身被破壞
- 解決
- 增加 age域 (TTL) 每經過一個路由器,age遞減 Age=0,拋棄
- Router: 記錄見過的分組 ( router, sequence number )
- 如果 LSP 是 duplicate , 就丟棄
- Duplicate: LSP序號 is lower
- 當一個 LSP 到來時, it wait a short while, 而不是立即轉發
- 當一個 LSP 到來, 先放到一個保留區等一會 有新 LSP 到來, 比較序號
- 相等,是重復分組,不再轉發
- 不同 ,比較年齡,丟棄舊的分組
- 計算到每個節點的最短路徑
優缺點
優點
沒有慢收斂問題,對壞消息響應迅速
代價
存儲空間開銷 存儲所有的鏈路狀態分組
CPU 開銷 任何拓撲變化都要重新計算最小代價樹
比較
和 DV對比,都要交流信息
- DV(距離向量)
- Who: 鄰居
- What:距離向量,可能有不確定(道聽途說)的消息
- 使用最短路徑優先算法,算法復雜度為O(n^2) n個結點(不包括源結點),需要n*(n+1)/2 次比較 使用更有效的實現方法,算法復雜度可以達到O(nlogn) 可能存在路由振盪(oscillations)
- 結點會廣播錯誤的鏈路開銷 每個結點只計算自己的路由表
- LS(鏈路狀態)
- Who: 所有路由器
- What :LSP,僅通告確定的消息
- 收斂時間不定 可能會出現路由循環
- 結點會廣播錯誤的路徑開銷 每個結點的路由表被別的結點使用,錯誤會傳播到全網