TCP/IP之路由算法

轉載自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’中的鄰居vD(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間路由協議完成!
  • 熱土豆路由: 將分組發送給最近的網關路由器.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章