轉載自https://www.jianshu.com/p/e5cce2958790
網絡層的重要功能就是路由和轉發。而路由是根據路由器根據所維護的路由表進行路由選擇。所以,如果創建和更新轉發表就是一個很重要的問題。通常,在路由時,我們總是選取所需代價最小的一條路由。
首先,我們需要將網絡進行抽象,最常見的抽象就是,將網絡抽象成圖結構。
每段鏈路的費用可以總是1,或者是,帶寬的倒數、擁塞程度等。
關鍵問題: 源到目的(如u到z)的最小費用路徑是什麼?
所謂的路由算法: 尋找最小費用路徑的算法。
路由算法的分類
靜態路由 vs 動態路由
靜態路由就是所有路由信息由人工靜態配置好,以後需要更新的話,就要重新配置。
- 手工配置
- 路由更新慢
- 優先級高
動態路由就是在網絡隨時根據網絡拓撲結構的結構的變化,進行動態更新
- 路由更新快
- 定期更新
- 及時響應鏈路費用或網絡拓撲變化
全局信息 vs 分散信息
有的路由算法需要所有路由器掌握完整的網絡拓撲和鏈路費用信息,也就是對網絡的全局有一個瞭解
最有代表性的就是鏈路狀態(LS)路由算法。
有的路由算法只需要路由器只掌握物理相連的鄰居以及鏈路費用。通過鄰居間信息交換、運算的迭代過程來更新路由信息。
最有代表性的就是距離向量(DV)路由算法。
鏈路狀態路由算法
首先將網絡抽象,然後利用圖算法中的最短路徑算法,Dijkstra 算法。
所有結點(路由器)掌握網絡拓撲和鏈路費用
- 通過“鏈路狀態廣播”
- 所有結點擁有相同信息
利用Dijkstra 算法計算從一個結點(“源” )到達所有其他結點的最短路徑。從而可以獲得該節點的轉發表。
然後對不同的節點進行迭代,就可以使所有節點都得到自己的轉發表。
- c(x,y): 結點x到結點y鏈路費用;如果x和y不直接相連,則=∞
- D(v): 從源到目的v的當前路徑費用值
- p(v): 沿從源到v的當前路徑, v的前序結點
- N’: 已經找到最小費用路徑的結點集合
1 初始化:
2 N' = {u}
3 for 所有結點v
4 if v毗鄰u
5 then D(v) = c(u,v)
6 else D(v) = ∞
7
8 Loop
9 找出不在 N’中的w ,滿足D(w)最小
10 將w加入N'
11 更新w的所有不在N’中的鄰居v的D(v) :
12 D(v) = min( D(v), D(w) + c(w,v) )
13 /*到達v的新費用或者是原先到達v的費用,或者是
14 已知的到達w的最短路徑費用加上w到v的費用 */
15 until 所有結點在N’中
算法複雜性: n個結點
- 每次迭代: 需要檢測所有不在集合N’中的結點w
- n(n+1)/2次比較: O(n2)
- 更高效的實現: O(nlogn)
算法可能存在震盪現象
當鏈路狀態更新的太快並且不斷變化的時候,假設我們發出一個分組,結果還沒到目的地,路由表就更新了,然後這個數據報就一直在路由間切換,最後由於ttl到0,直接丟棄。這就是震盪現象。
距離向量(Distance Vector)路由算法
重點:結點獲得最短路徑的下一跳, 該信息用於轉發表中!
核心思想:
- 每個結點不定時地將其自身的DV估計發送給其鄰居
- 當x接收到鄰居的新的DV估計時, 即依據B-F更新其自身的距離向量估計:
Dx(y)將最終收斂於實際的最小費用 dx(y)
異步迭代:
- 引發每次局部迭代的因素
- 局部鏈路費用改變
- 來自鄰居的DV更新
分佈式:
- 每個結點只當DV變化時才通告給鄰居
- 鄰居在必要時(其DV更新後發生改變)再通告它們的鄰居
距離向量路由算法:舉例
如果鏈路發生變化,距離向量節點會怎麼樣呢?
鏈路費用變化:
- 結點檢測本地鏈路費用變化
- 更新路由信息,重新計算距離向量
- 如果DV改變,通告所有鄰居
交換過程
- t0 : y檢測到鏈路費用改變 ,更新DV,通告其鄰居.
- t1 : z收到y的DV更新,更新其距離向量表,計算到達x的最新最小費用,更新其DV,併發送給其所有鄰居.
- t2 : y收到z的DV更新, 更新其距離向量表,重新計算y的DV,未發生改變,不再向z發送DV.
“好消息傳播快! ”
“壞消息會怎麼樣呢? ”
如果是壞消息,很可能就會出現無窮計數的問題:
我們發現 壞消息傳播慢!—“無窮計數(count to infinity)”問題!
無窮計數問題的解決方法
毒性逆轉(poisoned reverse):
如果一個結點(e.g. Z)到達某目的(e.g.X)的最小費用路徑是通過某個鄰居(e.g.Y),則
通告給該鄰居結點到達該目的的距離爲無窮大
毒性逆轉能否徹底解決無窮計數問題?
顯然是不行的,如果過於複雜的網絡,我們發現毒性逆轉也需要經過很多的步驟。
定義最大度量(maximum metric)
定義一個最大的有效費用值,如15跳步, 16跳步表示∞
層次路由
我們前面的算法是將網絡抽象成一張圖,但實際上,網絡都是很大的,節點數量遠超過我們想象,如果我們單純的使用以上的算法顯然是不可行的。
將任意規模網絡抽象爲一個圖計算路由-過於理想化
- 標識所有路由器
- “扁平”網絡
——在實際網絡(尤其是大規模網絡)中, 不可行!
網絡規模: 考慮6億目的結點的網絡
- 路由表幾乎無法存儲!
- 路由計算過程的信息( e.g. 鏈路狀態分組、DV)交換量巨大,會淹沒鏈路!
另一方面,就是網絡管理自治的問題,不同的網絡可以採取不同的方法進行路由。
管理自治:
- 每個網絡的管理可能都期望自主控制其網內的路由
- 互聯網(internet) = 網絡之網絡(network of networks)
層次路由就是解決這樣的問題,和網絡領域中的問題是一樣,繼續抽象出一層網絡。
聚合路由器爲一個區域:自治系統AS(autonomous systems)
然後再把自治系統看成節點進行路由,對於自治系統內就採取自己的路由方法。這就是抽象成了兩層。
同一AS內的路由器運行相同的路由協議(算法)
- 自治系統內部路由協議(“ intra-AS” routing protocol)
- 不同自治系統內的路由器可以運行不同的AS內部路由協議
網關路由器(gateway router):
- 位於AS“邊緣”
- 通過鏈路連接其他AS的網關路由器
轉發表由AS內部路由算法與AS間路由算法共同配置
- AS內部路由算法設置AS內部目的網絡路由入口(entries)
- AS內部路由算法與AS間路由算法共同設置AS外部目的網絡路由入口
假設AS1內某路由器收到一個目的地址在AS1之外的數據報:
路由器應該將該數據報轉發給哪個網關路由器呢?
AS1必須:
1.學習到哪些目的網絡可以通過AS2到達,哪些可以通過AS3到達
2.將這些網絡可達性信息傳播給AS1內部路由器
以上這些都是
例: 路由器1d的轉發表設置
假設AS1學習到(通過AS間路由協議):子網x可以通過AS3 (網關 1c)到達,但不能通過AS2到達,AS間路由協議向所有內部路由器傳播該可達性信息
爲了配置轉發表,路由器1d必須確定應該將去往子網x的數據報轉發給哪個網關?這個任務也是由AS間路由協議完成!
- 假設AS1通過AS間路由協議學習到:子網x通過AS3和AS2均可到達
- 爲了配置轉發表,路由器1d必須確定應該將去往子網x的數據報轉發給哪個網關?
- 這個任務也是由AS間路由協議完成!
- 熱土豆路由: 將分組發送給最近的網關路由器.