1. 程式人生 > >網路層核心:路由和路由生成演算法

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

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

路由就是通過互連的網路把資訊從源地址傳送到目的地址的活動。路由發生在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)

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 該路由表項對應的輸出介面 。