網絡層核心:路由和路由生成算法

一、路由和路由算法簡介:

路由就是通過互連的網絡把信息從源地址傳送到目的地址的活動。路由發生在OSI網絡參考模型的第三層即網絡層。

路由引導封包轉送,經過一些中間的節點後,到達目的地。把該功能做成硬件的話稱爲路由器。路由通常根據路由表來引導封包轉送。因此爲了有效率的轉送封包,建立存儲在路由器內存的路由表是非常重要的。路由與橋接的不同在於,路由假設地址相似的結點距離相近。這使得路由表中的一項紀錄可以表示到一組地址的路徑。

 

二、路由的基本原理:

1、路由的內涵:

      路由包含兩個基本動作:確定最佳路徑和通過網絡傳輸信息。

   (1)路徑選擇:metric是路由算法用已確定到達目的地最佳路徑的計量標準,如路徑長度。路由算法根據許多信息來填充路    由表,目的/下一跳地址對告知路由器到達目的的最佳方式是把分組發送給代表 “下一跳” 的路由器,當路由器收到一個分                   組,他就檢查其目標地址,嘗試將此地址與其 “下一跳” 相聯繫。

   (2)交換:交換算法相對比較簡單,對於大多數路由協議而言是相同,多數情況下,某主機向另一個主機發送數據,通過某              些方法獲得路由器地址後,源主機發送指向該路由器的物理地址的數據包,其協議地址指向目的主機。

2、路由算法的基本類型:

   (1)靜態與動態:靜態算法嚴格意義很難算得上是算法,只不過是開始路由器前由網管建立的表映射。此算法容易設計,在              網絡通信可預測及簡單的網絡中工作的很好,但不能適應網絡狀態變化。 動態路由算法可以適當的以靜態算法作爲補充,                可適應網絡狀態變化但開銷大、複雜。

   (2)單路徑與多路徑。

   (3)平坦與分層.。

   (4)主機智能與路由器智能。

   (5)域內與域間。

   (6)鏈接狀態與距離向量。

 

三、幾種常見的路由算法:

1、最短路徑優先算法------Dijstra算法:

 

迪傑斯特拉(Dijkstra)算法是典型最短路徑算法,用於計算一個節點到其他節點的最短路徑。 

 

它的主要特點是以起始點爲中心向外層層擴展(廣度優先搜索思想),直到擴展到終點爲止。

 

基本思想

 

     通過Dijkstra計算圖G中的最短路徑時,需要指定起點s(即從頂點s開始計算)。

 

     此外,引進兩個集合S和U。S的作用是記錄已求出最短路徑的頂點(以及相應的最短路徑長度),而U則是記錄還未求出最短路徑的頂點(以及該頂點到起點s的距離)。

 

     初始時,S中只有起點s;U中是除s之外的頂點,並且U中頂點的路徑是"起點s到該頂點的路徑"。然後,從U中找出路徑最短的頂點,並將其加入到S中;接着,更新U中的頂點和頂點對應的路徑。 然後,再從U中找出路徑最短的頂點,並將其加入到S中;接着,更新U中的頂點和頂點對應的路徑。 ... 重複該操作,直到遍歷完所有頂點。

 

 

 

操作步驟

 

(1) 初始時,S只包含起點s;U包含除s外的其他頂點,且U中頂點的距離爲"起點s到該頂點的距離"[例如,U中頂點v的距離爲(s,v)的長度,然後s和v不相鄰,則v的距離爲∞]。

 

(2) 從U中選出"距離最短的頂點k",並將頂點k加入到S中;同時,從U中移除頂點k。

 

(3) 更新U中各個頂點到起點s的距離。之所以更新U中頂點的距離,是由於上一步中確定了k是求出最短路徑的頂點,從而可以利用k來更新其它頂點的距離;例如,(s,v)的距離可能大於(s,k)+(k,v)的距離。

 

(4) 重複步驟(2)和(3),直到遍歷完所有頂點。

 

單純的看上面的理論可能比較難以理解,下面通過實例來對該算法進行說明。

 

 

迪傑斯特拉算法圖解

 

 

 

 

 

 

 

以上圖G4爲例,來對迪傑斯特拉進行算法演示(以第4個頂點D爲起點)。

 

 

 

初始狀態:S是已計算出最短路徑的頂點集合,U是未計算除最短路徑的頂點的集合! 

 

第1步:將頂點D加入到S中。 

 

    此時,S={D(0)}, U={A(∞),B(∞),C(3),E(4),F(∞),G(∞)}。     注:C(3)表示C到起點D的距離是3。

 

