路由追蹤/路由器原理
1.網路互連
把自己的網路同其他的網路互連起來,從網路中獲取更多的資訊和向網路發佈自己的消息,是網路互連的最主要的動力。網路的互連有多種方式,其中使用最多的是網橋互連和路由器互連。
1.1 網橋互連的網路
網橋工作在OSI模型中的第二層,即鏈路層。完成資料幀(frame)的轉發,主要目的是在連接的網路間提供透明的通信。網橋的轉發是依據資料幀中的源位址和目的地址來判斷一個幀是否應轉發和轉發到哪個埠。幀中的位址稱為“MAC”位址或“硬體”位址,一般就是網卡所帶的位址。
網橋的作用是把兩個或多個網路互連起來,提供透明的通信。網路上的設備看不到網橋的存在,設備之間的通信就如同在一個網上一樣方便。由於網橋是在資料幀上進行轉發的,因此只能連接相同或相似的網路(相同或相似結構的資料幀),如乙太網之間、乙太網與權杖環(token ring)之間的互連,對於不同類型的網路(資料幀結構不同),如乙太網與X.25之間,網橋就無能為力了。
網橋擴大了網路的規模,提高了網路的性能,給網路應用帶來了方便,在以前的網路中,網橋的應用較為廣泛。但網橋互連也帶來了不少問題:一個是廣播風暴,網橋不阻擋網路中廣播消息,當網路的規模較大時(幾個網橋,多個乙太網段),有可能引起廣播風暴(broadcasting storm),導致整個網路全被廣播資訊充滿,直至完全癱瘓。第二個問題是,當與外部網路互連時,網橋會把內部和外部網路合二為一,成為一個網,雙方都自動向對方完全開放自己的網路資源。這種互連方式在與外部網路互連時顯然是難以接受的。問題的主要根源是網橋只是最大限度地把網路溝通,而不管傳送的資訊是什麼。
1.2 路由器互連網路
路由器互連與網路的協定有關,我們討論限於TCP/IP網路的情況。
路由器工作在OSI模型中的第三層,即網路層。路由器利用網路層定義的“邏輯”上的網路位址(即IP位址)來區別不同的網路,實現網路的互連和隔離,保持各個網路的獨立性。路由器不轉發廣播消息,而把廣播消息限制在各自的網路內部。發送到其他網路的資料茵先被送到路由器,再由路由器轉發出去。
IP路由器只轉發IP分組,把其餘的部分擋在網內(包括廣播),從而保持各個網路具有相對的獨立性,這樣可以組成具有許多網路(子網)互連的大型的網路。由於是在網路層的互連,路由器可方便地連接不同類型的網路,只要網路層運行的是IP協議,通過路由器就可互連起來。
網路中的設備用它們的網路位址(TCP/IP網路中為IP位址)互相通信。IP位址是與硬體位址無關的“邏輯”位址。路由器只根據IP位址來轉發資料。IP位址的結構有兩部分,一部分定義網路號,另一部分定義網路內的主機號。目前,在Internet網路中採用子網路遮罩來確定IP位址中網路位址和主機位址。子網路遮罩與IP地址一樣也是32bit,並且兩者是一一對應的,並規定,子網路遮罩中數字為“1”所對應的IP位址中的部分為網路號,為“0”所對應的則為主機號。網路號和主機號合起來,才構成一個完整的IP位址。同一個網路中的主機IP位址,其網路號必須是相同的,這個網路稱為IP子網。
通信只能在具有相同網路號的IP位址之間進行,要與其他IP子網的主機進行通信,則必須經過同一網路上的某個路由器或閘道(gateway)出去。不同網路號的IP位址不能直接通信,即使它們接在一起,也不能通信。
路由器有多個埠,用於連接多個IP子網。每個埠的IP位址的網路號要求與所連接的IP子網的網路號相同。不同的埠為不同的網路號,對應不同的IP子網,這樣才能使各子網中的主機通過自己子網的IP地址把要求出去的IP分組送到路由器上。
2.路由原理
當IP子網中的一台主機發送IP分組給同一IP子網的另一台主機時,它將直接把IP分組送到網路上,對方就能收到。而要送給不同IP於網上的主機時,它要選擇一個能到達目的子網上的路由器,把IP分組送給該路由器,由路由器負責把IP分組送到目的地。如果沒有找到這樣的路由器,主機就把IP分組送給一個稱為“缺省閘道(default gateway)”的路由器上。“缺省閘道”是每台主機上的一個配置參數,它是接在同一個網路上的某個路由器埠的IP位址。
路由器轉發IP分組時,只根據IP分組目的IP位址的網路號部分,選擇合適的埠,把IP分組送出去。同主機一樣,路由器也要判定埠所接的是否是目的子網,如果是,就直接把分組通過埠送到網路上,否則,也要選擇下一個路由器來傳送分組。路由器也有它的缺省閘道,用來傳送不知道往哪兒送的IP分組。這樣,通過路由器把知道如何傳送的IP分組正確轉發出去,不知道的IP分組送給“缺省閘道”路由器,這樣一級級地傳送,IP分組最終將送到目的地,送不到目的地的IP分組則被網路丟棄了。
目前TCP/IP網路,全部是通過路由器互連起來的,Internet就是成千上萬個IP子網通過路由器互連起來的國際性網路。這種網路稱為以路由器為基礎的網路(router based network),形成了以路由器為節點的“網間網”。在“網間網”中,路由器不僅負責對IP分組的轉發,還要負責與別的路由器進行聯絡,共同確定“網間網”的路由選擇和維護路由表。
路由動作包括兩項基本內容:尋徑和轉發。尋徑即判定到達目的地的最佳路徑,由路由選擇演算法來實現。由於涉及到不同的路由選擇協定和路由選擇演算法,要相對複雜一些。為了判定最佳路徑,路由選擇演算法必須啟動並維護包含路由資訊的路由表,其中路由資訊依賴於所用的路由選擇演算法而不盡相同。路由選擇演算法將收集到的不同資訊填入路由表中,根據路由表可將目的網路與下一站(nexthop)的關係告訴路由器。路由器間互通資訊進行路由更新,更新維護路由表使之正確反映網路的拓撲變化,並由路由器根據量度來決定最佳路徑。這就是路由選擇協議(routing protocol),例如路由資訊協定(RIP)、開放式最短路徑優先協定(OSPF)和邊界閘道協議(BGP)等。
轉發即沿尋徑好的最佳路徑傳送資訊分組。路由器首先在路由表中查找,判明是否知道如何將分組發送到下一個站點(路由器或主機),如果路由器不知道如何發送分組,通常將該分組丟棄;否則就根據路由表的相應表項將分組發送到下一個站點,如果目的網路直接與路由器相連,路由器就把分組直接送到相應的埠上。這就是路由轉發協議(routed protocol)。
路由轉發協定和路由選擇協定是相互配合又相互獨立的概念,前者使用後者維護的路由表,同時後者要利用前者提供的功能來發佈路由協定資料分組。下文中提到的路由協議,除非特別說明,都是指路由選擇協議,這也是普遍的習慣。
3.路由協議
典型的路由選擇方式有兩種:靜態路由和動態路由。
靜態路由是在路由器中設置的固定的路由表。除非網路管理員干預,否則靜態路由不會發生變化。由於靜態路由不能對網路的改變作出反映,一般用於網路規模不大、拓撲結構固定的網路中。靜態路由的優點是簡單、高效、可靠。在所有的路由中,靜態路由優先順序最高。當動態路由與靜態路由發生衝突時,以靜態路由為准。
動態路由是網路中的路由器之間相互通信,傳遞路由資訊,利用收到的路由資訊更新路由器表的過程。它能即時地適應網路結構的變化。如果路由更新資訊表明發生了網路變化,路由選擇軟體就會重新計算路由,並發出新的路由更新資訊。這些資訊通過各個網路,引起各路由器重新啟動其路由演算法,並更新各自的路由表以動態地反映網路拓撲變化。動態路由適用於網路規模大、網路拓撲複雜的網路。當然,各種動態路由協定會不同程度地佔用網路帶寬和CPU資源。
靜態路由和動態路由有各自的特點和適用範圍,因此在網路中動態路由通常作為靜態路由的補充。當一個分組在路由器中進行尋徑時,路由器首先查找靜態路由,如果查到則根據相應的靜態路由轉發分組;否則再查找動態路由。
根據是否在一個自治域內部使用,動態路由協定分為內部閘道協定(IGP)和外部閘道協議(EGP)。這裏的自治域指一個具有統一管理機構、統一路由策略的網路。自治域內部採用的路由選擇協定稱為內部閘道協定,常用的有RIP、OSPF;外部閘道協議主要用於多個自治域之間的路由選擇,常用的是BGP和BGP-4。下面分別進行簡要介紹。
3.1 RIP路由協議
RIP協定最初是為Xerox網路系統的Xerox parc通用協定而設計的,是Internet中常用的路由協議。RIP採用距離向量演算法,即路由器根據距離選擇路由,所以也稱為距離向量協議。路由器收集所有可到達目的地的不同路徑,並且保存有關到達每個目的地的最少站點數的路徑資訊,除到達目的地的最佳路徑外,任何其他資訊均予以丟棄。同時路由器也把所收集的路由資訊用RIP協定通知相鄰的其他路由器。這樣,正確的路由資訊逐漸擴散到了全網。
RIP使用非常廣泛,它簡單、可靠,便於配置。但是RIP只適用於小型的同構網路,因為它允許的最大站點數為15,任何超過15個站點的目的地均被標記為不可達。而且RIP每隔30s一次的路由資訊廣播也是造成網路的廣播風暴的重要原因之一。
3.2 OSPF路由協議
80年代中期,RIP已不能適應大規模異構網路的互連,0SPF隨之產生。它是網間工程任務組織(1ETF)的內部閘道協定工作組為IP網路而開發的一種路由協議。
0SPF是一種基於鏈路狀態的路由協定,需要每個路由器向其同一管理域的所有其他路由器發送鏈路狀態廣播資訊。在OSPF的鏈路狀態廣播中包括所有介面資訊、所有的量度和其他一些變數。利用0SPF的路由器首先必須收集有關的鏈路狀態資訊,並根據一定的演算法計算出到每個節點的最短路徑。而基於距離向量的路由協議僅向其鄰接路由器發送有關路由更新資訊。
與RIP不同,OSPF將一個自治域再劃分為區,相應地即有兩種類型的路由選擇方式:當源和目的地在同一區時,採用區內路由選擇;當源和目的地在不同區時,則採用區間路由選擇。這就大大減少了網路開銷,並增加了網路的穩定性。當一個區內的路由器出了故障時並不影響自治域內其他區路由器的正常工作,這也給網路的管理、維護帶來方便。
3.3 BGP和BGP-4路由協議
BGP是為TCP/IP互聯網設計的外部閘道協議,用於多個自治域之間。它既不是基於純粹的鏈路狀態演算法,也不是基於純粹的距離向量演算法。它的主要功能是與其他自治域的BGP交換網路可達資訊。各個自治域可以運行不同的內部閘道協議。BGP更新資訊包括網路號/自治域路徑的成對資訊。自治域路徑包括到達某個特定網路須經過的自治域串,這些更新資訊通過TCP傳送出去,以保證傳輸的可靠性。
為了滿足Internet日益擴大的需要,BGP還在不斷地發展。在最新的BGp4中,還可以將相似路由合併為一條路由。
3.4 路由表項的優先問題
在一個路由器中,可同時配置靜態路由和一種或多種動態路由。它們各自維護的路由表都提供給轉發程式,但這些路由表的表項間可能會發生衝突。這種衝突可通過配置各路由表的優先順序來解決。通常靜態路由具有默認的最高優先順序,當其他路由表表項與它矛盾時,均按靜態路由轉發。
4.路由演算法
路由演算法在路由協定中起著至關重要的作用,採用何種演算法往往決定了最終的尋徑結果,因此選擇路由演算法一定要仔細。通常需要綜合考慮以下幾個設計目標:
(1)最優化:指路由演算法選擇最佳路徑的能力。
(2)簡潔性:演算法設計簡潔,利用最少的軟體和開銷,提供最有效的功能。
(3)堅固性:路由演算法處於非正常或不可預料的環境時,如硬體故障、負載過高或操作失誤時,都能正確運行。由於路由器分佈在網路聯接點上,所以在它們出故障時會產生嚴重後果。最好的路由器演算法通常能經受時間的考驗,並在各種網路環境下被證實是可靠的。
(4)快速收斂:收斂是在最佳路徑的判斷上所有路由器達到一致的過程。當某個網路事件引起路由可用或不可用時,路由器就發出更新資訊。路由更新資訊遍及整個網路,引發重新計算最佳路徑,最終達到所有路由器一致公認的最佳路徑。收斂慢的路由演算法會造成路徑迴圈或網路中斷。
(5)靈活性:路由演算法可以快速、準確地適應各種網路環境。例如,某個網段發生故障,路由演算法要能很快發現故障,並為使用該網段的所有路由選擇另一條最佳路徑。
路由演算法按照種類可分為以下幾種:靜態和動態、單路和多路、平等和分級、源路由和透明路由、域內和域間、鏈路狀態和距離向量。前面幾種的特點與字面意思基本一致,下面著重介紹鏈路狀態和距離向量演算法。
鏈路狀態演算法(也稱最短路徑演算法)發送路由資訊到互聯網上所有的結點,然而對於每個路由器,僅發送它的路由表中描述了其自身鏈路狀態的那一部分。距離向量演算法(也稱為Bellman-Ford演算法)則要求每個路由器發送其路由表全部或部分資訊,但僅發送到鄰近結點上。從本質上來說,鏈路狀態演算法將少量更新資訊發送至網路各處,而距離向量演算法發送大量更新資訊至鄰接路由器。
由於鏈路狀態演算法收斂更快,因此它在一定程度上比距離向量演算法更不易產生路由迴圈。但另一方面,鏈路狀態演算法要求比距離向量演算法有更強的CPU能力和更多的記憶體空間,因此鏈路狀態演算法將會在實現時顯得更昂貴一些。除了這些區別,兩種演算法在大多數環境下都能很好地運行。
最後需要指出的是,路由演算法使用了許多種不同的度量標準去決定最佳路徑。複雜的路由演算法可能採用多種度量來選擇路由,通過一定的加權運算,將它們合併為單個的複合度量、再填入路由表中,作為尋徑的標準。通常所使用的度量有:路徑長度、可靠性、時延、帶寬、負載、通信成本等。
5.新一代路由器
由於多媒體等應用在網路中的發展,以及ATM、快速乙太網等新技術的不斷採用,網路的帶寬與速率飛速提高,傳統的路由器已不能滿足人們對路由器的性能要求。因為傳統路由器的分組轉發的設計與實現均基於軟體,在轉發過程中對分組的處理要經過許多環節,轉發過程複雜,使得分組轉發的速率較慢。另外,由於路由器是網路互連的關鍵設備,是網路與其他網路進行通信的一個“關口”,對其安全性有很高的要求,因此路由器中各種附加的安全措施增加了CPU的負擔,這樣就使得路由器成為整個互聯網上的“瓶頸”。
傳統的路由器在轉發每一個分組時,都要進行一系列的複雜操作,包括路由查找、訪問控制表匹配、位址解析、優先順序管理以及其他的附加操作。這一系列的操作大大影響了路由器的性能與效率,降低了分組轉發速率和轉發的吞吐量,增加了CPU的負擔。而經過路由器的前後分組間的相關性很大,具有相同目的地址和源位址的分組往往連續到達,這為分組的快速轉發提供了實現的可能與依據。新一代路由器,如IP Switch、Tag Switch等,就是採用這一設計思想用硬體來實現快速轉發,大大提高了路由器的性能與效率。
新一代路由器使用轉發緩存來簡化分組的轉發操作。在快速轉發過程中,只需對一組具有相同目的地址和源位址的分組的前幾個分組進行傳統的路由轉發處理,並把成功轉發的分組的目的地址、源地址和下一閘道地址(下一路由器地址)放人轉發緩存中。當其後的分組要進行轉發時,茵先查看轉發緩存,如果該分組的目的地址和源位址與轉發緩存中的匹配,則直接根據轉發緩存中的下一閘道位址進行轉發,而無須經過傳統的複雜操作,大大減輕了路由器的負擔,達到了提高路由器吞吐量的目標。
最簡單的網路可以想像成單線的匯流排,各個電腦可以通過向匯流排發送分組以互相通信。但隨著網路中的電腦數目增長,這就很不可行了,會產 生許多問題:
1 、帶寬資源耗盡。
2 、每台電腦都浪費許多時間處理無關的廣播資料。
3 、網路變得無法管理,任何錯誤都可能導致整個網路癱瘓。
4 、每台電腦都可以監聽到其他電腦的通信。
把網路分段可以解決這些問題,但同時你必須提供一種機制使不同網段的電腦可以互相通信,這通常涉及到在一些 ISO 網路協定層選擇性地在網段間傳送資料,我們來看一下網路協定層和路由器的位置。
我們可以看到,路由器位於網路層。本文假定網路層協定為 IPv4 ,因為這是最流行的協議,其中涉及的概念與其他網路層協定是類似的。
一、路由與橋接
路由相對於 2 層的橋接 / 交換是高層的概念,不涉及網路的物理細節。在可路由的網路中,每台主機都有同樣的網路層位址格式(如 IP 位址),而無論它是運行在乙太網、權杖環、 FDDI 還是廣域網。網路層位址通常由兩部分構成:網路位址和主機位址。
網橋只能連接資料連結層相同(或類似)的網路,路由器則不同,它可以連接任意兩種網路,只要主機使用的是相同的網路層協定。
二、連接網路層與資料連結層
網路層下面是資料連結層,為了它們可以互通,需要“粘合”協定。 ARP (位址解析協定)用於把網路層 (3 層 ) 位址映射到資料連結層 (2 層 ) 地址, RARP( 反向位址解析協議 ) 則反之。
雖然 ARP 的定義與網路層協定無關,但它通常用於解析 IP 位址;最常見的資料連結層是乙太網。因此下面的 ARP 和 RARP 的例子基於 IP 和乙太網,但要注意這些概念對其他協議也是一樣的。
1 、位址解析協議
網路層位址是由網路管理員定義的抽象映射,它不去關心下層是哪種資料連結層協議。然而,網路介面只能根據 2 層位址來互相通信, 2 層地址通過 ARP 從 3 層地址得到。
並不是發送每個資料包都需要進行 ARP 請求,回應被緩存在本地的 ARP 表中,這樣就減少了網路中的 ARP 包。 ARP 的維護比較容易,是一個比較簡單的協議。
2 、簡介
如果介面 A 想給介面 B 發送資料,並且 A 只知道 B 的 IP 位址,它必須首先查找 B 的物理位址,它發送一個含有 B 的 IP 位址的 ARP 廣播請求 B 的物理位址,介面 B 收到該廣播後,向 A 回應其物理位址。
注意,雖然所有介面都收到了資訊,但只有 B 回應該請求,這保證了回應的正確且避免了過期的資訊。要注意的是,當 A 和 B 不在同一網段時, A 只向下一跳的路由器發送 ARP 請求,而不是直接向 B 發送。
下圖為接收到 ARP 分組後的處理,注意發送者的 對被存到接收 ARP 請求的主機的本地 ARP 表中,一般 A 想與 B 通信時, B 可能也需要與 A 通信。
三、 IP 地址
在可路由的網路層協定中,協定位址必須含有兩部分資訊:網路位址和主機位址。存貯這種資訊最明顯的方法是用兩個分離的域,這樣我們必須考慮到兩個域的最大長度,有些協議 ( 如 IPX) 就是這樣的,它在小型和中型的網路裏可以工作的很好。
另一種方案是減少主機位址域的長度,如 24 位網路位址、 8 位元主機位址,這樣就有了較多的網段,但每個網段內的主機數目很少。這樣一來,對於多於 256 個主機的網路,就必須分配多個網段,其問題是很多的網路給路由器造成了難以忍受的負擔。
IP 把網路位址和主機位址一起包裝在一個 32 位的域裏,有時主機位址部分很短,有時很長,這樣可以有效利用位址空間,減少 IP 位址的長度,並且網路數目不算多。有兩種將主機位址分離出來的方法:基於類的位址和無類別的位址。
1 、主機和閘道
主機和閘道的區別常產生混淆,這是由於主機意義的轉變。在 RFC 中 (1122/3 和 1009) 中定義為:
主機是連接到一個或多個網路的設備,它可以向任何一個網路發送和從其接收資料,但它從不把資料從一個網路傳向另一個。
閘道是連接到多於一個網路的設備,它選擇性的把資料從一個網路轉發到其他網路。
換句話說,過去主機和閘道的概念被人工地區分開來,那時電腦沒有足夠的能力同時用作主機和閘道。主機是用戶工作的電腦,或是檔伺服器等。現代的電腦的能力足以同時擔當這兩種角色,因此,現代的主機定義應該如此:
主機是連接到一個或多個網路的設備,它可以向任何一個網路發送和從其接收資料。它也可以作為閘道,但這不是其唯一的目的。
路由器是專用的閘道,其硬體經過特殊的設計使其能以極小的延遲轉發大量的資料。然而,閘道也可以是有多個網卡的標準的電腦,其作業系統的網路層有能力轉發資料。由於專用的路由硬體較便宜,電腦用作閘道已經很少見了,在只有一個撥號連接的小站點裏,還可能使用電腦作為非專用的閘道。
2 、基於類的位址
最初設計 IP 時,位址根據第一個位元組被分成幾類:
0: 保留
1-126: A 類 ( 網路位址 :1 位元組,主機位址 :3 位元組 )
127: 保留
128-191: B 類 ( 網路位址 :2 位元組,主機位址 :2 位元組 )
192-223: C 類 ( 網路位址 :3 位元組,主機位址 :1 位元組 )
224-255: 保留
3 、子網劃分
雖然基於類的位址系統對網際網路服務提供商來說工作得很好,但它不能在一個網路內部做任何路由,其目的是使用第二層 ( 橋接 / 交換 ) 來導引網路中的資料。在大型的 A 類網路中,這就成了個特殊的問題,因為在大型網路中僅使用橋接 / 交換使其非常難以管理。在邏輯上其解決辦法是把大網路分割成若干小的網路,但在基於類的位址系統中這是不可能的。為了解決這個問題,出現了一個新的域:子網路遮罩。子網路遮罩指出位址中哪些部分是網路位址,哪些是主機位址。在子網路遮罩中,二進位 1 表示網路位址位元,二進位 0 表示主機位址位元。傳統的各類地址的子網路遮罩為:
A 類: 255.0.0.0
B 類: 255.255.0.0
C 類: 255.255.255.0
如果想把一個 B 類網路的位址用作 C 類大小的位址,可以使用遮罩 255.255.255.0 。
用較長的子網路遮罩把一個網路分成多個網路就叫做劃分子網。要注意的是,一些舊軟體不支援子網,因為它們不理解子網路遮罩。例如 UNIX 的 routed 路由守護進程通常使用的路由協定是版本 1 的 RIP ,它是在子網路遮罩出現前設計的。
上面只介紹了三種子網路遮罩: 255.0.0.0 、 255.255.0.0 和 255.255.255.0 ,它們是位元組對齊的子網路遮罩。但是也可以在位元組中間對其進行劃分,這裏不進行詳細講解,請參照相關的 TCP/IP 書籍。
子網使我們可以擁有新的規模的網路,包括很小的用於點到點連接的網路(如遮罩 255.255.255.252 , 30 位的網路位址, 2 位元的主機位址:兩個主機的子網),或中型網路(如遮罩 255.255.240.0 , 20 位網路位址, 12 位元主機位址: 4094 個主機的子網)。
注意 DNS 被設計為只允許位元組對齊的 IP 網路 ( 在 in-addr.arpa. 域中 ) 。
4 、超網 (supernetting)
超網是與子網類似的概念 --IP 位址根據子網路遮罩被分為獨立的網路位址和主機位址。但是,與子網把大網路分成若干小網路相反,它是把一些小網路組合成一個大網路 -- 超網。
假設現在有 16 個 C 類網路,從 201.66.32.0 到 201.66.47.0 ,它們可以用子網路遮罩 255.255.240.0 統一表示為網路 201.66.32.0 。但是,並不是任意的位址組都可以這樣做,例如 16 個 C 類網路 201.66.71.0 到 201.66.86.0 就不能形成一個統一的網路。不過這其實沒關係,只要策略得當,總能找到合適的一組地址的。
5 、可變長子網路遮罩 (VLSM)
如果你想把你的網路分成多個不同大小的子網,可以使用可變長子網路遮罩,每個子網可以使用不同長度的子網路遮罩。例如:如果你按部門劃分網路,一些網路的遮罩可以為 255.255.255.0( 多數部門 ) ,其他的可為 255.255.252.0( 較大的部門 ) 。
6 、無類別地址 (CIDR)
網際網路上的主機數量增長超出了原先的設想,雖然還遠沒達到 232 ,但地址已經出現匱乏。 1993 年發表的 RFC1519-- 無類別域間路由 CIDR(Classless Inter-Domain Routing)-- 是一個嘗試解決此問題的方法。 CIDR 試圖延長 IPv4 的壽命,與 128 位位址的 IPv6 不同,它並不能最終解決位址空間的耗盡,但 IPv6 的實現是個龐大的任務,網際網路目前還沒有做好準備。 CIDR 給了我們緩衝的準備時間。
基於類的位址系統工作的不錯,它在有效的位址使用和少量的網路數目間做出了較好的折衷。但是隨著網際網路意想不到的成長出現了兩個主要的問題:
已分配的網路數目的增長使路由表大得難以管理,相當程度上降低了路由器的處理速度。
僵化的地址分配方案使很多地址被浪費,尤其是 B 類地址十分匱乏。
為了解決第二個問題,可以分配多個較小的網路,例如,用多個 C 類網路而不是一個 B 類網路。雖然這樣能夠很有效地分配位址,但是更加劇了路由表的膨脹(第一個問題)。
在 CIDR 中,位址根據網路拓撲來分配。連續的一組網路位址可以被分配給一個服務提供商,使整組位址作為一個網路位址(很可能使用超網技術)。例如:一個服務提供商被分配以 256 個 C 類地址,從 213.79.0.0 到 213.79.255.0 ,服務提供商給每個用戶分配一個 C 類位址,但服務提供商外部的路由表只通過一個表項 -- 遮罩為 255.255.0.0 的網路 213.79.0.0-- 來分辨這些路由。
這種方法明顯減少了路由表的增長, CIDR RFC 的作者估計,如果 90% 的服務提供商使用了 CIDR ,路由表將以每 3 年 54% 的速度增長,而如果沒有使用 CIDR ,則增長速度為 776% 。如果可以重新組織現有的位址,則網際網路骨幹上的路由器廣播的路由數量將大大減少。但這實際是不可行的,因為將帶來巨大的管理負擔。
四、路由
1、路由表
如果一個主機有多個網路介面,當向一個特定的IP位址發送分組時,它怎樣決定使用哪個介面呢?答案就在路由表中。來看下面的例子:
目的
遮罩
閘道
標誌
介面
201.66.37.0 255.255.255.0 201.66.37.74 U eth0
201.66.39.0 255.255.255.0 201.66.39.21 U eth1
主機將所有目的地為網路201.66.37.0內主機(201.66.37.1-201.66.37.254)的資料通過介面eth0(IP位址為201.66.37.74)發送,所有目的地為網路201.66.39.0內主機的資料通過介面eth1(IP位址為201.66.39.21)發送。標誌U表示該路由狀態為“up”(即啟動狀態)。對於直接連接的網路,一些軟體並不象上例中一樣給出介面的IP位址,而只列出介面。
此例只涉及了直接連接的主機,那麼目的主機在遠端網路中如何呢?如果你通過IP位址為201.66.37.254的閘道連接到網路73.0.0.0,那麼你可以在路由表中增加這樣一項:
目的
遮罩
閘道
標誌
介面
73.0.0.0
255.0.0.0
201.66.37.254
UG
eth0
此項告訴主機所有目的地為網路73.0.0.0內主機的分組通過201.66.37.254路由過去。標誌G(gateway)表示此項把分組導向外部閘道。類似的,也可以定義通過閘道到達特定主機的路由,增加標誌H(host):
目的
遮罩
閘道
標誌
介面
91.32.74.21 255.255.255.255 201.66.37.254 UGH eth0
下面是路由表的基礎,除了特殊表項之外:
目的
遮罩
閘道
標誌
介面
127.0.0.1 255.255.255.255 127.0.0.1 UH lo0
default 0.0.0.0 201.66.37.254 UG eth1
第一項是loopback介面,用於主機給自己發送資料,通常用於測試和運行於IP之上但需要本地通信的應用。這是到特定位址127.0.0.1的主機路由(介面lo0是IP協定棧內部的“假”網卡)。第二項十分有意思,為了防止在主機上定義到網際網路上每一個可能到達網路的路由,可以定義一個缺省路由,如果在路由表中沒有與目的地址相匹配的項,該分組就被送到缺省閘道。多數主機簡單地通過一個網卡連接到網路,因此只有通過一個路由器到其他網路,這樣在路由表中只有三項:loopback項、本地子網項和缺省項(指向路由器)。
2、重疊路由
假設在路由表中有下列重疊項:
目的
遮罩
閘道
標誌
介面
1.2.3.4 255.255.255.255 201.66.37.253 UGH eth0
1.2.3.0 255.255.255.0 201.66.37.254 UG eth0
1.2.0.0 255.255.0.0 201.66.37.253 UG eth1
default 0.0.0.0 201.66.39.254 UG eth1
之所以說這些路由重疊是因為這四個路由都含有位址1.2.3.4,如果向1.2.3.4發送資料,會選擇哪條路由呢?在這種情況下,會選擇第一條路由,通過閘道201.66.37.253。原則是選擇具有最長(最精確)的子網路遮罩。類似的,發往1.2.3.5的資料選擇第二條路由。
注意:這條原則只適用于間接路由(通過閘道)。把兩個介面定義在同一子網在很多軟體實現上是非法的。例如下面的設置通常是非法的(不過有些軟體將嘗試在兩個介面進行負載平衡):
介面
IP地址
子網路遮罩
eth0 201.66.37.1 255.255.255.0
eth1 201.66.37.2 255.255.255.0
對於重疊路由的策略是十分有用的,它允許缺省路由作為目的為0.0.0.0、子網路遮罩為0.0.0.0的路由進行工作,而不需要作為路由軟體的一個特殊情況來實現。
回頭來看看CIDR,仍使用上面的例子:一個服務提供商被賦予256個C類網路,從213.79.0.0到213.79.255.0。該服務提供商外部的路由表只以一個表項就瞭解了所有這些路由:213.79.0.0,子網路遮罩為255.255.0.0。假設一個用戶移到了另一個服務提供商,他擁有網路位址213.79.61.0,現在他是否必須從新的服務提供商處取得新的網路位址呢?如果是,意味著他必須重新配置每台主機的IP位址,改變DNS設置,等等。幸運的是,解決辦法很簡單,原來的服務提供商保持路由213.79.0.0(子網路遮罩為255.255.0.0),新的服務提供商則廣播路由213.79.61.0(子網路遮罩為255.255.255.0),因為新路由的子網路遮罩較長,它將覆蓋原來的路由。
3、靜態路由
回頭看看我們已建立的路由表,已有了六個表項:
目的
遮罩
閘道
標誌
介面
127.0.0.1 255.255.255.255 127.0.0.1 UH lo0
201.66.37.0 255.255.255.0 201.66.37.74 U eth0
201.66.39.0 255.255.255.0 201.66.39.21 U eth1
default 0.0.0.0 201.66.39.254 UG eth1
73.0.0.0 255.0.0.0 201.66.37.254 UG eth0
91.32.74.21 255.255.255.255 201.66.37.254 UGH eth0
這些表項分別是怎麼得到的呢?第一個是當路由表初始化時由路由軟體加入的,第二、三個是當網卡綁定IP位址時自動創建的,其餘三個必須手動加入,在UNIX系統中,這是通過命令route來做的,可以由用戶手工執行,也可以通過rc腳本在啟動時執行。上述方法涉及的是靜態路由,通常在啟動時創建,並且沒有手工干預的話將不再改變。
4、路由協議
主機和閘道都可以使用稱作動態路由的技術,這使路由表可以動態改變。動態路由需要路由協定來增加和刪除路由表項,路由表還是和靜態路由一樣地工作,只是其增添和刪除是自動的。
有兩種路由協議:內部的和外部的。內部協定在自製系統(AS)內部路由,而外部協定則在自製系統間路由。自製系統通常在統一的控制管理之下,例如大的公司或大學。小的站點常常是其網際網路服務提供商自製系統的一部分。
這裏只討論內部協議,很少有人涉及到甚至聽說外部協議。最常見的外部協定是外部閘道協定EGP(External Gateway Protocol)和邊緣閘道協議BGP(Border Gateway Protocol),BGP是較新的協議,在逐漸地取代EGP。
5、ICMP重定向
ICMP通常不被看作路由協議,但是ICMP重定向卻與路由協定的工作方式很類似,所以將在這裏討論一下。假設現在有上面所給的六個表項的路由表,分組被送往201.66.43.33,看看路由表,除了缺省路由外,這並不能匹配任何路由。靜態路由將其通過路由器201.66.39.254發送(trip 1),但是,該路由器知道所有發向子網201.66.43.0的分組應該通過201.66.39.253,因此,它把分組轉發到適當的路由器(trip 2)。但是如果主機直接把分組發到201.66.39.253就會提高效率(trip 3)。如下圖:
因為路由器把分組從同一介面發回了分組,所以它知道有更好的路由,路由器可以通過ICMP重定向指示主機使用新的路由。雖然路由器知道所有發向201.66.43.0子網的分組應該通過201.66.39.253,它通常只發送特定的主機的ICMP重定向(此例中是201.66.43.33)。主機將在路由表中創建一個新的表項:
目的 遮罩 閘道 標誌 介面
201.66.43.33 255.255.255.255 201.66.39.253 UGHD eth1
注意標誌D,對所有由ICMP重定向創建的路由設置此標誌。將來此類分組將通過新路由發送(trip 3)。
6、RIP
RIP是一種簡單的內部路由協議,已經存在很久,被廣泛地實現(UNIX的routed就使用RIP)。它使用距離向量演算法,所以其路由選擇只是基於兩點間的“跳(hop)”數,穿過一個路由器認為是一跳。主機和閘道都可以運行RIP,但是主機只是接收資訊,而並不發送。路由資訊可以從指定閘道請求,但通常是每隔30秒廣播一次以保持正確性。RIP使用UDP通過埠520在主機和閘道間通信。閘道間傳送的資訊用於建立路由表,由RIP選定的路由總是具有距離目的跳數最少的。RIP版本1在簡單、較小的網路中工作得不錯,但是在較大的網路中,就出現一些問題,有些問題在RIP版本2中已糾正,但有些是由於其設計產生的限制。在下面的討論中,適用于兩種版本時簡單稱為RIP,RIP v1和RIP v2則指特定的版本。
RIP並沒有任何鏈結品質的概念,所有的鏈路都被認為是相同的,低速的串列鏈路被認為與高速的光纖鏈路是同樣的。RIP以最小的跳數來選擇路由,因此當在下面兩個路由中選擇時:
100Mbps的光纖鏈路,路由器,然後是10Mbps的乙太網
9600bps的串列鏈路
RIP將選擇後者。RIP也沒有鏈路流量等級的概念。例如對於兩條乙太網鏈路,其中一個很繁忙,另一個根本沒有資料流程,RIP可能會選擇繁忙的那條鏈路。
RIP中的最大hop數是15,大於15則認為不可到達。因此在很大的自製系統中,hop數很可能超過15,使用RIP是很不現實的。RIP v1不支援子網,交換的資訊中不含子網路遮罩,對給定路由確定子網路遮罩的方法各不相同,RIP v2則彌補了此缺點。RIP每隔30秒才進行資訊更新,因此在大網中斷鏈資訊可能要花些時間才能傳播開來,路由資訊的穩定時間可能更長,並且在這段時間內可能產生路由環路。對此有一些解決辦法,但這裏不進行討論。
可以看出,RIP是一個簡單的路由協議,有一些限制,尤其在版本1中。不過,它常常是某些作業系統的唯一選擇。