網路層的重要功能就是路由和轉發。而路由是根據路由器根據所維護的路由表進行路由選擇。所以,如果建立和更新轉發表就是一個很重要的問題。通常,在路由時,我們總是選取所需代價最小的一條路由。
首先,我們需要將網路進行抽象,最常見的抽象就是,將網路抽象成圖結構。
每段鏈路的費用可以總是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間路由協議完成!
- 熱土豆路由: 將分組傳送給最近的閘道器路由器.