第2步:將頂點C加入到S中。 

 

    上一步操作之後,U中頂點C到起點D的距離最短;因此,將C加入到S中,同時更新U中頂點的距離。以頂點F爲例,之前F到D的距離爲∞;但是將C加入到S之後,F到D的距離爲9=(F,C)+(C,D)。 

 

    此時,S={D(0),C(3)}, U={A(∞),B(23),E(4),F(9),G(∞)}。

 

第3步:將頂點E加入到S中。 

 

    上一步操作之後,U中頂點E到起點D的距離最短;因此,將E加入到S中,同時更新U中頂點的距離。還是以頂點F爲例,之前F到D的距離爲9;但是將E加入到S之後,F到D的距離爲6=(F,E)+(E,D)。 

 

    此時,S={D(0),C(3),E(4)}, U={A(∞),B(23),F(6),G(12)}。

 

第4步:將頂點F加入到S中。 

 

    此時,S={D(0),C(3),E(4),F(6)}, U={A(22),B(13),G(12)}。

 

第5步:將頂點G加入到S中。 

 

    此時,S={D(0),C(3),E(4),F(6),G(12)}, U={A(22),B(13)}。

 

第6步:將頂點B加入到S中。 

 

    此時,S={D(0),C(3),E(4),F(6),G(12),B(13)}, U={A(22)}。

 

第7步:將頂點A加入到S中。 

 

    此時,S={D(0),C(3),E(4),F(6),G(12),B(13),A(22)}。

 

此時,起點D到各個頂點的最短距離就計算出來了:A(22) B(13) C(3) D(0) E(4) F(6) G(12)

 

Dijkstra算法(一)之 C語言詳解

2、擴散算法(Flooding)

 另一種靜態算法是擴散法 (flooding), 它把收到的每一個分組,從除了分組到來的線路外的所有輸出線路上發出。顯然擴散要產生大量的重

復分組,事實上有可能是無窮多個分組,除非採用一些措施抑制這種過程。一種措施是讓每個分組頭包含站點計數器,每經過一個站點,計數器

減1,當計數器值爲0時,就扔掉分組。理想的情況是計數器設置初值爲從源端到目的端的路徑長度。如果發送者不知道路徑的長度,它可以按

最糟糕的情況,即子網的直徑來設置初值。


  另一種方法是記錄下分組擴散的路徑,防止它第二次再擴散到已擴散的路徑中。達到這一目的的一種方法是讓源端路徑器在所接收的來自

主機的每一個分組中設置一個序號,每個路徑器對應於每個源端路由器有一張表,用來指明已見到的是源端生成的哪個序號,如果進入的分組

已在表中,則不再擴散。 

爲了防止該表無限制地增長,每個表應加一個計數器k作爲參數,表示直到k的序號都已看見。 當一個分組進入時,就能容易查出此分組是否爲

複製品;如果是,則扔掉此分組。而且, 低於k的表項都不再需要,因爲k已有效地綜合了各種因素。

  擴散法的一個稍爲實際的變種是選擇性擴散法(selective flooding)。在這種算法中,路由器並不將每一進來的分組從每一條輸出線路上發出

,而是僅發送到與正確方向接近的那些線路上。不太可能將一個應該向西傳送的分組傳送到向東的線路上去,除非拓撲結構極爲奇特。

  擴散法在很多應用中都未實際採用,但它還是有一些用處的。例如,在軍事應用中,大批的路由器隨時都可能被炸燬得所剩無幾,所以非常希

望採用具有很結實的擴散方式。在分佈式數據庫應用中,有時需要並行地更新所有數據庫,在這種情況下,擴散就非常有用。第三種可能的用途

是把它作爲一種尺度來衡量其他路由選擇算法。擴散總是選擇最短路徑,因爲它並行地選擇每一條可能的路徑。所以,沒有其他算法能產生一個

更短的延遲(如果我們忽略掉擴散過程本身產生的開銷)。

 

3、距離向量路由算法(Distance Vector Routing):

 

距離矢量路由算法(Distance Vector Routing,DV)是ARPANET網絡上最早使用的路由算法,也稱Bellman-Ford路由算法和Ford-Fulkerson算法,主要在RIP(Route Information Protocol)協議中使用。Cisco的IGRP和EIGRP路由協議也是採用DV這種路由算法的。 
    “距離矢量路由算法”的基本思想如下:每個路由器維護一個距離矢量(通常是以延時是作變量的)表,然後通過相鄰路由器之間的距離矢量通告進行距離矢量表的更新。每個距離矢量表項包括兩部分:到達目的結點的最佳輸出線路,和到達目的結點所需時間或距離,通信子網中的其它每個路由器在

