淺談網絡層IP路由原理

路由與路由表

路由(route)就是分組在因特網上從一臺計算機傳輸到另一臺計算機的實際路徑。

因特網上的每個路由器都存儲有一張表,稱爲路由表(routing table),路由器正是依據路由表的內容將各個 IP 分組轉發到正確的去處。

注意:

  1. 路由器上的路由表反映的是該路由器與相鄰路由器之間的連接關係,以及任何一個可達網絡與某個鄰接路由器之間的“目標-經過”關係
  2. 一個路由器上的路由表從來不會反映該路由器與任何非相鄰路由器之間的連接關係
  3. 路由表每個表項中的IP默認爲目標網段的IP地址,而不是目標計算機的IP地址,這樣能夠最大限度地提高路由的效率

這裏有三個概念:路由,路由器,路由表。對於小白可能容易混淆,注意路由既可以指計算機之間的傳輸路徑,又可以指傳輸這一動態過程,而路由器是設備,即完成路由這一動態過程的設備,路由表是信息。是儲存在路由器中的用來路由的信息

 實際中由於路由器開發廠商的不同,路由表中的信息也不盡相同,但是幾乎都包含五項基本信息:

  1. 目標網絡的IP地址:32位,這裏在上文提到,是目標網絡的IP地址而非目標計算機的IP地址
  2. 目標網絡的子網掩碼:32位,即子網掩碼,沒什麼好解釋
  3. 下一跳IP地址:32位,如果目標網絡需經過多個路由器,下一跳即使下一個路由器的IP地址
  4. 離出接口名字:路由器會提供多個接口,每個接口通向不同的網段,所以表項中需要提供該項,即使確定IP分組從哪一個接口發出去,離出接口只是標識本路由器的信息,沒有過多的全局含義
  5. 度量:從該路由器到達目標網絡的代價,這個屬性反映這一路徑的優劣,由於路由協議的不同,該項具體數據形式也不同,常見的有跳數(途徑路由器的數量),當前往返時間,最窄鏈路帶寬等等

下面舉一個例子

 

上圖中白框即代表路由器,電腦標識即是主機,下面以路由器R2爲例,列舉出其路由表

首先對於最上方的主機或者網段而言,主機地址是202.39.2.65,根據IP首八位可以判斷出這是C類IP地址,即網絡號有三個八位,所以該網段爲202.39.2.0,子網掩碼爲255.255.255.0,因爲R2首先要經過R3才能到達該網段,下一站IP地址,即是所以R3近端的IP地址爲172.200.1.1(此處既然爲下一“站”,不難理解是一個具體的IP地址,而非一個網段,所以直接用給定的IP即可,不要化成172.200.0.0),離出接口,可以看出R2經上方I21口發出,離出接口可以填接口名,也可以填接口的IP地址,比如此處可以填I21,也可以填172.200.0.1,但是爲了簡潔通常填名稱即可,沒有給出名稱才考慮填寫出口的IP地址。因爲到達最上方網段需要經過一個路由器,這裏度量就認定爲1。而對於主機B或主機C所在的網段,其間不需經過其他的路由器,像這種直連的網段,下一站IP地址項默認填C表示直連,度量默認填0(上文也提到過實際中度量的標準會有不同,就算都用跳數這一標準,有一些將直連的度量認爲是1,而有些認爲是0,所以在具體環境中具體區分即可,對於直連跳數認爲是1的,那麼其他的跳數也相應都+1)

以此類推,可求出R2的所有表項

表中的最後一項目標地址設爲0.0.0.0,稱爲默認路由項,也叫做缺省路由項,即是路由器一旦不知道應該向哪裏轉發IP分組(比如上面四項的目標地址都不匹配),就按照這一項發出,這一項的參數也是根據實際靈活改變

路由器與IP分組轉發算法

上文中提到了路由器就是完成路由過程的設備,從構成上看,它是一個完整的計算機系統,包括硬件,操作系統和應用軟件算法,與通用計算機系統的不同之處就在於,路由器硬件以通訊處理爲主要設計目標,特別是 I/O部分;路由器操作系統也主要針對協議處理及通訊功能進行了優化,這一點與支持通用計算的分時系統如 Windows NT、UNIX 不同,而是更偏向於實時處理能力。

IP分組即是IP包,或者說IP報文,因爲引入的名字叫做IP Packet,有些翻譯爲分組,其實是IP信息的涵義,下面給出IP分組轉發算法的邏輯結構:

 IP_Packet_Routing(IP 分組 P) { 
     int found = FALSE; 
     A=P 的目標IP 地址; 
     for( 每個非默認路由項(D, M, N, I, d) ) { 
        /*D 是目標網絡的IP 地址, M 是子網掩碼, N 是下一站路由器的IP 地址, 
        I 是離出接口, d 是路由的性能度量 */ 
        if(A&M==D 2 ) { /* & 是逐位邏輯與 */ 
             if( d 表示P 的目標網絡並非鄰接) { /* 例如, d 表示網絡距離且d>0. */ 
             將隊列項[N, P]放入接口I 的離出隊列; 
             /*[N, P]的涵義是: 將分組P 載入數據鏈路幀, 幀的目標MAC 地址 
            與IP 地址 N 對應. */ 
             } else { /* d 表示目標網絡就是接口I 連接的鄰接網段, 例如, 
                    d 表示網絡距離且d=0.*/ 
                     將隊列項[A, P]放入接口I 的離出隊列; /* 涵義同上 */ 
             } 
            found = TRUE; 
            break; 
        } /* if…*/ 
    } /* for…*/ 
    if( ! found ) { /* 假設默認路由項是(0.0.0.0, 0.0.0.0, N*, I*, -) */ 
     將隊列項[N*, P]放入接口I*的離出隊列; /*涵義同上*/ 
    } 
 } 

 

IP_Packet_Routing 算法被分組轉發進程調用: 
 while(1) { /*無限循環*/ 
     P=get_IP_Packet(); /*取一個到達的IP 分組*/ 
     IP_Packet_Routing(P); /*路由檢索*/ 
     output_IP_Packet(P); /*發送分組*/ 
 } 

注意: IP 分組在接受路由器處理、經過一個一個路由器傳輸的過程中,其源IP 地址和目標 IP 地址始終不變,發生變化的是其承載幀的源 MAC 地址等中間信息

有關動態路由以及動態路由協議+算法的內容,感興趣的請移步我的另一篇筆記

 

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