歡迎光臨
每天分享高質量文章

網絡中的「動態路由演算法」,你瞭解嗎?

(點擊上方公號,快速關註我們)


作者:王奎,個人公號:不止思考

在計算機網絡中,路由器的一個很重要責任就是要在端對端的節點中找出一條最佳路徑出來,通過自己與相鄰節點之間的信息,來計算出從自己位置到目的節點之間的最佳線路,這種演算法我們可以理解為路由演算法。

路由的樣式又主要分為「靜態路由」和「動態路由」。靜態路由協議是由網絡管理員手動輸入配置的,適用於小型的不太複雜的網絡環境中,或者有特定需求的網絡場景中。而動態路由協議是現代計算機網絡中最為常用的一種方式。動態路由演算法能夠根據網絡拓撲結構去適應流量的變化。

本文主要聊的就是「動態路由演算法」,你知道動態路由演算法有哪些嗎?

動態路由演算法大致可以分為兩類:

  • 距離矢量路由演算法

  • 鏈路狀態路由演算法

下麵我們來看一下這兩類演算法的特點:

一、距離矢量路由演算法

距離矢量路由演算法(Distance Vector Routing),它是網絡上最早使用的動態路由演算法,也稱為Bellman-Ford或者Ford-Fulkerson演算法。基於這類演算法實現的協議有:RIP、BGP等。

如圖,
這類演算法的基本思路是:網絡中每一個路由器都要維護一張 矢量表 ,這個 矢量表 中的每一行都記錄了從當前位置能到達的標的路由器的最佳出口(接口)和距離(跳數)。

每隔一段時間當前路由器會向所有的鄰居節點發送自己的這個表,同時它也會接收每個鄰居發來的它們的表。並會將鄰居的表和自己的表做一個對比更新。
比如當前 路由器X 離 鄰居Y路由器 的距離是m,此時收到 鄰居Y 發來的表中寫到了“ 鄰居Y離路由器Z的距離是n ”,那 當前路由器X 就知道它離 路由器Z 的距離可能就是 m+n 了,如圖:

就這樣繼續類推,要不了多久,每個路由器就可以將網絡中所有路由節點和子網線路都匯聚起來了。這樣的話,每個路由器只需要查找自己的表就可以很容易的知道到達目的地的最佳出口(接口)是哪個了。

當然,當網絡結構發生變化的時候,各個路由器中的矢量表也會隨之動態更新。

好了,講到這裡,基本上對「距離矢量路由演算法」大概原理有個認識了,現在我們再來仔細分析分析這個演算法的名字,可以發現,它的名字取的還是蠻有意思的,非常貼切。“距離”這個詞就基本表明瞭這個演算法是通過 距離(跳數/時間)來度量2個路由網絡之間的線路的,而“矢量”這個詞,可以看出線路是有方向性的,且路由表中只記錄了資料包去往目的地應該走哪個出口方向,並不會記錄到達目的地的整條路徑。

「距離矢量路由演算法」的優點很明顯:非常簡單清晰,且任何加入到網絡中的新節點都能很快的與其它節點建立起聯繫獲得補充信息。

缺點呢,首先就是每次發送信息的時候,要發送整個全域性路由表,太大了,因為每個路由器需要在矢量表中記錄下整個網絡的信息,導致需要較大儲存、CPU、網絡開銷,對資源的要求越來越高。還有一個問題就是收斂時間太慢,也就是路由器共享路由信息並使各台路由器掌握的網絡情況達到一致所需的時間比較久,收斂速度慢會導致有些路由器的表更新慢,從而造成路由環路的問題。

二、鏈路狀態路由演算法

鏈路狀態路由演算法(Link State Routing ),基於Dijkstra演算法,它是以圖論作為理論基礎,用圖來表示網絡拓撲結構,用圖論中的最短路徑演算法來計算網絡間的最佳路由。基於這類演算法實現的協議有:OSPF 等。
如圖,

這類演算法的基本思路是:採用的是不停的拼接地圖的方式。每一個路由器首先都會發現自己身邊的鄰居節點,然後將自己與鄰居節點之間的鏈路狀態包廣播出去,發送到整個網絡。這樣,當某個路由器收到從網絡中其它路由器廣播來的路由信息包(鏈路狀態包)之後,會將這個包中的信息與自己路由器上的信息進行拼裝,最終形成一個全網的拓撲視圖。

當路由器中形成了全網的拓撲視圖後,它就可以通過最短路徑演算法來計算當前節點到其它路由器之間的最短路徑了。當某台路由器的鏈路狀態發生變化時,路由器採用洪泛法向所有路由器發送此信息,其它路由器使用收到的信息重新計算最佳路徑,重新生成路由表(拓撲圖)。

這裡可以做一個類比,有一個路人甲人去問路,然後本地人A只知道A自己生活方圓5公里的地圖,本地人B只知道B自己生活的方圓5公里的地圖,但是路人甲要去的地方需要穿過A和B所在區域,那麼就把A和B的2份地圖拿來拼裝在一起,然後去往目的地的完整路線就可以查出來了。

鏈路狀態路由演算法簡單而言就是五個步驟:

  1. 發現鄰居節點,並瞭解鄰居網絡地址

  2. 測量到鄰居節點的距離或成本度量值

  3. 構建一個包含自己所擁有信息的鏈路狀態包

  4. 將這個包廣播到網絡中,並接收其它路由器的鏈路狀態包

  5. 計算出當前節點到其它節點之間的最短路徑(基於Dijkstra演算法)

鏈路狀態路由演算法 不會像 距離矢量路由演算法 那樣發送整個路由表,鏈路狀態路由協議只會廣播更新的或者改變了的網絡拓撲,這樣傳播的信息量會少很多,同時對帶寬和CPU資源也是一種節省。

「鏈路狀態路由演算法」具有很好的擴展能力,也具有更快的收斂速度,能夠快速的適應網絡變化,且由於一個路由器的鏈路狀態只涉及與其相鄰的路由器的聯通狀態,因而與整個互聯網的規模並無直接關係,因此鏈路狀態路由演算法可以用於大型的或者路由信息變化劇烈的互聯網環境。

將上述兩種演算法做一個簡單的對比:

圖片來源網絡,經供參考

以上,就是對計算機網絡中的動態路由演算法的基本講解了,歡迎大家一起交流。

【關於作者】


王奎:不止思考的技術人,一名駐扎在武漢互聯網的程式員老兵,我有一個公眾號 bzsikao 平時寫一些工作的心得和技術文章。


【關於投稿】


如果大家有原創好文投稿,請直接給公號發送留言。


① 留言格式:
【投稿】+《 文章標題》+ 文章鏈接

② 示例:
【投稿】
《不要自稱是程式員,我十多年的 IT 職場總結》:

http://blog.jobbole.com/94148/


③ 最後請附上您的個人簡介哈~

覺得本文有幫助?請分享給更多人

關註「演算法愛好者」,修煉編程內功

赞(0)

分享創造快樂