表中佔據一個表項,並作爲該表項的索引。每隔一段時間,路由器會向所有鄰居結點發送它到每個目的結點的距離表,同時它也接收每個鄰居結點發來的距離表。這樣以此類推,經過一段時間後便可將網絡中各路由器所獲得的距離矢量信息在各路由器上統一起來,這樣各路由器只需要查看這個距

離矢量表就可以爲不同來源分組找到一條最佳的路由。 
      鏈路狀態路由協議是目前使用最廣的一類域內路由協議。它採用一種“拼圖”的設計策略,即每個路由器將它到其周圍鄰居的鏈路狀態向全網的其他路由器進行廣播。這樣,一個路由器收到從網絡中其他路由器發送過來的路由信息後,它對這些鏈路狀態進行拼裝,最終生成一個全網的拓撲視圖,

近而可以通過最短路徑算法來計算它到別的路由器的最短路徑。運行鏈路狀態路由協議的路由器, 每臺路由器公在其接口的狀態發生變化時,纔將變化後的狀態發送給其他所有路由器,每臺路由器都使用收到的信息重新計算前往每個網絡的最佳路徑,然後將這些信息存儲到自己的路由選擇表中。 

 

鏈路狀態路由算法背後的思想非常簡單,可以用5個基本步驟加以描述。 

 

1、發現他的鄰接點,並知道其網絡的地址。 

 

2、測量到各鄰接點的延遲或開銷。 

 

3、構造一個分組,分組中包含所有他剛剛收到的信息。

 

4、將這個分組發送給其他的路由器。 

 

5、計算出到每一個其他路由器的最短路徑。例如,每個路由器運行Dijkstra算法就可以找從它到每一個其他路由器的最短路徑。

 

4、鏈路狀態路由算法(Link State Routing):

鏈路狀態算法以圖論作爲理論基礎,用圖來表示網絡拓撲結構,並利用圖論中的最短路徑算法來計算網絡間的最佳

路由,因此鏈路狀態算法又被稱作最短路徑優先算法SPF。

 

 

鏈路狀態選路算法的工作原理如下

(1)在參與鏈路狀態選路的路由器集合中,每個路由器都需要通過某種機制來了解自己所連接的鏈路及其狀態。

(2)各路由器都能夠將其所連接的鏈路的狀態信息通知給網絡中的所有其他路由器,這些鏈路信息包括鏈路狀態、費用以及鏈路兩端的路由器等。

(3)鏈路狀態信息的通過鏈路狀態分組(LSP)來向整個網絡發佈。一個LSP通常包含源路由器的標識符、相鄰路由器的標識符,以及而知之間鏈路的費用。每一個LSP都將被

網絡中的所有的路由器接收,並用於建立網絡整體的統一拓撲數據庫。由於網絡中所有的路由器都發送LSP,經過一段時間以後,每一個路由器都保持了一張完整的網絡拓撲圖,

再在這個拓撲圖上,利用最短通路算法(例如Dijkstra算法等),路由器就可以計算出從任何源點到任何目的地的最佳通路。

這樣,每一個路由器都能夠利用通路最短的原則建立一個以本路由器爲根、分支到所有其他路由器的生成樹,依據這個生成樹就可以很容易地計算出本路由器的路由表

 

四、路由表查看:

 

 

使用下面的 route 命令可以查看 Linux 內核路由表。

 

# route

 

Destination  Gateway      Genmask          Flags Metric Ref Use Iface

 

192.168.0.0   *                 255.255.255.0  U        0         0     0    eth0

 

169.254.0.0   *                 255.255.0.0      U        0         0     0    eth0

 

default        192.168.0.1   0.0.0.0              UG     0         0     0    eth0

 

route 命令的輸出項說明

 

輸出項             說明 

 

Destination      目標網段或者主機 

 

Gateway          網關地址,”*” 表示目標是本主機所屬的網絡,不需要路由    

Genmask         網絡掩碼 

 

Flags               標記

 

 

 

一些可能的標記如下:

 

 U — 路由是活動的

 

 H — 目標是一個主機

 

 N — 目標時某個網段

 

 G — 路由指向網關 

 

 R — 恢復動態路由產生的表項 

 

 D — 由路由的後臺程序動態地安裝 

 

 M — 由路由的後臺程序修改

 

 ! — 拒絕路由 

 

Metric 路由距離,到達指定網絡所需的中轉數(linux 內核中沒有使用)。 

 

Ref 路由項引用次數(linux 內核中沒有使用)。

 

Use 此路由項被路由軟件查找的次數 。

 

Iface 該路由表項對應的輸出接口 。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章