本章討論網絡互連問題。在介紹網絡層提供的兩種不同服務后,就進入本章的核心內容一一網際協議IP,這是本書的一個重點內容。只有深入地掌握了 IP協議的主要內容,才能理解互聯網是怎樣工作的。
本章還要討論網際控制報文協議ICMP,幾種常用的路由選擇協議,IPv6的主要特點,IP多播的概念。在討論虛擬專用網VPN和網絡地址轉換NAT后,最后簡單介紹多協議標記交換MPLS。本章最重要的內容是:
- 虛擬互連網絡的概念。
- IP地址與物理地址的關系。
- 傳統的分類的IP地址(包括子網掩碼)和無分類域間路由選擇CIDR。
- 路由選擇協議的工作原理。
網絡層提供的兩種服務
在計算機網絡領域,網絡層應該向運輸層提供怎樣的服務(“面向連接”還是“無連接")曾引起了長期的爭論。爭論焦點的實質就是:在計算機通信中,可靠交付應當由誰來負責?是網絡還是端系統?
互聯網的先驅者卻提出一種嶄新的網絡設計思路。他們認為,電信網提供的端到端可靠傳輸的服務對電話業務無疑是很合適的,因為電信網的終端(電話機)非常簡單,沒有智能,也沒有差錯處理能力。因此電信網必須負責把用戶電話機產生的話音信號可靠地傳送到對方的電話機,使還原后的話音質量符合技術規范的要求。但計算機網絡的端系統是有智能的計算機。計算機有很強的差錯處理能力(這點和傳統的電話機有本質上的差別)。
因此,互聯網在設計上就釆用了和電信網完全不同的思路。互聯網釆用的設計思路是這樣的:網絡層向上只提供簡單靈活的、無連接的、盡最大努力交付的數據報服務。這里的“數報"(datagram)是互聯網的設計者最初使用的名詞,其實數據報(或IP數據報)就是我們經常使用的“分組”。在本書中,數據報和分組是同義詞,可以混用。
網絡在發送分組時不需要先建立連接。每一個分組(也就是IP數據報)獨立發送,與其前后的分組無關(不進行編號)。網絡層不提供服務質量的承諾。也就是說,所傳送的分組可能出錯、丟失、重復和失序(即不按序到達終點),當然也不保證分組交付的時限。由於傳輸網絡不提供端到端的可靠傳輸服務,這就使網絡中的路由器比較簡單,且價格低廉(與電信網的交換機相比較)。如果主機(即端系統)中的進程之間的通信需要是可靠的,那么就由網絡的主機中的運輸層負責(包括差錯處理、流量控制等)。
釆用這種設計思路的好處是:網絡造價大大降低,運行方式靈活,能夠適應多種應用。互聯網能夠發展到今日的規模,充分證明了當初釆用這種設計思路的正確性。
圖4-1(b)給出了網絡提供數據報服務的示意圖。主機H1向H2發送的分組各自獨立地選擇路由,並且在傳送的過程中還可能丟失。
OSI體系的支持者曾極力主張在網絡層使用可靠傳輸的虛電路服務,也曾推出過網絡層虛電路服務的著名標准——ITU-T的X.25建議書。但現在X.25早已成為歷史了。
網際協議IP
網際協議IP是TCP/IP體系中兩個最主要的協議之一,也是最重要的互聯網標准協議之一。嚴格來說,這里所講的IP其實是IP的第4個版本,應記為IPv4。但在講述IP協議的各種原理時,往往不在IP后面加上版本號。在后面的4.6節我們再介紹較新的版本IPv6 (版本1 ~3和版本5都未曾使用過)。
與IP協議配套使用的還有三個協議:
- 地址解析協議 ARP(Address Resolution Protocol)
- 網際控制報文協議 ICMP (Internet Control Message Protocol)
- 網際組管理協議 IGMP (Internet Group Management Protocol)
圖4-2畫出了這三個協議和網際協議IP的關系。在這一層中,ARP畫在最下面,因為IP經常要使用這個協議。ICMP和IGMP畫在這一層的上部,因為它們要使用IP協議。這三個協議將在后面陸續介紹。
由於網際協議IP是用來使互連起來的許多計算機網絡能夠進行通信的,因此TCP/IP體系中的網絡層常常被稱為網際層(internet layer),或DP層。使用“網際層”這個名詞的好處是強調這是由很多網絡構成的互連網絡。
在討論網際協議IP之前,必須了解什么是虛擬互連網絡。
虛擬互聯網絡
能不能讓大家都使用相同的網絡,這樣可使網絡互連變得比較簡單。答案是不行的。因為用戶的需求是多種多樣的,沒有一種單一的網絡能夠適應所有用戶的需求。另外,網絡技術是不斷發展的,網絡的制造廠家也要經常推出新的網絡,在競爭中求生存。因此在市場上總是有很多種不同性能、不同網絡協議的網絡,供不同的用戶選用。
從一般的概念來講,將網絡互相連接起來要使用一些中間設備。根據中間設備所在的層次,可以有以下四種不同的中間設備:
- 物理層使用的中間設備叫做轉發器(repeater)。
- 數據鏈路層使用的中間設備叫做網橋或橋接器(bridge)。
- 網絡層使用的中間設備叫做路由器(router)①。
- 在網絡層以上使用的中間設備叫做網關(gateway)。用網關連接兩個不兼容的系統需要在高層進行協議的轉換。
當中間設備是轉發器或網橋時,這僅僅是把一個網絡擴大了,而從網絡層的角度看,這仍然是一個網絡,一般並不稱之為網絡互連。
網關由於比較復雜,目前使用得較少。因此現在我們討論網絡互連時,都是指用路由器進行網絡互連和路由選擇。
路由器其實就是一台專用計算機,用來在互聯網中進行路由選擇。由於歷史的原因,許多有關TCP/IP的文獻曾經把網絡層使用的路由器稱為網關。
圖4-3(a)表示有許多計算機網絡通過一些路由器進行互連。由於參加互連的計算機網絡都使用相同的網際協議IP (Internet Protocol),因此可以把互連以后的計算機網絡看成如圖4-3(b)所示的一個虛擬互連網絡(internet)。
所謂虛擬互連網絡也就是邏輯互連網絡,它的意思就是互連起來的各種物理網絡的異構性本來是客觀存在的,但是我們利用IP協議就可以使這些性能各異的網絡在網絡層上看起來好像是一個統一的網絡。這種使用IP協議的虛擬互連網絡可簡稱為IP網(IP網是虛擬的,但平常不必每次都強調“虛擬"二字)。
使用IP網的好處是:當IP網上的主機進行通信時,就好像在一個單個網絡上通信一樣,它們看不見互連的各網絡的具體異構細節(如具體的編址方案、路由選擇協議,等等)。如果在這種覆蓋全球的IP網的上層使用TCP協議,那么就是現在的互聯網(Internet)。
當很多異構網絡通過路由器互連起來時,如果所有的網絡都使用相同的IP協議,那么在網絡層討論問題就顯得很方便。現在用一個例子來說明。
在圖4-4所示的互聯網中的源主機H1要把一個IP數據報發送給目的主機H2。根據第1章中講過的分組交換的存儲轉發概念,主機H1先要查找自己的路由表,看目的主機是否就在本網絡上。如是,則不需要經過任何路由器而是直接交付,任務就完成了。如不是,則必須把IP數據報發送給某個路由器(圖中的R1)。R1在查找了自己的路由表后,知道應當把數據報轉發給R2進行間接交付。這樣一直轉發下去,最后由路由器R5知道自己是和H2連接在同一個網絡上,不需要再使用別的路由器轉發了,於是就把數據報直接交付目的主機H2。
圖中畫出了源主機、目的主機以及各路由器的協議棧。我們注意到,主機的協議棧共有五層,但路由器的協議棧只有下三層。圖中還畫出了數據在各協議棧中流動的方向(用黑色粗線表示)。我們還可注意到,在R4和R5之間使用了衛星鏈路,而R5所連接的是個無線局域網。在R1到R4之間的三個網絡則可以是任意類型的網絡。總之,這里強調的是:互聯網可以由多種異構網絡互連組成。
如果我們只從網絡層考慮問題,那么IP數據報就可以想象是在網絡層中傳送,其傳送路徑是:H1-> R1-> R2->R3->R3->R5->H2這樣就不必畫出許多完整的協議棧,使問題的描述更加簡單。有了虛擬互連網絡的概念后,我們再討論在這樣的虛擬網絡上如何尋址。
分類的IP地址
在TCP/IP體系中,IP地址是一個最基本的概念,一定要把它弄清楚。有關IP最重要的文檔就是互聯網的正式標准。
IP地址及其表示方法
整個的互聯網就是一個單一的、抽象的網絡。IP地址就是給互聯網上的每一台主機(或路由器)的每一個接口分配一個在全世界范圍內是唯一的32位的標識符。IP地址的結構使我們可以在互聯網上很方便地進行尋址。IP地址現在由互聯網名字和數字分配機構ICANN (Internet Corporation for Assigned Names and Numbers)進行分配。IP地址的編址方法共經過了三個歷史階段。
- 分類的IP地址。這是最基本的編址方法,在1981年就通過了相應的標准協議。
- 子網的划分。這是對最基本的編址方法的改進,其標准RFC 950在1985年通過。
- 構成超網。這是比較新的無分類編址方法。1993年提出后很快就得到推廣應用。
本節只討論最基本的分類的IP地址。所謂“分類的IP地址"就是將IP地址划分為若干個固定類,每一類地址都由兩個固定長度的字段組成,其中第一個字段是網絡號(net-id),它標志主機(或路由器)所連接到的網絡。一個網絡號在整個互聯網范圍內必須是唯一的。第二個字段是主機號(host-id),它標志該主機(或路由器)。一台主機號在它前面的網絡號所指明的網絡范圍內必須是唯一的。由此可見,一個IP地址在整個互聯網范圍內是唯一的。
這種兩級的IP地址可以記為:
從圖4-5可以看出:
- A類、B類和C類地址的網絡號字段(在圖中這個字段是灰色的)分別為1個、2個和3個字節長,而在網絡號字段的最前面有1-3位的類別位,其數值分別規定為0, 10 和 110。
- A類、B類和C類地址的主機號字段分別為3個、2個和1個字節長。
- D類地址(前4位是1110)用於多播(一對多通信)。我們將在4.6節討論IP多播。
- E類地址(前4位是1111)保留為以后用。
這里要指出,由於近年來已經廣泛使用無分類IP地址進行路由選擇,A類、B類和C類地址的區分己成為歷史。
從IP地址的結構來看,IP地址並不僅僅指明一台主機,而是還指明了主機所連接到的網絡。
IP地址具有以下一些重要特點。
-
每一個IP地址都由網絡號和主機號兩部分組成。從這個意義上說,IP地址是一種分等級的地址結構。分兩個等級的好處是:
第一,IP地址管理機構在分配IP地址時只分配網絡號(第一級),而剩下的主機號(第二級)則由得到該網絡號的單位自行分配。這樣就方便了 IP地址的管理;
第二,路由器僅根據目的主機所連接的網絡號來轉發分組(而不考慮目的主機號),這樣就可以使路由表中的項目數大幅度減少,從而減小了路由表所占的存儲空間以及查找路由表的時間。
-
實際上IP地址是標志一台主機(或路由器)和一條鏈路的接口。當一台主機同時連接到兩個網絡上時,該主機就必須同時具有兩個相應的IP地址,其網絡號必須是不同的。這種主機稱為多歸屬主機(multihomed host)。由於一個路由器至少應當連接到兩個網絡,因此一個路由器至少應當有兩個不同的IP地址。
-
按照互聯網的觀點,一個網絡是指具有相同網絡號net-id的主機的集合,因此,用轉發器或網橋連接起來的若干個局域網仍為一個網絡,因為這些局域網都具有同樣的網絡號。具有不同網絡號的局域網必須使用路由器進行互連。
-
在IP地址中,所有分配到網絡號的網絡(不管是范圍很小的局域網,還是可能覆蓋很大地理范圍的廣域網)都是平等的。所謂平等,是指互聯網同等對待每一個IP地址。圖4-7畫出了三個局域網(LAN1,LAN2和LAN3)通過三個路由器(R1,R2和R3)互連起來所構成的一個互聯網(此互聯網用虛線圓角方框表示)。其中局域網LAN2是由兩個網段通過網橋B互連的。圖中的小圓圈表示需要有一個IP地址。
我們應當注意到:
- 在同一個局域網上的主機或路由器的IP地址中的網絡號必須是一樣的。圖中所示的網絡號就是IP地址中的網絡號字段的值,這也是文獻中常見的一種表示方法。另一種表示方法是用主機號為全0的網絡IP地址。
- 用網橋(它只在鏈路層工作)互連的網段仍然是一個局域網,只能有一個網絡號。
- 路由器總是具有兩個或兩個以上的IP地址。即路由器的每一個接口都有一個不同網絡號的IP地址。
- 當兩個路由器直接相連時(例如通過一條租用線路),在連線兩端的接口處,可以分配也可以不分配IP地址。如分配了 IP地址,則這一段連線就構成了一種只包含一段線路的特殊“網絡”(如圖中的N1, N2和N3)。之所以叫做“網絡”是因為它有IP地址。但為了節省IP地址資源,對於這種僅由一段連線構成的特殊“網絡”,現在也常常不分配IP地址。通常把這樣的特殊網絡叫做無編號網絡(unnumbered network)或無名網絡(anonymous network)[COME06]。
IP地址與硬件地址
在學習IP地址時,很重要的一點就是要弄懂主機的IP地址與硬件地址(硬件地址已經固化在網卡的ROM上)的區別。
圖4-8說明了這兩種地址的區別。從層次的角度看,物理地址是數據鏈路層和物理層使用的地址,而IP地址是網絡層和以上各層使用的地址,是一種邏輯地址(稱IP地址為邏輯地址是因為IP地址是用軟件實現的)。
在發送數據時,數據從高層下到低層,然后才到通信鏈路上傳輸。
使用IP地址的IP數據報一旦交給了數據鏈路層,就被封裝成MAC幀了。MAC幀在傳送時使用的源地址和目的地址都是硬件地址,這兩個硬件地址都寫在MAC幀的首部中。
連接在通信鏈路上的設備(主機或路由器)在收到MAC幀時,根據MAC幀首部中的硬件地址決定收下或丟棄。只有在剝去MAC幀的首部和尾部后把MAC層的數據上交給網絡層后,網絡層才能在IP數據報的首部中找到源IP地址和目的IP地址。
總之,IP地址放在IP數據報的首部,而硬件地址則放在MAC幀的首部。在網絡層和網絡層以上使用的是IP地址,而數據鏈路層及以下使用的是硬件地址。在圖4-8中,當IP數據報放入數據鏈路層的MAC幀中以后,整個的IP數據報就成為MAC幀的數據,因而在數據鏈路層看不見數據報的IP地址。
圖4-9(a)畫的是三個局域網用兩個路由器R1和R2互連起來。現在主機H1要和主機H2通信。這兩台主機的IP地址分別是IP1和IP2,而它們的硬件地址分別為HA1和HA2(HA表示Hardware Address)。通信的路徑是:H1-> 經過R1轉發-> 再經過R2轉發->H2。
路由器R1因同時連接到兩個局域網上,因此它有兩個硬件地址,即HA3和HA4,同理,路由器R2也有兩個硬件地址HA5和HA6。
圖4-9(b)特別強調了 IP地址與硬件地址的區別。表4-4歸納了這種區別。
這里要強調指出以下幾點:
- 在IP層抽象的互聯網上只能看到IP數據報。雖然IP數據報要經過路由器R1和R2的兩次轉發,但在它的首部中的源地址和目的地址始終分別是IP1和IP2。圖中的數據報上寫的“從IP1到IP2”就表示前者是源地址而后者是目的地址。數據報中間經過的兩個路由器的IP地址並不出現在IP數據報的首部中。
- 雖然在IP數據報首部有源站IP地址,但路由器只根據目的站的IP地址的網絡號進行路由選擇。
- 在局域網的鏈路層,只能看見MAC幀。IP數據報被封裝在MAC幀中。MAC幀在不同網絡上傳送時,其MAC幀首部中的源地址和目的地址要發生變化,見圖4-9(b)。開始在H1到R1間傳送時,MAC幀首部中寫的是從硬件地址HA1發送到硬件地址HA3,路由器R1收到此MAC幀后,在數據鏈路層,要丟棄原來的MAC幀的首部和尾部。在轉發時,在數據鏈路層,要重新添加上MAC幀的首部和尾部。這時首部中的源地址和目的地址分別便成為HA4和HA5。路由器R2收到此幀后,再次更換MAC幀的首部和尾部,首部中的源地址和目的地址分別變成為HA6和HA2。MAC幀的首部的這種變化,在上面的IP層上是看不見的。
- 盡管互連在一起的網絡的硬件地址體系各不相同,但IP層抽象的互聯網卻屏蔽了下層這些很復雜的細節。只要我們在網絡層上討論問題,就能夠使用統一的、抽象的IP地址研究主機和主機或路由器之間的通信。上述的這種"屏蔽"概念是一個很有用、很普遍的基本概念。
地址解析協議ARP
在實際應用中,我們經常會遇到這樣的問題:己經知道了一個機器(主機或路由器)的IP地址,需要找出其相應的硬件地址。地址解析協議ARP就是用來解決這樣的問題的。
圖4-10說明了 ARP協議的作用。
由於是IP協議使用了 ARP協議,因此通常就把ARP協議划歸網絡層。但ARP協議的用途是為了從網絡層使用的IP地址,解析出在數據鏈路層使用的硬件地址。因此,有的教科書就按照協議的所用,把ARP協議划歸在數據鏈路層。這樣做當然也是可以的。
下面就介紹ARP協議的要點。
我們知道,網絡層使用的是IP地址,但在實際網絡的鏈路上傳送數據幀時,最終還是必須使用該網絡的硬件地址。但IP地址和下面的網絡的硬件地址之間由於格式不同而不存在簡單的映射關系(例如,IP地址有32位,而局域網的硬件地址是48位)。此外,在一個網絡上可能經常會有新的主機加入進來,或撤走一些主機。更換網絡適配器也會使主機的硬件地址改變。
地址解析協議ARP解決這個問題的方法是在主機ARP高速緩存中存放一個從IP地址到硬件地址的映射表,並且這個映射表還經常動態更新(新增或超時刪除)。每一台主機都設有一個ARP高速緩存(ARP cache),里面有本局域網上的各主機和路由器的IP地址到硬件地址的映射表,這些都是該主機目前知道的一些地址。那么主機怎樣知道這些地址呢?我們可以通過下面的例子來說明。
當主機A要向本局域網上的某台主機B發送IP數據報時,就先在其ARP高速緩存中査看有無主機B的IP地址。如有,就在ARP高速緩存中査出其對應的硬件地址,再把這個硬件地址寫入MAC幀,然后通過局域網把該MAC幀發往此硬件地址。也有可能查不到主機B的IP地址的項目。這可能是主機B才入網,也可能是主機A剛剛加電,其高速緩存還是空的。在這種情況下,主機A就自動運行ARP,然后按以下步驟找出主機B的硬件地址:
- ARP進程在本局域網上廣播發送一個ARP請求分組。圖4-11(a)是主機A廣播發送ARP請求分組的示意圖。ARP請求分組的主要內容是:“我的IP地址是209.0.0.5,硬件地址是00-00-C0-15-AD-18。我想知道IP地址為209.0.0.6的主機的硬件地址。”
- 在本局域網上的所有主機上運行的ARP進程都收到此ARP請求分組。
- 主機B的IP地址與ARP請求分組中要查詢的IP地址一致,就收下這個ARP請求分組,並向主機A發送ARP響應分組,同時在這個ARP響應分組中寫入自己的硬件地址。由於其余的所有主機的IP地址都與ARP請求分組中要査詢的IP地址不一致,因此都不理睬這個ARP請求分組,見圖4-11(b)。ARP響應分組的主要內容是:“我的IP地址是209.0.0.6,我的硬件地址是08-00-2B-00-EE-0A。“請注意:雖然ARP請求分組是廣播發送的,但ARP響應分組是普通的單播,即從一個源地址發送到一個目的地址。
- 主機A收到主機B的ARP響應分組后,就在其ARP高速緩存中寫入主機B的IP地址到硬件地址的映射。
當主機A向B發送數據報時,很可能以后不久主機B還要向A發送數據報,因而主機B也可能要向A發送ARP請求分組。為了減少網絡上的通信量,主機A在發送其ARP請求分組時,就把自己的IP地址到硬件地址的映射寫入ARP請求分組。當主機B收到A的ARP請求分組時,就把主機A的這一地址映射寫入主機B自己的ARP高速緩存中。以后主機B向A發送數據報時就很方便了。
可見ARP高速緩存非常有用。如果不使用ARP高速緩存,那么任何一台主機只要進行一次通信,就必須在網絡上用廣播方式發送ARP請求分組,這就使網絡上的通信量大大增加。
ARP把己經得到的地址映射保存在高速緩存中,這樣就使得該主機下次再和具有同樣目的地址的主機通信時,可以直接從高速緩存中找到所需的硬件地址而不必再用廣播方式發送ARP請求分組。
ARP對保存在高速緩存中的每一個映射地址項目都設置生存時間(例如,10 ~ 20分鍾)。凡超過生存時間的項目就從高速緩存中刪除掉。設置這種地址映射項目的生存時間是很重要的。設想有一種情況。主機A和B通信。A的ARP高速緩存里保存有B的硬件地址。但B的網絡適配器突然壞了,B立即更換了一塊,因此B的硬件地址就改變了。假定A還要和B繼續通信。A在其ARP高速緩存中査找到B原先的硬件地址,並使用該硬件地址向B發送數據幀。但B原先的硬件地址已經失效了,因此A無法找到主機B。但是過了一段不長的生存時間,A的ARP高速緩存中己經刪除了 B原先的硬件地址,於是A重新廣播發送ARP請求分組,又找到了B。
請注意,ARP是解決同一個局域網上的主機或路由器的IP地址和硬件地址的映射問題。如果所要找的主機和源主機不在同一個局域網上,例如,在前面的圖4-9中,主機H1就無法解析出另一個局域網上主機H2的硬件地址(實際上主機H1也不需要知道遠程主機H2的硬件地址)。
主機H1發送給H2的IP數據報首先需要通過與主機H1連接在同一個局域網上的路由器R1來轉發。因此主機H1這時需要把路由器R1的IP地址IP3解析為硬件地址HA3,以便能夠把IP數據報傳送到路由器R1。以后,R1從轉發表找出了下一跳路由器R2,同時使用ARP解析出R2的硬件地址HA5。於是IP數據報按照硬件地址HA5轉發到路由器R2。路由器R2在轉發這個IP數據報時用類似方法解析出目的主機H2的硬件地址HA2,使IP數據報最終交付主機H2。
從IP地址到硬件地址的解析是自動進行的,主機的用戶對這種地址解析過程是不知道的。只要主機或路由器要和本網絡上的另一個己知IP地址的主機或路由器進行通信,ARP協議就會自動地把這個IP地址解析為鏈路層所需要的硬件地址。
下面我們歸納出使用ARP的四種典型情況(圖4-12)。
- 發送方是主機(如H1),要把IP數據報發送到同一個網絡上的另一台主機(如H2)。這時H1發送ARP請求分組(在網1上廣播),找到目的主機改的硬件地址。
- 發送方是主機(如H1),要把IP數據報發送到另一個網絡上的一台主機(如H3或H4)。這時H1發送ARP請求分組(在網1上廣播),找到網1上的一個路由器R1的硬件地址。剩下的工作由路由器R1來完成。R1要做的事情是下面的(3)或(4)。
- 發送方是路由器(如R1),要把IP數據報轉發到與R1連接在同一個網絡(網2)上的主機(如H3)。這時R1發送ARP請求分組(在網2上廣播),找到目的主機H3的硬件地址。
- 發送方是路由器(如R1),要把IP數據報轉發到網3上的一台主機(如H4)。H4與R1不是連接在同一個網絡上。這時R1發送ARP請求分組(在網2上廣播),找到連接在網2上的一個路由器R2的硬件地址。剩下的工作由這個路由器R2來完成。
在許多情況下需要多次使用ARP。但這只是以上幾種情況的反復使用而已。
有的讀者可能會產生這樣的問題:既然在網絡鏈路上傳送的幀最終是按照硬件地址找到目的主機的,那么為什么我們還要使用抽象的IP地址,而不直接使用硬件地址進行通信?這樣似乎可以免除使用ARP。
這個問題必須弄清楚。由於全世界存在着各式各樣的網絡,它們使用不同的硬件地址。要使這些異構網絡能夠互相通信就必須進行非常復雜的硬件地址轉換工作,因此由用戶或用戶主機來完成這項工作幾乎是不可能的事。但IP編址把這個復雜問題解決了。連接到互聯網的主機只需各自擁有一個唯一的IP地址,它們之間的通信就像連接在同一個網絡上那樣簡單方便,因為上述的調用ARP的復雜過程都是由計算機軟件自動進行的,對用戶來說是看不見這種調用過程的。因此,在虛擬的IP網絡上用IP地址進行通信給廣大的計算機用戶帶來很大的方便。
IP數據報格式
IP數據報的格式能夠說明IP協議都具有什么功能。在TCP/IP的標准中,各種數據格式常常以32位(即4字節)為單位來描述。圖4-13是IP數據報的完整格式。
從圖4-13可看出,一個IP數據報由首部和數據兩部分組成。首部的前一部分是固定長度,共20字節,是所有IP數據報必須具有的。在首部的固定部分的后面是一些可選字段,其長度是可變的。下面介紹首部各字段的意義。
IP數據報首部的固定部分中的各字段
-
版本 占4位,指IP協議的版本。通信雙方使用的IP協議的版本必須一致。目前廣泛使用的IP協議版本號為4 (即IPv4)。關於以后要使用的IPv6 (即版本6的IP協議)。
-
首部長度 占4位,可表示的最大十進制數值是15。請注意,首部長度字段所表示數的單位是32位字(1個32位字長是4字節)。因為IP首部的固定長度是20字節,因此首部長度字段的最小值是5 (即二進制表示的首部長度是0101)。而當首部長度為最大值1111時(即十進制數的15),就表明首部長度達到最大值15個32位字長,即60字節。當IP分組的首部長度不是4字節的整數倍時,必須利用最后的填充字段加以填充。因此IP數據報的數據部分永遠在4字節的整數倍時開始,這樣在實現IP協議時較為方便。首部長度限制為60字節的缺點是有時可能不夠用。但這樣做是希望用戶盡量減少開銷。最常用的首部長度是20字節(即首部長度為0101),這時不使用任何選項。
-
區分服務 占8位,用來獲得更好的服務。這個字段在舊標准中叫做服務類型,但實際上一直沒有被使用過。1998年IETF把這個字段改名為區分服務DS 。只有在使用區分服務時,這個字段才起作用。
-
總長度 總長度指首部和數據之和的長度,單位為字節。總長度字段為16位,因此數據報的最大長度為216 - 1 = 65535字節。然而實際上傳送這樣長的數據報在現實中是極少遇到的。我們知道,在IP層下面的每一種數據鏈路層協議都規定了一個數據幀中的數據字段的最大長度,這稱為最大傳送單元MTU (Maximum Transfer Unit)。當一個IP數據報封裝成鏈路層的幀時,此數據報的總長度(即首部加上數據部分)一定不能超過下面的數據鏈路層所規定的MTU值。例如,最常用的以太網就規定其MTU值是1500字節。若所傳送的數據報長度超過數據鏈路層的MTU值,就必須把過長的數據報進行分片處理。
雖然使用盡可能長的IP數據報會使傳輸效率得到提高(因為每一個IP數據報中首部長度占數據報總長度的比例就會小些),但數據報短些也有好處。每一個IP數據報越短,路由器轉發的速度就越快。為此,IP協議規定,在互聯網中所有的主機和路由器,必須能夠接受長度不超過576字節的數據報。這是假定上層交下來的數據長度有512字節(合理的長度),加上最長的IP首部60字節,再加上4字節的富余量,就得到576字節。當主機需要發送長度超過576字節的數據報時,應當先了解一下,目的主機能否接受所要發送的數據報長度。否則,就要進行分片。在進行分片時(見后面的“片偏移”字段),數據報首部中的“總長度”字段是指分片后的毎一個分片的首部長度與該分片的數據長度的總和。
-
標識(identification) 占16位。IP軟件在存儲器中維持一個計數器,每產生一個數據報,計數器就加1,並將此值賦給標識字段。但這個“標識"並不是序號,因為IP是無連接服務,數據報不存在按序接收的問題。當數據報由於長度超過網絡的MTU而必須分片時,這個標識字段的值就被復制到所有話數據報片的標識字段中。相同的標識字段的值使分片后的各數據報片最后能正確地重裝成為原來的數據報。
-
標志(flag) 占3位,但目前只有兩位有意義。
- 標志字段中的最低位記為MF (More Fragment)。MF = 1即表示后面“還有分片"的數據報。MF = 0表示這己是若干數據報片中的最后一個。
- 標志字段中間的一位記為DF (Don't Fragment),意思是“不能分片”。只有當DF = 0時才允許分片。
-
片偏移 占13位。片偏移指出:較長的分組在分片后,某片在原分組中的相對位置。也就是說,相對於用戶數據字段的起點,該片從何處開始。片偏移以8個字節為偏移單位。這就是說,每個分片的長度一定是8字節(64位)的整數倍。
-
生存時間 占8位,英文縮寫是TTL (Time To Live),表明這是數據報在網絡中的壽命。由發出數據報的源點設置這個字段。其目的是防止無法交付的數據報無限制地在互聯網中兜圈子,因而白白消耗網絡資源。最初的設計是以秒作為TTL值的單位。每經過一個路由器時,就把TTL減去數據報在路由器所消耗掉的一段時間。若數據報在路由器消耗的時間小於1秒,就把TTL值減1。當TTL值減為零時,就丟棄這個數據報。
然而隨着技術的進步,路由器處理數據報所需的時間不斷在縮短,一般都遠遠小於1秒,后來就把TTL字段的功能改為“跳數限制”(但名稱不變)。路由器在每次轉發數據報之前就把TTL值減1。若TTL值減小到零,就丟棄這個數據報,不再轉發。因此,現在TTL的單位不再是秒,而是跳數。TTL的意義是指明數據報在互聯網中至多可經過多少個路由器。顯然,數據報能在互聯網中經過的路由器的最大數值是255。若把TTL的初始值設置為1,就表示這個數據報只能在本局域網中傳送。因為這個數據報一傳送到局域網上的某個路由器,在被轉發之前TTL值就減小到零,因而就會被這個路由器丟棄。
-
協議 占8位,協議字段指出此數據報攜帶的數據是使用何種協議,以便使目的主機的IP層知道應將數據部分上交給哪個協議進行處理。
- 首部檢驗和 占16位。這個字段只檢驗數據報的首部,但不包括數據部分。這是因為數據報每經過一個路由器,路由器都要重新計算一下首部檢驗和(一些字段,如生存時間、標志、片偏移等都可能發生變化)。不檢驗數據部分可減少計算的工作量。為了進一步減小計算檢驗和的工作量,IP首部的檢驗和不釆用復雜的CRC檢驗碼而采用下面的簡單計算方法:在發送方,先把IP數據報首部划分為許多16位字的序列,並把檢驗和字段置零。用反碼算術運算把所有16位字相加后,將得到的和的反碼寫入檢驗和字段。接收方收到數據報后,將首部的所有16位字再使用反碼算術運算相加一次。將得到的和取反碼,即得出接收方檢驗和的計算結果。若首部未發生任何變化,則此結果必為0,於是就保留這個數據報。否則即認為出差錯,並將此數據報丟棄。圖445說明了 IP數據報首部檢驗和的計算過程。
- 源地址 占32位。
- 目的地址 占32位。
IP數據報首部的可變部分
IP數據報首部的可變部分就是一個選項字段。選項字段用來支持排錯、測量以及安全等措施,內容很豐富。此字段的長度可變,從1個字節到40個字節不等,取決於所選擇的項目。某些選項項目只需要1個字節,它只包括1個字節的選項代碼。而有些選項需要多個字節,這些選項一個個拼接起來,中間不需要有分隔符,最后用全0的填充字段補齊成為4字節的整數倍。
增加首部的可變部分是為了增加IP數據報的功能,但這同時也使得IP數據報的首部長度成為可變的。這就增加了每一個路由器處理數據報的開銷。實際上這些選項很少被使用。很多路由器都不考慮IP首部的選項字段,因此新的IP版本IPv6就把IP數據報的首部長度做成固定的。這里就不討論這些選項的細節了。有興趣的讀者可參閱RFC 79U。
IP層轉發分組的流程
下面我們先用一個簡單例子來說明路由器是怎樣轉發分組的。
圖4-16(a)是一個路由表的簡單例子。有四個A類網絡通過三個路由器連接在一起。每一個網絡上都可能有成千上萬台主機(圖中沒有畫出這些主機)。可以想象,若路由表指出到每一台主機應怎樣轉發,則所得出的路由表就會過於龐大(如果每一個網絡有1萬台主機,四個網絡就有4萬台主機,因而每一個路由表就有4萬個項目,即4萬行。每一行對應於一台主機)。
但若路由表指出到某個網絡應如何轉發,則每個路由器中的路由表就只包含4個項目(即只有4行,每一行對應於一個網絡)。以路由器R2的路由表為例。由於R2同時連接在網絡2和網絡3上,因此只要目的主機在網絡2或網絡3上,都可通過接口 0或1由路由器R2直接交付(當然還要利用地址解析協議ARP才能找到這些主機相應的硬件地址)。若目的主機在網絡1中,則下一跳路由器應為R1其IP地址為20.0.0.7。路由器R2和R1由於同時連接在網絡2上,因此從路由器R2把分組轉發到路由器R1是很容易的。
同理,若目的主機在網絡4中,則路由器R2應把分組轉發給IP地址為30.0.0.1的路由器R3。我們應當注意到,圖中的每一個路由器都有兩個不同的IP地址。可以把整個的網絡拓撲簡化為圖4-16(b)所示的那樣。在簡化圖中,網絡變成了一條鏈路,但每一個路由器旁邊都注明其IP地址。使用這樣的簡化圖,可以使我們不必關心某個網絡內部的具體拓撲以及連接在該網絡上有多少台主機,因為這些對於研究分組轉發問題並沒有什么關系。這樣的簡化圖強調了在互聯網上轉發分組時,是從一個路由器轉發到下一個路由器。
總之,在路由表中,對每一條路由最主要的是以下兩個信息:(目的網絡地址,下一跳地址)
於是,我們就根據目的網絡地址來確定下一跳路由器,這樣做可得出以下的結果。
- IP數據報最終一定可以找到目的主機所在目的網絡上的路由器(可能要通過多次的間接交付)。
- 只有到達最后一個路由器時,才試圖向目的主機進行直接交付。
雖然互聯網所有的分組轉發都是基於目的主機所在的網絡,但在大多數情況下都允許有這樣的特例,即對特定的目的主機指明一個路由。這種路由叫做特定主機路由。
采用特定主機路由可使網絡管理人員更方便地控制網絡和測試網絡,同時也可在需要考慮某種安全問題時釆用這種特定主機路由。在對網絡的連接或路由表進行排錯時,指明到某一台主機的特殊路由就十分有用。
路由器還可采用默認路由(default route)以減小路由表所占用的空間和搜索路由表所用的時間。這種轉發方式在一個網絡只有很少的對外連接時是很有用的。
實際上,默認路由在主機發送IP數據報時往往更能顯示出它的好處。我們在前面的4.2.1節己經講過,主機在發送每一個IP數據報時都要査找自己的路由表。如果一台主機連接在一個小網絡上,而這個網絡只用一個路由器和互聯網連接,那么在這種情況下使用默認路由是非常合適的。
例如,在圖4-17的互聯網中,連接在網絡N1上的任何一台主機中的路由表只需要三個項目即可。第一個項目就是到本網絡主機的路由,其目的網絡就是本網絡N1,因而不需要路由器轉發,而是直接交付。第二個項目是到網絡N2的路由,對應的下一跳路由器是R2。第三個項目就是默認路由。只要目的網絡是其他網絡(不是N]或N2),就一律選擇默認路由,把數據報先間接交付路由器R1“,讓R1再轉發給互聯網中的下一個路由器,一直轉發到目的網絡上的路由器,最后進行直接交付。在實際上的路由器中,像圖4-17路由表中所示的“直接"和“其他”的幾個字符並沒有出現在路由表中,而是被記0.0.0.0。
這里我們應當強調指出,在IP數據報的首部中沒有地方可以用來指明“下一跳路由器的IP地址”。在IP數據報的首部寫上的IP地址是源IP地址和目的IP地址,而沒有中間經過的路由器的IP地址。既然IP數據報中沒有下一跳路由器的IP地址,那么待轉發的數據報又怎樣能夠找到下一跳路由器呢?
當路由器收到一個待轉發的數據報,在從路由表得出下一跳路由器的IP地址后,不是把這個地址填入IP數據報,而是送交數據鏈路層的網絡接口軟件。網絡接口軟件負責把下一跳路由器的IP地址轉換成硬件地址(必須使用ARP),並將此硬件地址放在鏈路層的MAC幀的首部,然后根據這個硬件地址找到下一跳路由器。由此可見,當發送一連串的數據報時,上述的這種査找路由表、用ARP得到硬件地址、把硬件地址寫入MAC幀的首部等過程,將不斷地重復進行,造成了一定的開銷。
那么,能不能在路由表中不使用IP地址而直接使用硬件地址呢?不行。我們一定要弄清楚,使用抽象的IP地址,本來就是為了隱蔽各種底層網絡的復雜性而便於分析和研究問題,這樣就不可避免地要付出些代價,例如在選擇路由時多了一些開銷。但反過來,如果在路由表中直接使用硬件地址,那就會帶來更多的麻煩。
根據以上所述,可歸納出分組轉發算法如下:
- 從數據報的首部提取目的主機的IP地址D,得出目的網絡地址為N。
- 若N就是與此路由器直接相連的某個網絡地址,則進行直接交付,不需要再經過其他的路由器,直接把數據報交付目的主機(這里包括把目的主機地址D轉換為具體的硬件地址,把數據報封裝為MAC幀,再發送此幀);否則就是間接交付,執行(3)。
- 若路由表中有目的地址為D的特定主機路由,則把數據報傳送給路由表中所指明的下一跳路由器;否則,執行(4)。
- 若路由表中有到達網絡N的路由,則把數據報傳送給路由表中所指明的下一跳路由器;否則,執行(5)。
- 若路由表中有一個默認路由,則把數據報傳送給路由表中所指明的默認路由器;否則,執行(6)。
- 報告轉發分組出錯。
這里我們要再強調一下,路由表並沒有給分組指明到某個網絡的完整路徑(即先經過哪一個路由器,然后再經過哪一個路由器,等等)。路由表指出,到某個網絡應當先到某個路由器(即下一跳路由器),在到達下一跳路由器后,再繼續查找其路由表,知道再下一步應當到哪一個路由器。這樣一步一步地査找下去,直到最后到達目的網絡。
划分子網和構造超網
划分子網
從兩級IP地址到三級IP地址
在今天看來,在ARPANET的早期,IP地址的設計確實不夠合理。
第一,IP地址空間的利用率有時很低。
每一個A類地址網絡可連接的主機數超過1000萬,而每一個B類地址網絡可連接的主機數也超過6萬。有的單位申請到了一個B類地址網絡,但所連接的主機數並不多,可是又不願意申請一個足夠使用的C類地址,理由是考慮到今后可能的發展。IP地址的浪費,還會使IP地址空間的資源過早地被用完。
第二,給每一個物理網絡分配一個網絡號會使路由表變得太大因而使網絡性能變壞。
每一個路由器都應當能夠從路由表查出應怎樣到達其他網絡的下一跳路由器。因此,互聯網中的網絡數越多,路由器的路由表的項目數也就越多。這樣,即使我們擁有足夠多的IP地址資源可以給每一個物理網絡分配一個網絡號,也會導致路由器的路由表中的項目數過多。這不僅增加了路由器的成本(需要更多的存儲空間),而且使査找路由時耗費更多的時間,同時也使路由器之間定期交換的路由信息急劇增加,因而使路由器和整個互聯網的性能都下降了。
第三,兩級IP地址不夠靈活。
有時情況緊急,一個單位需要在新的地點馬上開通一個新的網絡。但是在申請到一個新的IP地址之前,新增加的網絡是不可能連接到互聯網上工作的。我們希望有一種方法,使一個單位能隨時靈活地增加本單位的網絡,而不必事先到互聯網管理機構去申請新的網絡號。原來的兩級IP地址無法做到這一點。
為解決上述問題,從1985年起在IP地址中又增加了一個“子網號字段”,使兩級IP地址變成為三級IP地址,它能夠較好地解決上述問題,並且使用起來也很靈活。這種做法叫做划分子網(subnetting) [RFC 950],或子網尋址或子網路由選擇。划分子網己成為互聯網的正式標准協議。
划分子網的基本思路如下:
- 一個擁有許多物理網絡的單位,可將所屬的物理網絡划分為若干個子網(subnet)。划分子網純屬一個單位內部的事情。本單位以外的網絡看不見這個網絡是由多少個子網組成,因為這個單位對外仍然表現為一個網絡。
- 划分子網的方法是從網絡的主機號借用若干位作為子網號(subnet-id),當然主機號也就相應減少了同樣的位數。於是兩級IP地址在本單位內部就變為三級IP地址:網絡號、子網號和主機號。也可以用以下記法來表示:IP地址::={<網絡號>,〈子網號>,〈主機號〉}
- 凡是從其他網絡發送給本單位某台主機的IP數據報,仍然是根據IP數據報的目的網絡號找到連接在本單位網絡上的路由器。但此路由器在收到IP數據報后,再按目的網絡號和子網號找到目的子網,把IP數據報交付目的主機。
下面用例子說明划分子網的概念。圖4-18表示某單位擁有一個B類IP地址,網絡地址是145.13.0.0 (網絡號是145.13)。凡目的地址為145.13.X.X的數據報都被送到這個網絡上的路由器R1。
現把圖4-18的網絡划分為三個子網(圖4-19)。這里假定子網號占用8位,因此在增加了子網號后,主機號就只有8位。所划分的三個子網分別是:145.13.3.0, 145.13.7.0和145.13.21.0。在划分子網后,整個網絡對外部仍表現為一個網絡,其網絡地址仍為145.13.0.0。但網絡145.13.0.0 上的路由器R1在收到外來的數據報后,再根據數據報的目的地址把它轉發到相應的子網。
總之,當沒有划分子網時,IP地址是兩級結構。划分子網后IP地址變成了三級結構。划分子網只是把IP地址的主機號這部分進行再划分,而不改變IP地址原來的網絡號。
子網掩碼
現在剩下的問題就是:假定有一個數據報(其目的地址是145.13.3.10)已經到達了路由器R1。那么這個路由器如何把它轉發到子網145.13.3.0呢?
我們知道,從IP數據報的首部無法看出源主機或目的主機所連接的網絡是否進行了子網的划分。這是因為32位的IP地址本身以及數據報的首部都沒有包含任何有關子網划分的信息。因此必須另外想辦法,這就是使用子網掩碼(subnet mask)(見圖4-20)。
圖4-20(a)是IP地址為145.13.3.10的主機本來的兩級IP地址結構。
圖4-20(b)是這個兩級IP地址的子網掩碼。
圖4-20(c)是同一地址的三級IP地址結構,也就是說,現在從原來16位的主機號中拿出8位作為子網號,而主機號由16位減少到8位。請注意,現在子網號為3的網絡的網絡地址是145.13.3.0 (既不是原來兩級IP地址的網絡地址145.13.0.0,也不是簡單的子網號3)。為了使路由器R1能夠很方便地從數據報中的目的IP地址中提取出所要找的子網的網絡地址,路由器R1就要使用三級IP地址的子網掩碼。
圖4~20(d)是三級IP地址的子網掩碼,它也是32位,由一串24個1和跟隨的一串8個0組成。子網掩碼中的1對應於IP地址中原來二級地址中的16位網絡號加上新增加的8位子網號,而子網掩碼中的0對應於現在的8位主機號。雖然RFC文檔中沒有規定子網掩碼中的一串1必須是連續的,但卻極力推薦在子網掩碼中選用連續的1,以免出現可能發生的差錯。
圖4-20(e)表示R1把三級IP地址的子網掩碼和收到的數據報的目的IP地址145.13.3.10逐位相“與"(AND)(計算機進行這種邏輯AND運算是很容易的),得出了所要找的子網的網絡地址145.13.3.0。使用子網掩碼的好處就是:不管網絡有沒有划分子網,只要把子網掩碼和IP地址進行逐位的“與”運算(AND),就立即得出網絡地址來。這樣在路由器處理到來的分組時就可釆用同樣的算法。
歸納一下上述的要點。從網絡145.13.0.0。外面看,這就是一個普通的B類網絡,其子網掩碼為16個連1后面跟上16個連0,但進入到這個網絡后(即到了路由器R1),就看到了還有許多網絡(即划分了子網后的許多網絡),其網絡地址是145.13.X.0 (這里x可以表示不同的數值),而這些網絡的子網掩碼都是24個連1后面跟上8個連0。總之,在這個B類網絡的外面和里面,看到的網絡是不一樣的。
這里還要弄清一個問題,這就是:在不划分子網時,既然沒有子網,為什么還要使用子網掩碼?這就是為了更便於査找路由表。現在互聯網的標准規定:所有的網絡都必須使用子網掩碼,同時在路由器的路由表中也必須有子網掩碼這一欄。
如果一個網絡不划分子網,那么該網絡的子網掩碼就使用默認子網掩碼。默認子網掩碼中1的位置和IP地址中的網絡號字段net-id正好相對應。因此,若用默認子網掩碼和某個不划分子網的IP地址逐位相“與”(AND),就應當能夠得出該IP地址的網絡地址來。這樣做可以不用查找該地址的類別位就能知道這是哪一類的IP地址。顯然,
A類地址的默認子網掩碼是255.0.0.0,或OxFF000000。
B類地址的默認子網掩碼是255.255.0.0,或OxFFFF0000。
C類地址的默認子網掩碼是255.255.255.0,或OxFFFFFF00。
圖4-21是這三類IP地址的網絡地址和相應的默認子網掩碼。
子網掩碼是一個網絡或一個子網的重要屬性。在RFC 950成為互聯網的正式標准后,路由器在和相鄰路由器交換路由信息時,必須把自己所在網絡(或子網)的子網掩碼告訴相鄰路由器。在路由器的路由表中的每一個項目,除了要給出目的網絡地址外,還必須同時給出該網絡的子網掩碼。若一個路由器連接在兩個子網上就擁有兩個網絡地址和兩個子網掩碼。
我們以一個B類地址為例,說明可以有多少種子網划分的方法。在釆用固定長度子網時,所划分的所有子網的子網掩碼都是相同的(見表4-6)。
在表4-6中,子網數是根據子網號(subnet-id)計算出來的。若subnet-id有n位,則共有2n種可能的排列。除去全0和全1這兩種情況,就得出表中的子網數。
表中的“子網號的位數"中沒有0,1,15和16這四種情況,因為這沒有意義。
請讀者注意,雖然根據已成為互聯網標准協議的RFC 950文檔,子網號不能為全1或全0,但隨着無分類域間路由選擇CIDR的廣泛使用(在4.3.3節討論),現在全1和全0的子網號也可以使用了,但一定要謹慎使用,要弄清你的路由器所用的路由選擇軟件是否支持全0或全1的子網號這種較新的用法。
我們可以看岀,若使用較少位數的子網號,則每一個子網上可連接的主機數就較多。反之,若使用較多位數的子網號,則子網的數目較多但每個子網上可連接的主機數就較少。因此我們可根據網絡的具體情況(一共需要划分多少個子網,每個子網中最多有多少台主機)來選擇合適的子網掩碼。
通過簡單的計算,讀者不難得到這樣的結論:划分子網増加了靈活性,但卻減少了能夠連接在網絡上的主機總數。例如,本來一個B類地址最多可連接65534台主機,但表4-6中任意一行的最后兩項的乘積一定小於65534。
這個例子說明,同樣的IP地址和不同的子網掩碼可以得出相同的網絡地址。但是,不同的掩碼的效果是不同的。在例4-2中,子網號是2位,主機號是14位。在例4-3中,子網號是3位,主機號是13位。因此這兩個例子中可划分的子網數和每一個子網中的最大主機數都是不一樣的。
使用子網時的分組轉發
在划分子網的情況下,分組轉發的算法必須做相應的改動。
我們應當注意到,使用子網划分后,路由表必須包含以下三項內容:目的網絡地址、子網掩碼和下一跳地址。
在划分子網的情況下,路由器轉發分組的算法如下:
- 從收到的數據報的首部提取目的IP地址。
- 先判斷是否為直接交付。對路由器直接相連的網絡逐個進行檢査:用各網絡的子網掩碼和D逐位相“與”(AND操作),看結果是否和相應的網絡地址匹配。若匹配,則把分組進行直接交付(當然還需要把。轉換成物理地址,把數據報封裝成幀發送出去),轉發任務結束。否則就是間接交付,執行(3)。
- 若路由表中有目的地址為D的特定主機路由,則把數據報傳送給路由表中所指明的下一跳路由器;否則,執行(4)。
- 對路由表中的每一行(目的網絡地址,子網掩碼,下一跳地址),用其中的子網掩碼和D逐位相''與”(AND操作),其結果為N。若N與該行的目的網絡地址匹配,則把數據報傳送給該行指明的下一跳路由器;否則,執行(5)。
- 若路由表中有一個默認路由,則把數據報傳送給路由表中所指明的默認路由器;否則,執行(6)。
- 報告轉發分組岀錯。
【例4~4】圖4-24有三個子網,兩個路由器,以及路由器R1中的部分路由表。現在源主機H1向目的主機H2發送分組。試討論R1收到H1向H2發送的分組后查找路由表的過程。
【解】源主機H1向目的主機H2發送的分組的目的地址是電的IP地址128.30.33.138。
源主機H1首先要進行的操作是要判斷:發送的這個分組,是在本子網上進行直接交付還是要通過本子網上的路由器進行間接交付?
源主機H1把本子網的“子網掩碼255.255.255.128”與目的主機H2的“IP地址128.30.33.138”逐相“與”(即逐位進行AND操作),得出128.30.33.128,它不等於H1的網絡地址(128.30.33.0)。這說明H2與H1不在同一個子網上。因此H1不能把分組直接交付H2,而必須交給子網上的默認路由器R1,由R1來轉發。
路由器R1在收到一個分組后,就在其路由表中逐行尋找有無匹配的網絡地址。
先看R1路由表中的第一行。用這一行的“子網掩碼255.255.255.128”和收到的分組的“目的地址128.30.33.138”逐位相“與”(即逐位進行AND操作),得出128.30.33.128。然后和這一行給出的目的網絡地址128.30.33.0進行比較。但比較的結果不一致(即不匹配)。
用同樣方法繼續往下找第二行。用第二行的“子網掩碼255.255.255.128”和該分組的'‘目的地址128.30.33.138 ”逐位相“與”(即逐位進行AND操作),結果也是128.30.33.128。這個結果和第二行的目的網絡地址128.30.33.128相匹配,說明這個網絡(子網2)就是收到的分組所要尋找的目的網絡。於是不需要再繼續査找下去。R1把分組從接口1直接交付主機H2 (它們都在一個子網上)。
無分類編址CIDR(構造超網)
網絡前綴
划分子網在一定程度上緩解了互聯網在發展中遇到的困難。然而在1992年互聯網仍然面臨三個必須盡早解決的問題,這就是:
- B類地址在1992年已分配了近一半,眼看很快就將全部分配完畢!
- 互聯網主干網上的路由表中的項目數急劇增長(從幾千個增長到幾萬個)。
- 整個IPv4的地址空間最終將全部耗盡。在2011年2月3日,IANA宣布IPv4地址己經耗盡了。
當時預計前兩個問題將在1994年變得非常嚴重。因此DETF很快就研究出釆用無分類編址的方法來解決前兩個問題。IETF認為上面的第三個問題屬於更加長遠的問題,因此專門成立IPv6工作組負責研究解決新版本IP協議的問題。
其實早在1987年,RFC 1009就指明了在一個划分子網的網絡中可同時使用幾個不同的子網掩碼。使用變長子網掩碼VLSM (Variable Length Subnet Mask)可進一步提高IP地址資源的利用率。在VLSM的基礎上又進一步研究出無分類編址方法,它的正式名字是無分類域間路由選擇 CIDR (Classless Inter-Domain Routing,,CIDR 的讀音是“sider")。CIDR最主要的特點有兩個:
-
CIDR消除了傳統的A類、B類和C類地址以及划分子網的概念,因而能更加有效地分配IPv4的地址空間,並且在新的IPv6使用之前容許互聯網的規模繼續增長。CIDR把32位的IP地址划分為前后兩個部分。前面部分是“網絡前綴” (network-prefix)(或簡稱為“前綴"),用來指明網絡,后面部分則用來指明主機。因此CIDR使IP地址從三級編址(使用子網掩碼)又回到了兩級編址,但這已是無分類的兩級編址。其記法是: IP地址::={〈網絡前綴>,<主機號〉}
CIDR還使用“斜線記法"(slash notation),或稱為CIDR記法,即在IP地址后面加上斜線“/”,然后寫上網絡前綴所占的位數。
-
CIDR把網絡前綴都相同的連續的IP地址組成一個“CIDR地址塊”。我們只要知道CIDR地址塊中的任何一個地址,就可以知道這個地址塊的起始地址(即最小地址)和最大地址,以及地址塊中的地址數。例如,已知IP地址128.14.35.7/20是某CIDR地址塊中的一個地址,現在把它寫成二進制表示,其中的前20位是網絡前綴(用粗體和下划線表示出),而前綴后面的12位是主機號:
當然,以上這兩個特殊地址的主機號是全0和全1的地址,一般並不使用。通常只使用在這兩個特殊地址之間的地址。不難看出,這個地址塊共有212個地址。我們可以用地址塊中的最小地址和網絡前綴的位數指明這個地址塊。例如,上面的地址塊可記為128.14.32.0/20。在不需要指出地址塊的起始地址時,也可把這樣的地址塊簡稱為“/20地址塊”。
為了更方便地進行路由選擇,CIDR使用32位的地址掩碼(address mask)。地址掩碼由一串1和一串0組成,而1的個數就是網絡前綴的長度。雖然CIDR不使用子網了,但由於目前仍有一些網絡還使用子網划分和子網掩碼,因此CIDR使用的地址掩碼也可繼續稱為子網掩碼。例如,/20地址塊的地址掩碼是:11111111 11111111 11110000 00000000 ( 20個連續的1)。斜線記法中,斜線后面的數字就是地址掩碼中1的個數。
請讀者注意,“CIDR不使用子網”是指CIDR並沒有在32位地址中指明若干位作為子網字段。但分配到一個CIDR地址塊的單位,仍然可以在本單位內根據需要划分出一些子網。這些子網也都只有一個網絡前綴和一台主機號字段,但子網的網絡前綴比整個單位的網絡前綴要長些。例如,某單位分配到地址塊/20,就可以再繼續划分為8個子網(即需要從主機號中借用3位來划分子網)。這時每一個子網的網絡前綴就變成23位(原來的20位加上從主機號借來的3位),比該單位的網絡前綴多了 3位。
斜線記法還有一個好處就是它除了表示一個IP地址外,還提供了其他一些重要信息。我們舉例說明如下。
例如,地址192.199.170.82/27不僅表示IP地址是192.199.170.82,而且還表示這個地址塊的網絡的前綴有27位(剩下的5位是主機號),因此這個地址塊包含32個IP地址(2^5 = 32)。通過簡單的計算還可得岀,這個地址塊的最小地址是192.199.170.64,最大地址是192.199.170.95。
具體的計算方法是這樣的。找出地址掩碼中1和0的交界處發生在地址中的哪一個字節。現在是在第四個字節。因此只要把這一個字節的十進制82用二進制表示即可。十進制82的二進制是01010010,取其前3位(這3位加上前3個字節的24位等於前綴的27位),再把后面5位都寫成0,即01000000,等於十進制的64。這就找出了地址塊的最小地址192.199.170.64。再把地址的第四字節的最后5位都置1,即01011111,等於十進制的95,這就找出了地址塊中的最大地址192.199.170.95。
由於一個CIDR地址塊中有很多地址,所以在路由表中就利用CIDR地址塊來查找目的網絡。這種地址的聚合常稱為路由聚合(route aggregation)。它使得路由表中的一個項目可以表示原來傳統分類地址的很多個(例如上千個)路由。路由聚合也稱為構成超網(supemetting)。如果沒有釆用CIDR,則在1994年和1995年,互聯網的一個路由表就會超過7萬個項目,而使用了 CIDR后,在1996年一個路由表的項目數才只有3萬多個。路由聚合有利於減少路由器之間的路由選擇信息的交換,從而提高了整個互聯網的性能。
CIDR記法有多種形式,例如,地址塊10.0.0.0/10可簡寫為10/10,也就是把點分十進制中低位連續的0省略。另一種簡化表示方法是在網絡前綴的后面加一個星號 * ,如:00001010 00 * 意思是:在星號 * 之前是網絡前綴,而星號 * 表示IP地址中的主機號,可以是任意值。
前綴位數不是8的整數倍時,需要進行簡單的計算才能得到一些地址信息。
表4-7給出了最常用的CIDR地址塊。表中的K表示2^10即1024。網絡前綴小於13或大於27都較少使用。在“包含的地址數”中沒有把全1和全0的主機號除外。
從表4-7可看出,每一個CIDR地址塊中的地址數一定是2的整數次幕。除最后幾行外,CIDR地址塊都包含了多個C類地址(是一個C類地址的2"倍,n是整數),這就是“構成超網”這一名詞的來源。
使用CIDR的一個好處就是可以更加有效地分配IPv4的地址空間,可根據客戶的需要分配適當大小的CIDR地址塊。然而在分類地址的環境中,向一個部門分配IP地址,就只能以/8, /16或/24為單位來分配。這就很不靈活。
圖4-25給出的是CIDR地址塊分配的例子。假定某ISP己擁有地址塊206.0.64.0/18 (相當於有64個C類網絡)。現在某大學需要800個IP地址。ISP可以給該大學分配一個地址塊206.0.68.0/22,它包括1024 (即2”)個IP地址,相當於4個連續的C類/24地址塊,占該ISP擁有的地址空間的l/16。這個大學然后可自由地對本校的各系分配地址塊,而各系還可再划分本系的地址塊。CIDR的地址塊分配有時不易看清,這是因為網絡前綴和主機號的界限不是恰好出現在整數字節處。只要寫出地址的二進制表示(從圖中的地址塊的二進制表示中可看出,實際上只需要將其中的一個關鍵字節轉換為二進制的表示即可),弄清網絡前綴的位數,就不會把地址塊的范圍弄錯。
從圖4-25可以清楚地看出地址聚合的概念。這個ISP共擁有64個C類網絡。如果不采用CIDR技術,則在與該ISP的路由器交換路由信息的每一個路由器的路由表中,就需要有64個項目。但釆用地址聚合后,就只需用路由聚合后的一個項目206.0.64.0/18就能找到該ISP6同理,這個大學共有4個系。在ISP內的路由器的路由表中,也需使用206.0.68.0/22這個項目。
從圖4-25下面表格中的二進制地址可看出,把四個系的路由聚合為大學的一個路由(即構成超網),是將網絡前綴縮短。網絡前綴越短,其地址塊所包含的地址數就越多。而在三級結構的IP地址中,划分子網是使網絡前綴變長。
最長前綴匹配
在使用CIDR時,由於釆用了網絡前綴這種記法,IP地址由網絡前綴和主機號這兩個部分組成,因此在路由表中的項目也要有相應的改變。這時,每個項目由“網絡前綴"和“下一跳地址”組成。但是在査找路由表時可能會得到不止一個匹配結果。這樣就帶來一個問題:我們應當從這些匹配結果中選擇哪一條路由呢?
正確的答案是:應當從匹配結果中選擇具有最長網絡前綴的路由。這叫做最長前綴匹配(longest-prefix matching),這是因為網絡前綴越長,其地址塊就越小,因而路由就越具體(more specific)。最長前綴匹配又稱為最長匹配或最佳匹配。為了說明最長前綴匹配的概念,我們仍以前面的例子來討論。
假定大學下屬的四系希望ISP把轉發給四系的數據報直接發到四系而不要經過大學的路由器,但又不願意改變自己使用的IP地址塊。因此,在ISP的路由器的路由表中,至少要有以下兩個項目,即206.0.68.0/22 (大學)和206.0.71.128/25 (四系)。現在假定ISP收到一個數據報,其目的IP地址為D = 206.0.71.130。把。分別和路由表中這兩個項目的掩碼逐位相“與"(AND操作)。將所得的逐位AND操作的結果按順序寫在下面。
D 和 111111111111111111111100 00000000 逐位相“與"=206.0.68.0/22 匹配
D 和 11111111111111111111111110000000 逐位相“與“ =206.0.71.128/25 匹配
不難看出,現在同一個IP地址。可以在路由表中找到兩個目的網絡(大學和四系)和該地址相匹配。根據最長前綴匹配的原理,應當選擇后者,把收到的數據報轉發到后一個目的網絡(四系),即選擇兩個匹配的地址中更具體的一個。
使用二叉線索查找路由表
使用CIDR后,由於要尋找最長前綴匹配,使路由表的査找過程變得更加復雜了。當路由表的項目數很大時,怎樣設法減小路由表的査找時間就成為一個非常重要的問題。例如,連接路由器的線路的速率為10 Gbit/s,而分組的平均長度為2000 bit,那么路由器就應當平均每秒鍾能夠處理500萬個分組(常記為5Mpps)。或者說,路由器處理一個分組的平均時間只有200 ns (1 ns= 10^秒)。因此,查找每一個路由所需的時間是非常短的。可見在路由表中必須使用很好的數據結構和使用先進的快速査找算法,這一直是人們積極研究的熱門課題。
為了進行更加有效的査找,通常是把無分類編址的路由表存放在一種層次的數據結構中,然后自上而下地按層次進行査找。這里最常用的就是二叉線索(binaiy trie),它是一種特殊結構的樹。IP地址中從左到右的比特值決定了從根節點逐層向下層延伸的路徑,而二叉線索中的各個路徑就代表路由表中存放的各個地址。
圖4-26用一個例子來說明二叉線索的結構。圖中給出了 5個IP地址。為了簡化二叉線索的結構,可以先找出對應於每一個IP地址的睢一前綴(unique prefix)。所謂唯一前綴就是在表中所有的IP地址中,該前綴是唯一的。這樣就可以用這些唯一前綴來構造二叉線索。在進行査找時,只要能夠和唯一前綴相匹配就行了。
從二叉線索的根節點自頂向下的深度最多有32層,每一層對應於IP地址中的一位。一個IP地址存入二叉線索的規則很簡單。先檢查IP地址左邊的第一位,如為0,則第一層的節點就在根節點的左下方;如為1,則在右下方。然后再檢查地址的第二位,構造出第二層的節點。依此類推,直到唯一前綴的最后一位。
由於唯一前綴一般都小於32位,因此用唯一前綴構造的二叉線索的深度往往不到32層。圖中較粗的折線就是前綴0101在這個二叉線索中的路徑。二叉線索中的小圓圈是中間節點,而在路徑終點的小方框是葉節點(也叫做外部節點)。每個葉節點代表一個唯一前綴。節點之間的連線旁邊的數字表示這條邊在唯一前綴中對應的比特是。或1。
假定有一個IP地址是10011011 01111010 00000000 00000000,需要查找該地址是否在此二叉線索中。我們從最左邊查起。很容易發現,査到第三個字符(即前綴10后面的0)時,在二叉線索中就找不到匹配的,說明這個地址不在這個二叉線索中。以上只是給出了二叉線索這種數據結構的用法,而並沒有說明“與唯一前綴匹配"和“與網絡前綴匹配"的關系。顯然,要將二叉線索用於路由表中,還必須使二叉線索中的每一個葉節點包含所對應的網絡前綴和子網掩碼。當搜索到一個葉節點時,就必須將尋找匹配的目的地址和該葉節點的子網掩碼進行逐位“與”運算,看結果是否與對應的網絡前綴相匹配。若匹配,就按下一跳的接口轉發該分組。否則,就丟棄該分組。
總之,二叉線索只是提供了一種可以快速在路由表中找到匹配的葉節點的機制。但這是否和網絡前綴匹配,還要和子網掩碼進行一次邏輯與的運算。為了提高二叉線索的査找速度,廣泛使用了各種壓縮技術。例如,在圖4-26中的最后兩個地址,其最前面的4位都是1011。因此,只要一個地址的前4位是1011,就可以跳過前面4位(即壓縮了 4個層次)而直接從第5位開始比較。這樣就可以減少査找的時間。當然,制作經過壓縮的二叉線索需要更多的計算,但由於每一次査找路由表時都可以提高查找
速度,因此這樣做還是值得的。
網際控制報文協議ICMP
為了更有效地轉發IP數據報和提高交付成功的機會,在網際層使用了網際控制報文協設 ICMP (Internet Control Message Protocol) 。 ICMP 允許主機或路由器報告差錯情況和提供有關異常情況的報告。ICMP是互聯網的標准協議。但ICMP不是高層協議(看起來好像是高層協議,因為ICMP報文是裝在IP數據報中,作為其中的數據部分),而是IP層的協議。ICMP報文作為IP層數據報的數據,加上數據報的首部,組成IP數據報發送出去。ICMP報文格式如圖4-27所示。
ICMP報文的種類
ICMP報文的種類有兩種,即ICMP差錯報告報文和ICMP詢問報文。
ICMP報文的前4個字節是統一的格式,共有三個字段:類型、代碼和檢驗和。接着的4個字節的內容與ICMP的類型有關。最后面是數據字段,其長度取決於ICMP的類型。
表4-8給出了幾種常用的ICMP報文類型。
ICMP報文的代碼字段是為了進一步區分某種類型中的幾種不同情況。檢驗和字段用來檢驗整個ICMP報文。我們應當還記得,IP數據報首部的檢驗和並不檢驗IP數據報的內容,因此不能保證經過傳輸的ICMP報文不產生差錯。
表4-8給出的ICMP差錯報告報文共有四種,即:
- 終點不可達 當路由器或主機不能交付數據報時就向源點發送終點不可達報文。
- 時間超過 當路由器收到生存時間為零的數據報時,除丟棄該數據報外,還要向源點發送時間超過報文。當終點在預先規定的時間內不能收到一個數據報的全部數據報片時,就把己收到的數據報片都丟棄,並向源點發送時間超過報文。
- 參數問題 當路由器或目的主機收到的數據報的首部中有的字段的值不正確時,就丟棄該數據報,並向源點發送參數問題報文。
- 改變路由(重定向) 路由器把改變路由報文發送給主機,讓主機知道下次應將數據報發送給另外的路由器(可通過更好的路由)。
所有的ICMP差錯報吿報文中的數據字段都具有同樣的格式(圖4-28)。把收到的需要進行差錯報告的IP數據報的首部和數據字段的前8個字節提取出來,作為ICMP報文的數據字段。再加上相應的ICMP差錯報告報文的前8個字節,就構成了 ICMP差錯報告報文。
提取收到的數據報的數據字段前8個字節是為了得到運輸層的端口號(對於TCP和UDP)以及運輸層報文的發送序號(對於TCP)。這些信息對源點通知高層協議是有用的(端口的作用將在下一章的5.1.3節中介紹)。整個ICMP報文作為IP數據報的數據字段發送給源點。
下面是不應發送ICMP差錯報告報文的幾種情況。
- 對ICMP差錯報告報文,不再發送ICMP差錯報告報文。
- 對第一個分片的數據報片的所有后續數據報片,都不發送ICMP差錯報告報文。
- 對具有多播地址的數據報,都不發送ICMP差錯報告報文。
- 對具有特殊地址(如127.0.0.0或0.0.0.0)的數據報,不發送ICMP差錯報告報文。
常用的ICMP詢問報文有兩種,即:
- 回送請求和回答 ICMP回送請求報文是由主機或路由器向一個特定的目的主機發出的詢問。收到此報文的主機必須給源主機或路由器發送ICMP回送回答報文。這種詢問報文用來測試目的站是否可達以及了解其有關狀態。
- 時間戳請求和回答 ICMP時間戳請求報文是請某台主機或路由器回答當前的日期和時間。在ICMP時間戳回答報文中有一個32位的字段,其中寫入的整數代表從1900年1月1日起到當前時刻一共有多少秒。時間戳請求與回答可用於時鍾同步和時間測量。
互聯網的路由選擇協議
有關路由選擇協議的幾個基本概念
理想的路由選擇算法
路由選擇協議的核心就是路由算法,即需要何種算法來獲得路由表中的各項目。一個理想的路由算法應具有如下的一些特點:
- 算法必須是正確的和完整的。這里,“正確"的含義是:沿着各路由表所指引的路由,分組一定能夠最終到達目的網絡和目的主機。
- 算法在計算上應簡單。路由選擇的計算不應使網絡通信量增加太多的額外開銷。
- 算法應能適應通信量和網絡拓撲的變化,這就是說,要有自適應性。當網絡中的通信量發生變化時,算法能自適應地改變路由以均衡各鏈路的負載。當某個或某些結點、鏈路發生故障不能工作,或者修理好了再投入運行時,算法也能及時地改變路由。有時稱這種自適應性為“穩健性” (robustness)o①
- 算法應具有穩定性。在網絡通信量和網絡拓撲相對穩定的情況下,路由算法應收斂於一個可以接受的解,而不應使得出的路由不停地變化。
- 算法應是公平的。路由選擇算法應對所有用戶(除對少數優先級高的用戶)都是平等的。例如,若僅僅使某一對用戶的端到端時延為最小,但卻不考慮其他的廣大用戶,這就明顯地不符合公平性的要求。
- 算法應是最佳的。路由選擇算法應當能夠找出最好的路由,使得分組平均時延最小而網絡的吞吐量最大。雖然我們希望得到“最佳"的算法,但這並不總是最重要的。對於某些網絡,網絡的可靠性有時要比最小的分組平均時延或最大吞吐量更加重要。因此,所謂“最佳”只能是相對於某一種特定要求下得出的較為合理的選擇而已。
一個實際的路由選擇算法,應盡可能接近於理想的算法。在不同的應用條件下,對以上提出的六個方面也可有不同的側重。
應當指出,路由選擇是個非常復雜的問題,因為它是網絡中的所有結點共同協調工作的結果。其次,路由選擇的環境往往是不斷變化的,而這種變化有時無法事先知道,例如,網絡中出了某些故障。此外,當網絡發生擁塞時,就特別需要有能緩解這種擁塞的路由選擇策略,但恰好在這種條件下,很難從網絡中的各結點獲得所需的路由選擇信息。
倘若從路由算法能否隨網絡的通信量或拓撲自適應地進行調整變化來划分,則只有兩大類,即靜態路由選擇策略與動態路由選擇策略。
靜態路由選擇也叫做非自適應路由選擇,其特點是簡單和開銷較小,但不能及時適應網絡狀態的變化。對於很簡單的小網絡,完全可以采用靜態路由選擇,用人工配置每一條路由。
動態路由選擇也叫做自適應路由選擇,其特點是能較好地適應網絡狀態的變化,但實現起來較為復雜,開銷也比較大。因此,動態路由選擇適用於較復雜的大網絡。
分層次的路由選擇協議
互聯網釆用的路由選擇協議主要是自適應的(即動態的)、分布式路由選擇協議。由於以下兩個原因,互聯網采用分層次的路由選擇協議:
- 互聯網的規模非常大。如果讓所有的路由器知道所有的網絡應怎樣到達,則這種路由表將非常大,處理起來也太花時間。而所有這些路由器之間交換路由信息所需的帶寬就會使互聯網的通信鏈路飽和。
- 許多單位不願意外界了解自己單位網絡的布局細節和本部門所采用的路由選擇協議(這屬於本部門內部的事情),但同時還希望連接到互聯網上。
為此,可以把整個互聯網划分為許多較小的自治系統(autonomous system),一般都記為AS。自治系統AS是在單一技術管理下的一組路由器,而這些路由器使用一種自治系統內部的路由選擇協議和共同的度量。一個AS對其他AS表現出的是一個單一的和一致的路由選擇策略。
在目前的互聯網中,一個大的ISP就是一個自治系統。這樣,互聯網就把路由選擇協議划分為兩大類,即:
- 內部網關協議IGP(Interior Gateway Protocol) 即在一個自治系統內部使用的路由選擇協議,而這與在互聯網中的其他自治系統選用什么路由選擇協議無關。目前這類路由選擇協議使用得最多,如RIP和OSPF協議。
- 外部網關協議EGP (External Gateway Protocol) 若源主機和目的主機處在不同的自治系統中(這兩個自治系統可能使用不同的內部網關協議),當數據報傳到一個自治系統的邊界時,就需要使用一種協議將路由選擇信息傳遞到另一個自治系統中。這樣的協議就是外部網關協議EGP。目前使用最多的外部網關協議是BGP的版本4 (BGP-4)。
自治系統之間的路由選擇也叫做域間路由選擇(interdomain routing),而在自治系統內部的路由選擇叫做域內路由選擇(intradomain routing) 。
圖4-31是兩個自治系統互連在一起的示意圖。每個自治系統自己決定在本自治系統內部運行哪一個內部路由選擇協議(例如,可以是RIP,也可以是OSPF)。但每個自治系統都有一個或多個路由器(圖中的路由器R1和R2)除運行本系統的內部路由選擇協議外,還要運行自治系統間的路由選擇協議(BGPY)。
內部網關協議RIP
工作原理
RIP (Routing Information Protocol)是內部網關協議IGP中最先得到廣泛使用的協議,它的中文名稱叫做路由信息協議,但很少被使用。RIP是一種分布式的基於距離向量的路由選擇協議,是互聯網的標准協議,其最大優點就是簡單。
RIP協議要求網絡中的每一個路由器都要維護從它自己到其他每一個目的網絡的距離記錄(因此,這是一組距離,即“距離向量”)。
RIP協議將“距離”定義如下:從一路由器到直接連接的網絡的距離定義為1。從一路由器到非直接連接的網絡的距離定義為所經過的路由器數加1。“加1”是因為到達目的網絡后就進行直接交付,而到直接連接的網絡的距離己經定義為1,例如在前面講過的圖4-16中,路由器田到網1或網2的距離都是1 (直接連接),而到網3的距離是2,到網4的距離是3。
RIP協議的“距離”也稱為“跳數” (hop count),因為每經過一個路由器,跳數就加1。RIP認為好的路由就是它通過的路由器的數目少,即“距離短"。RIP允許一條路徑最多只能包含15個路由器。因此“距離”等於16時即相當於不可達。可見RIP只適用於小型互聯網。
RIP不能在兩個網絡之間同時使用多條路由。RIP選擇一條具有最少路由器的路由(即最短路由),哪怕還存在另一條高速(低時延)但路由器較多的路由。
本節討論的RIP協議和下一節要討論的OSPF協議,都是分布式路由選擇協議。它們的共同特點就是每一個路由器都要不斷地和其他一些路由器交換路由信息。我們一定要弄清以下三個要點,即和哪些路由器交換信息?交換什么信息?在什么時候交換信息?
RIP協議的特點是:
- 僅和相鄰路由器交換信息。如果兩個路由器之間的通信不需要經過另一個路由器,那么這兩個路由器就是相鄰的。RIP協議規定,不相鄰的路由器不交換信息。
- 路由器交換的信息是當前本路由器所知道的全部信息,即自己現在的路由表。也就是說,交換的信息是:“我到本自治系統中所有網絡的(最短)距離,以及到每個網絡應經過的下一跳路由器"。
- 按固定的時間間隔交換路由信息,例如,每隔30秒。然后路由器根據收到的路由信息更新路由表。當網絡拓撲發生變化時,路由器也及時向相鄰路由器通告拓撲變化后的路由信息。
這里要強調一點:路由器在剛剛開始工作時,它的路由表是空的。然后路由器就得出到直接相連的幾個網絡的距離(這些距離定義為1)。接着,每一個路由器也只和數目非常有限的相鄰路由器交換並更新路由信息。但經過若干次的更新后,所有的路由器最終都會知道到達本自治系統中任何一個網絡的最短距離和下一跳路由器的地址。
看起來RIP協議有些奇怪,因為'‘我的路由表中的信息要依賴於你的,而你的信息又依賴於我的。'‘然而事實證明,通過這樣的方式——“我告訴別人一些信息,而別人又告訴我一些信息。我再把我知道的更新后的信息吿訴別人,別人也這樣把更新后的信息再告訴我”,最后在自治系統中所有的結點都得到了正確的路由選擇信息。在一般情況下,RIP協議可以收斂,並且過程也較快。“收斂”就是在自治系統中所有的結點都得到正確的路由選擇信息的過程。
路由表中最主要的信息就是:到某個網絡的距離(即最短距離),以及應經過的下一跳地址。路由表更新的原則是找出到每個目的網絡的最短距離。這種更新算法又稱為距離向量算法。下面就是RIP協議使用的距離向量算法。
距離向量算法
對每一個相鄰路由器發送過來的RIP報文,進行以下步驟:
- 對地址為X的相鄰路由器發來的RIP報文,先修改此報文中的所有項目:把“下一跳"字段中的地址都改為X,並把所有的“距離"字段的值加1 (見后面的解釋1)。每一個項目都有三個關鍵數據,即:到目的網絡N,距離是d,下一跳路由器是X。
- 對修改后的RIP報文中的每一個項目,進行以下步驟:若原來的路由表中沒有目的網絡N,則把該項目添加到路由表中(見解釋2)。否則(即在路由表中有目的網絡N,這時就再査看下一跳路由器地址)若下一跳路由器地址是X,則把收到的項目替換原路由表中的項目(見解釋3)。否則(即這個項目是:到目的網絡N,但下一跳路由器不是X)若收到的項目中的距離d小於路由表中的距離,則進行更新(見解釋4),否則什么也不做。(見解釋5)
- 若3分鍾還沒有收到相鄰路由器的更新路由表,則把此相鄰路由器記為不可達的路由器,即把距離置為16 (距離為16表示不可達)。
- 返回。
上面給出的距離向量算法的基礎就是Bellman-Ford算法(或Ford-Fulkerson算法)。這種算法的要點是這樣的:
設X是結點A到B的最短路徑上的一個結點。若把路徑A->B拆成兩段路徑A->X和X->B,則每一段路徑A->X和X->B也都分別是結點A到X和結點X到B的最短路徑。
下面是對上述距離向量算法的五點解釋。
解釋1:這樣做是為了便於進行本路由表的更新。假設從位於地址X的相鄰路由器發來的RIP報文的某一個項目是:“Net2,3,Y”,意思是“我經過路由器Y到網絡Net2的距離是3”,那么本路由器就可推斷出:“我經過X到網絡Net2的距離應為3+ 1=4”。於是,本路由器就把收到的RIP報文的這一個項目修改為“Net2, 4, X”,作為下一步和路由表中原有項目進行比較時使用(只有比較后才能知道是否需要更新)。讀者可注意到,收到的項目中的Y對本路由器是沒有用的,因為Y不是本路由器的下一跳路由器地址。
解釋2:表明這是新的目的網絡,應當加入到路由表中。例如,本路由表中沒有到目的網絡Net2的路由,那么在路由表中就要加入新的項目“Net2,4,X”。
解釋3:為什么要替換呢?因為這是最新的消息,要以最新的消息為准。到目的網絡的距離有可能增大或減小,但也可能沒有改變。例如,不管原來路由表中的項目是“Net2, 3,X”還是“Net2,5,X”,都要更新為現在的“Net2,4,X”。
解釋4:例如,若路由表中已有項目“Net2,5,P",就要更新為“Net2,4,X”。因為到網絡Net2的距離原來是5,現在減到4,更短了。
解釋5:若距離更大了,顯然不應更新。若距離不變,更新后得不到好處,因此也不更新。
【例4-5】己知路由器R6有表4-9(a)所示的路由表。現在收到相鄰路由器R4發來的路由更新信息,如表4-9(b)所示。試更新路由器R6的路由表。
【解】如同路由器一樣,我們不需要知道該網絡的拓撲。先把表4-9(b)中的距離都加1,並把下一跳路由器都改為R4。得出表4-9(c)。
把這個表的每一行和表4-9(a)進行比較。
第一行在表4-9(a)中沒有,因此要把這一行添加到表4-9(a)中。
第二行的Net2在表4-9(a)中有,且下一跳路由器也是因此要更新(距離增大了)。
第三行的Net3在表4-9(a)中有,但下一跳路由器不同。於是就要比較距離。新的路由信息的距離是2,小於原來表中的4,因此要更新。
這樣,得出更新后的瑙的路由表如表4-9(d)所示。
RIP協議讓一個自治系統中的所有路由器都和自己的相鄰路由器定期交換路由信息,並不斷更新其路由表,使得從每一個路由器到每一個目的網絡的路由都是最短的(即跳數最少)。這里還應注意:雖然所有的路由器最終都擁有了整個自治系統的全局路由信息,但由於每一個路由器的位置不同,它們的路由表當然也應當是不同的。
RIP協議的報文格式
圖4-32是RIP2的報文格式,它和RIP1的首部相同,但后面的路由部分不一樣。從圖4-32還可看出,RIP協議使用運輸層的用戶數據報UDP進行傳送(使用UDP的端口 520)。
RIP報文由首部和路由部分組成。
RIP的首部占4個字節,其中的命令字段指出報文的意義。例如,1表示請求路由信息,2表示對請求路由信息的響應或未被請求而發出的路由更新報文。首部后面的“必為0”是為了 4字節字的對齊。
RIP2報文中的路由部分由若干個路由信息組成。每個路由信息需要用20個字節。地址族標識符(又稱為地址類別)字段用來標志所使用的地址協議。如釆用IP地址就令這個字段的值為2 (原來考慮RIP也可用於其他非TCP/IP協議的情況)。路由標記填入自治系統號ASN(Autonomous System Number),這是考慮使RIP有可能收到本自治系統以外的路由選擇信息。再后面指出某個網絡地址、該網絡的子網掩碼、下一跳路由器地址以及到此網絡的距離。一個RIP報文最多可包括25個路由,因而RIP報文的最大長度是4 + 20 x 25 = 504字節。如超過,必須再用一個RIP報文來傳送。
RIP2還具有簡單的鑒別功能。若使用鑒別功能,則將原來寫入第一個路由信息(20字節)的位置用作鑒別。這時應將地址族標識符置為全1 (即OxFFFF),而路由標記寫入鑒別類型,剩下的16字節為鑒別數據。在鑒別數據之后才寫入路由信息,但這時最多只能再放入24個路由信息。
RIP存在的一個問題是當網絡出現故障時,要經過比較長的時間才能將此信息傳送到所有的路由器。我們可以用圖4-33的簡單例子來說明。
設三個網絡通過兩個路由器互連起來,並且都己建立了各自的路由表。圖中路由器交換的信息只給出了我們感興趣的一行內容。路由器R1中的“1, 1,直接”表示“到網1的距離是1,直接交付”。路由器R2中的“1,2,Ri”表示“到網1的距離是2,下一跳經過R1”。
現在假定路由器R2到網1的鏈路出了故障,R1無法到達網1。於是路由器R1把到網1的距離改為16 (表示到網1不可達),因而在R1的路由表中的相應項目變為“1, 16,直接"。但是,很可能要經過30秒鍾后R1才把更新信息發送給R2。然而R2可能已經先把自己的路由表發送給了 R1,其中有“1,2,R1”這一項。
R1收到R2的更新報文后,誤認為可經過R2到達網1,於是把收到的路由信息“1, 2,R1"修改為:"1, 3, R2”,表明“我到網1的距離是3,下一跳經過R2”,並把更新后的信息發送給R2。
同理,R2接着又更新自己的路由表為“1, 4, R1“,以為“我到網1距離是4,下一跳經過R1”。
這樣的更新一直繼續下去,直到R1和R2到網1的距離都增大到16時,R1和R2才知道原來網1是不可達的。RIP協議的這一特點叫做:好消息傳播得快,而壞消息傳播得慢。網絡出故障的傳播時間往往需要較長的時間(例如數分鍾)。這是RIP的一個主要缺點。
但如果一個路由器發現了更短的路由,那么這種更新信息就傳播得很快。為了使壞消息傳播得更快些,可以采取多種措施。例如,讓路由器記錄收到某特定路由信息的接口,而不讓同一路由信息再通過此接口向反方向傳送。總之,RIP協議最大的優點就是實現簡單,開銷較小。
但RIP協議的缺點也較多。首先,RIP限制了網絡的規模,它能使用的最大距離為15 (16表示不可達)。其次,路由器之間交換的路由信息是路由器中的完整路由表,因而隨着網絡規模的擴大,開銷也就增加。最后,“壞消息傳播得慢”,使更新過程的收斂時間過長。因此,對於規模較大的網絡就應使
用下一節所述的OSPF協議。然而目前在規模較小的網絡中,使用RIP協議的仍占多數。
內部網關協議OSPF
OSFP的基本特點
這個協議的名字是開放最短路徑優先OSPF (Open Shortest Path First)。它是為克服RIP的缺點在1989年開發出來的。OSPF的原理很簡單,但實現起來卻較復雜。"開放”表明OSPF協議不是受某一家廠商控制,而是公開發表的。“最短路徑優先”是因為使用了Dijkstra提出的最短路徑算法SPF。
請注意:OSPF只是一個協議的名字,它並不表示其他的路由選擇協議不是“最短路徑優先。實際上,所有的在自治系統內部使用的路由選擇協議(包括RIP協議)都是要尋找一條最短的路徑。
OSPF最主要的特征就是使用分布式的鏈路狀態協議(link state protocol),而不是像RIP那樣的距離向量協議。和RIP協議相比,OSPF的三個要點和RIP的都不一樣:
- 向本自治系統中所有路由器發送信息。這里使用的方法是洪泛法(flooding),這就是路由器通過所有輸出端口向所有相鄰的路由器發送信息。而每一個相鄰路由器又再將此信息發往其所有的相鄰路由器(但不再發送給剛剛發來信息的那個路由器)。這樣,最終整個區域中所有的路由器都得到了這個信息的一個副本。更具體的做法后面還要討論。我們應注意,RIP協議是僅僅向自己相鄰的幾個路由器發送信息。
- 發送的信息就是與本路由器相鄰的所有路由器的鏈路狀態,但這只是路由器所知道的部分信息。所謂“鏈路狀態”就是說明本路由器都和哪些路由器相鄰,以及該鏈路的“度量” (metric)。 OSPF將這個“度量”用來表示費用、距離、時延、帶寬,等等。這些都由網絡管理人員來決定,因此較為靈活。有時為了方便就稱這個度量為“代價”。我們應注意,對於RIP協議,發送的信息是:“到所有網絡的距離和下一跳路由器”。
- 只有當鏈路狀態發生變化時,路由器才向所有路由器用洪泛法發送此信息。而不像RIP那樣,不管網絡拓撲有無發生變化,路由器之間都要定期交換路由表的信息。
從上述的三個方面可以看出,OSPF和RIP的工作原理相差較大。
由於各路由器之間頻繁地交換鏈路狀態信息,因此所有的路由器最終都能建立一個鏈路狀態數據庫(link-state database),這個數據庫實際上就是全網的拓撲結構圖。這個拓撲結構圖在全網范圍內是一致的(這稱為鏈路狀態數據庫的同步)。因此,每一個路由器都知道全網共有多少個路由器,以及哪些路由器是相連的,其代價是多少,等等。
每一個路由器使用鏈路狀態數據庫中的數據,構造出自己的路由表(例如,使用Dijkstra的最短路徑路由算法)。我們注意到,RIP協議的每一個路由器雖然知道到所有的網絡的距離以及下一跳路由器,但卻不知道全網的拓撲結構(只有到了下一跳路由器,才能知道再下一跳應當怎樣走)。
OSPF的鏈路狀態數據庫能較快地進行更新,使各個路由器能及時更新其路由表。OSPF的更新過程收斂得快是其重要優點。
為了使OSPF能夠用於規模很大的網絡,OSPF將一個自治系統再划分為若干個更小的范圍,叫做區域(area)。圖4-34就表示一個自治系統划分為四個區域。每一個區域都有一個32位的區域標識符(用點分十進制表示)。當然,一個區域也不能太大,在一個區域內的路由器最好不超過200個。
划分區域的好處就是把利用洪泛法交換鏈路狀態信息的范圍局限於每一個區域而不是整個的自治系統,這就減少了整個網絡上的通信量。在一個區域內部的路由器只知道本區域的完整網絡拓撲,而不知道其他區域的網絡拓撲的情況。
為了使每一個區域能夠和本區域以外的區域進行通信,OSPF使用層次結構的區域划分。在上層的區域叫做主干區域(backbonearea)。主干區域的標識符規定為0.0.0.0。主干區域的作用是用來連通其他在下層的區域。從其他區域來的信息都由區域邊界路由器(area border router)進行概括。
在圖4-34中,路由器R3, R4和R7都是區域邊界路由器,而顯然,每一個區域至少應當有一個區域邊界路由器。在主干區域內的路由器叫做主干路由器(backbone router),如R3,R4,R5,R6 和R7。一個主干路由器可以同時是區域邊界路由器,如R3,R4和R7。在主干區域內還要有一個路由器專門和本自治系統外的其他自治系統交換路由信息。這樣的路由器叫做自治系統邊界路由器(如圖中的R6)。
采用分層次划分區域的方法雖然使交換信息的種類增多了,同時也使OSPF協議更加復雜了。但這樣做卻能使每一個區域內部交換路由信息的通信量大大減小,因而使OSPF協議能夠用於規模很大的自治系統中。這里,我們再一次地看到划分層次在網絡設計中的重要性。
OSPF不用UDP而是直接用IP數據報傳送(其IP數據報首部的協議字段值為89)。OSPF構成的數據報很短。這樣做可減少路由信息的通信量。數據報很短的另一好處是可以不必將長的數據報分片傳送。分片傳送的數據報只要丟失一個,就無法組裝成原來的數據報,而整個數據報就必須重傳。
OSPF分組使用24字節的固定長度首部(見圖4-35),分組的數據部分可以是五種類型分組中的一種。下面簡單介紹OSPF首部各字段的意義。
- 版本 當前的版本號是2。
- 類型 可以是五種類型分組中的一種。
- 分組長度 包括OSPF首部在內的分組長度,以字節為單位。
- 路由器標識符 標志發送該分組的路由器的接口的IP地址。
- 區域標識符 分組屬於的區域的標識符。
- 檢驗和 用來檢測分組中的差錯。
- 鑒別類型 目前只有兩種,0 (不用)和1 (口令)。
- 鑒別 鑒別類型為0時就填入0,鑒別類型為1則填入8個字符的口令。
除了以上的幾個基本特點外,OSPF還具有下列的一些特點:
- OSPF允許管理員給每條路由指派不同的代價。例如,高帶寬的衛星鏈路對於非實時的業務可設置為較低的代價,但對於時延敏感的業務就可設置為非常高的代價。因此,OSPF對於不同類型的業務可計算出不同的路由。鏈路的代價可以是1至65535中的任何一個無量綱的數,因此十分靈活。商用的網絡在使用OSPF時,通常根據鏈路帶寬來計算鏈路的代價。這種靈活性是RIP所沒有的。
- 如果到同一個目的網絡有多條相同代價的路徑,那么可以將通信量分配給這幾條路徑。這叫做多路徑間的負載平衡(load balancing)。在代價相同的多條路徑上分配通信量是通信量工程中的簡單形式。RIP只能找出到某個網絡的一條路徑。
- 所有在OSPF路由器之間交換的分組(例如,鏈路狀態更新分組)都具有鑒別的功能,因而保證了僅在可信賴的路由器之間交換鏈路狀態信息。
- OSPF支持可變長度的子網划分和無分類的編址CIDR。
- 由於網絡中的鏈路狀態可能經常發生變化,因此OSPF讓每一個鏈路狀態都帶上一個32位的序號,序號越大狀態就越新。OSPF規定,鏈路狀態序號增長的速率不得超過每5秒鍾1次。這樣,全部序號空間在600年內不會產生重復號。
OSPF的五種分組類型
OSPF共有以下五種分組類型:
- 類型1,問候(Hello)分組,用來發現和維持鄰站的可達性。
- 類型2,數據庫描述(Database Description)分組,向鄰站給出自己的鏈路狀態數據庫中的所有鏈路狀態項目的摘要信息。
- 類型3,鏈路狀態請求(Link Stat® Request)分組,向對方請求發送某些鏈路狀態項目的詳細信息。
- 類型4,鏈路狀態更新(Link State Update)分組,用洪泛法對全網更新鏈路狀態。這種分組是最復雜的,也是OSPF協議最核心的部分。路由器使用這種分組將其鏈路狀態通知給鄰站。鏈路狀態更新分組共有五種不同的鏈路狀態[RFC2328],這里從略。
- 類型5,鏈路狀態確認(Link State Acknowledgment)分組,對鏈路更新分組的確認。
OSPF規定,每兩個相鄰路由器每隔10秒鍾要交換一次問候分組。這樣就能確知哪些鄰站是可達的。對鄰路由器來說,“可達”是最基本的要求,因為只有可達鄰站的鏈路狀態信息才存入鏈路狀態數據庫(路由表就是根據鏈路狀態數據庫計算出來的)。在正常情況下,網絡中傳送的絕大多數OSPF分組都是問候分組。若有40秒鍾沒有收到某個相鄰路由器發來的問候分組,則可認為該相鄰路由器是不可達的,應立即修改鏈路狀態數據庫,並重新計算路由表。
其他的四種分組都是用來進行鏈路狀態數據庫的同步。所謂同步就是指不同路由器的鏈路狀態數據庫的內容是一樣的。兩個同步的路由器叫做“完全鄰接的"(fully adjacent)路由器。不是完全鄰接的路由器表明它們雖然在物理上是相鄰的,但其鏈路狀態數據庫並沒有達到一致。
當一個路由器剛開始工作時,它只能通過問候分組得知它有哪些相鄰的路由器在工作,以及將數據發往相鄰路由器所需的“代價”。如果所有的路由器都把自己的本地鏈路狀態信息對全網進行廣播,那么各路由器只要將這些鏈路狀態信息綜合起來就可得出鏈路狀態數據庫。但這樣做開銷太大,因此OSPF釆用下面的辦法。
OSPF讓每一個路由器用數據庫描述分組和相鄰路由器交換本數據庫中已有的鏈路狀態摘要信息。摘要信息主要就是指出有哪些路由器的鏈路狀態信息(以及其序號)己經寫入了數據庫。經過與相鄰路由器交換數據庫描述分組后,路由器就使用鏈路狀態請求分組,向對方請求發送自己所缺少的某些鏈路狀態項目的詳細信息。
通過一系列的這種分組交換,全網同步的鏈路數據庫就建立了。
圖4-36給出了 OSPF的基本操作,說明了兩個路由器需要交換各種類型的分組。
在網絡運行的過程中,只要一個路由器的鏈路狀態發生變化,該路由器就要使用鏈路狀態更新分組,用洪泛法向全網更新鏈路狀態。OSPF使用的是可靠的洪泛法,其要點見圖4-37所示。設路由器R用洪泛法發出鏈路狀態更新分組。圖中用一些小的箭頭表示更新分組。第一次先發給相鄰的三個路由器。這三個路由器將收到的分組再進行轉發時,要將其上游路由器除外。可靠的洪泛法是在收到更新分組后要發送確認(收到重復的更新分組只需要發送一次確認)。圖中的空心箭頭表示確認分組。
為了確保鏈路狀態數據庫與全網的狀態保持一致,OSPF還規定每隔一段時間,如30分鍾,要刷新一次數據庫中的鏈路狀態。
由於一個路由器的鏈路狀態只涉及到與相鄰路由器的連通狀態,因而與整個互聯網的規模並無直接系。因此當互聯網規模很大時,OSPF協議要比距離向量協議RIP好得多。由於OSPF沒有“壞消息傳播得慢”的問題,據統計,其響應網絡變化的時間小於100 ms。
若N個路由器連接在一個以太網上,則每個路由器要向其他(N - 1)個路由器發送鏈路狀態信息,因而共有MN-1)個鏈路狀態要在這個以太網上傳送。OSPF協議對這種多點接入的局域網釆用了指定的路由器(designated router)的方法,使廣播的信息量大大減少。指定的路由器代表該局域網上所有的鏈路向連接到該網絡上的各路由器發送狀態信息。
外部網關協議BGP
1989年,公布了新的外部網關協議——邊界網關協議BGP。
我們首先應當弄清,在不同自治系統AS之間的路由選擇為什么不能使用前面討論過的內部網關協議,如RIP或OSPF?
我們知道,內部網關協議 (如RIP或OSPF)主要是設法使數據報在一個AS中盡可能有效地從源站傳送到目的站。在一個AS內部也不需要考慮其他方面的策略。然而BGP使用的環境卻不同。這主要是因為以下的兩個原因:
第一,互聯網的規模太大,使得自治系統AS之間路由選擇非常困難。
另外,由於自治系統AS各自運行自己選定的內部路由選擇協議,並使用本AS指明的路徑度量,因此,當一條路徑通過幾個不同AS時,要想對亨樣的路徑計算出有意義的代價是不太可能的。
例如,對某AS來說,代價為1000可能表示一條比較長的路由。但對另一 AS代價為1000卻可能表示不可接受的壞路由。因此,對於自治系統AS之間的路由選擇,要用“代價”作為度量來尋找最佳路由也是
很不現實的。
比較合理的做法是在自治系統之間交換“可達性”信息(即“可到達”或“不可到達")。
第二,自治系統AS之間的路由選擇必須考慮有關策略。由於相互連接的網絡的性能相差很大,根據最短距離(即最少跳數)找出來的路徑,可能並不合適。也有的路徑的使用代價很高或很不安全。
由於上述情況,邊界網關協議BGP只能是力求尋找一條能夠到達目的網絡且比較好的路由(不能兜圈子),而並非要尋找一條最佳路由。BGP采用了路徑向量(path vector)路由選擇協議,它與距離向量協議(如RIP)和鏈路狀態協議(如OSPF)都有很大的區別。
在配置BGP時,每一個自治系統的管理員要選擇至少一個路由器作為該自治系統的“BGP發言人"。一般說來,兩個BGP發言人都是通過一個共享網絡連接在一起的,而BGP發言人往往就是BGP邊界路由器,但也可以不是BGP邊界路由器。
一個BGP發言人與其他AS的BGP發言人要交換路由信息,就要先建立TCP連接(端口號為179),然后在此連接上交換BGP報文以建立BGP會話(session),利用BGP會話交換路由信息,如增加了新的路由,或撤銷過時的路由,以及報告出差錯的情況等等。使用TCP連接能提供可靠的服務,也簡化了路由選擇協議。使用TCP連接交換路由信息的兩個BGP發言人,彼此成為對方的鄰站(neighbor)或對等站(peer)。
圖4-38表示BGP發言人和自治系統AS的關系的示意圖。在圖中畫出了三個自治系統中的5個BGP發言人。每一個BGP發言人除了必須運行BGP協議外,還必須運行該自治系統所使用的內部網關協議,如OSPF或RIP。
邊界網關協議BGP所交換的網絡可達性的信息就是要到達某個網絡(用網絡前綴表示)所要經過的一系列自治系統。當BGP發言人互相交換了網絡可達性的信息后,各BGP發言人就根據所釆用的策略從收到的路由信息中找出到達各自治系統的較好路由。圖4-39表示從圖4-38的AS1上的一個BGP發言人構造出的自治系統連通圖,它是樹形結構,不存在回路。
在第1章的1.2.2節我們已經介紹了當前互聯網的多級結構特點(圖1-4)。這種多級結構的網絡拓撲決定了 BGP路由選擇協議的特點。
圖4-40給出了一個BGP發言人交換路徑向量的例子。自治系統AS2的BGP發言人通知主干網的BGP發言人:“要到達網絡N1, N2, N3和N4可經過AS2。”主干網在收到這個通知后,就發出通知:“要到達網絡N1, N2, N3和N4可沿路徑(AS1,AS2).同理,主干網還可可發出通知:“要到達網絡N5、N6和N7可沿路徑(AS1,AS3)。"
從上面的討論可看出,BGP協議交換路由信息的結點數量級是自治系統個數的量級,這要比這些自治系統中的網絡數少很多。要在許多自治系統之間尋找一條較好的路徑,就是要尋找正確的BGP發言人(或邊界路由器),而在每一個自治系統中BGP發言人(或邊界路由器)的數目是很少的。這樣就使得自治系統之間的路由選擇不致過分復雜。
BGP支持無分類域間路由選擇CIDR,因此BGP的路由表也就應當包括目的網絡前綴、下一跳路由器,以及到達該目的網絡所要經過的自治系統序列。由於使用了路徑向量的信息,就可以很容易地避免產生兜圈子的路由。如果一個BGP發言人收到了其他BGP發言人發來的路徑通知,它就要檢査一下本自治系統是否在此通知的路徑中。如果在這條路徑中,就不能采用這條路徑(因為會兜圈子)。在BGP剛剛運行時,BGP的鄰站是交換整個的BGP路由表。但以后只需要在發生變化時更新有變化的部分。這樣做對節省網絡帶寬和減少路由器的處理開銷方面都有好處。
在RFC4271中規定了 BGP1的四種報文:
- OPEN (打開)報文,用來與相鄰的另一個BGP發言人建立關系,使通信初始化。
- UPDATE (更新)報文,用來通告某一路由的信息,以及列出要撤銷的多條路由。
- KEEPALIVE (保活)報文,用來周期性地證實鄰站的連通性。
- NOTIFICATION (通知)報文,用來發送檢測到的差錯。
若兩個鄰站屬於兩個不同AS,而其中一個鄰站打算和另一個鄰站定期地交換路由信息,這就應當有一個商談的過程(因為很可能對方路由器的負荷已很重因而不願意再加重負擔)。因此,一開始向鄰站進行商談時就必須發送OPEN報文。如果鄰站接受這種鄰站關系,就用KEEPALIVE報文響應。這樣,兩個BGP發言人的鄰站關系就建立了。
一旦鄰站關系建立了,就要繼續維持這種關系。雙方中的每一方都需要確信對方是存在的,且一直在保持這種鄰站關系。為此,這兩個BGP發言人彼此要周期性地交換KEEPALIVE報文(一般每隔30秒)。
KEEPALIVE報文只有19字節長(只用BGP報文的通用首部),因此不會造成網絡上太大的開銷。
UPDATE報文是BGP協議的核心內容。BGP發言人可以用UPDATE報文撤銷它以前曾經通知過的路由,也可以宣布增加新的路由。撤銷路由可以一次撤銷許多條,但增加新路由時,每個更新報文只能增加一條。
BGP可以很容易地解決距離向量路由選擇算法中的“壞消息傳播得慢”這一問題。當某個路由器或鏈路出故障時,由於BGP發言人可以從不止一個鄰站獲得路由信息,因此很容易選擇出新的路由。距離向量算法往往不能給出正確的選擇,是因為這些算法不能指出哪些鄰站到目的站的路由是獨立的。
圖4-41給出了 BGP報文的格式。四種類型的BGP報文具有同樣的通用首部,其長度為19字節。通用首部分為三個字段。標記(marker)字段為16字節長,用來鑒別收到的BGP報文(這是假定將來有人會發明出合理的鑒別方案)。當不使用鑒別時,標記字段要置為全1。長度字段指出包括通用首部在內的整個BGP報文以字節為單位的長度,最小值是19,最大值是4096。類型字段的值為1到4,分別對應於上述四種BGP報文中的一種。
OPEN報文共有6個字段,即版本(1字節,現在的值是4)、本自治系統號(2字節,使用全球唯一的16位自治系統號,由ICANN地區登記機構分配)、保持時間(2字節,以秒計算的保持為鄰站關系的時間)、BGP標識符(4字節,通常就是該路由器的IP地址)、可選參數長度(1字節)和可選參數。
UPDATE報文共有5個字段,即不可行路由長度(2字節,指明下一個字段的長度)、撤銷的路由(列出所有要撤銷的路由)、路徑屬性總長度(2字節,指明下一個字段的長度)、路徑屬性(定義在這個報文中增加的路徑的屬性)和網絡層可達性信息NLRI(Network Layer Reachability Information)。最后這個字段定義發出此報文的網絡,包括網絡前綴的位數、IP地址前綴。
KEEPALIVE報文只有BGP的19字節長的通用首部。
NOTIFICATION報文有3個字段,即差錯代碼(1字節)、差錯子代碼(1字節)和差錯數據(給出有關差錯的診斷信息)。
路由器的構成
路由器的結構
路由器是一種具有多個輸入端口和多個輸出端口的專用計算機,其任務是轉發分組。
從路由器某個輸入端口收到的分組,按照分組要去的目的地(即目的網絡),把該分組從路由器的某個合適的輸出端口轉發給下一跳路由器。下一跳路由器也按照這種方法處理分組,直到該分組到達終點為止。
路由器的轉發分組正是網絡層的主要工作。
圖4-42給出了一種典型的路由器的構成框圖。
從圖4-42可以看出,整個的路由器結構可划分為兩大部分:路由選擇部分和分組轉發部分。
路由選擇部分也叫做控制部分,其核心構件是路由選擇處理機。路由選擇處理機的任務是根據所選定的路由選擇協議構造出路由表,同時經常或定期地和相鄰路由器交換路由信息而不斷地更新和維護路由表。
分組轉發部分是本節所要討論的問題,它由三部分組成:交換結構、一組輸入端口和一組輸出端口(請注意:這里的端口就是硬件接口)。下面分別討論每一部分的組成。
交換結構(switching fabric)又稱為交換組織,它的作用就是根據轉發表(fbrwarding table)對分組進行處理,將某個輸入端口進入的分組從一個合適的輸出端口轉發出去。
交換結構本身就是一種網絡,但這種網絡完全包含在路由器之中,因此交換結構可看成是“在路由器中的網絡"。
請注意“轉發”和“路由選擇”是有區別的。
在互聯網中,“轉發”就是路由器根據轉發表把收到的IP數據報從路由器合適的端口轉發出去。“轉發”僅僅涉及到一個路由器。但“路由選擇"則涉及到很多路由器,路由表則是許多路由器協同工作的結果。這些路由器按照復雜的路由算法,得出整個網絡的拓撲變化情況,因而能夠動態地改變所選擇的路由,並由此構造出整個的路由表。
路由表一般僅包含從目的網絡到下一跳(用IP地址表示)的映射,而轉發表是從路由表得出的。轉發表必須包含完成轉發功能所必需的信息。
在討論路選擇的原理時,往往不去區分轉發表和路由表的區別,而可以籠統地都使用路由表這一名詞。
在圖4-42中,路由器的輸入和輸出端口里面都各有三個方框,用方框中的1, 2和3分別代表物理層、數據鏈路層和網絡層的處理模塊。
物理層進行比特的接收。
數據鏈路層則按照鏈路層協議接收傳送分組的幀。在把幀的首部和尾部剝去后,分組就被送入網絡層的處理模塊。若接收到的分組是路由器之間交換路由信息的分組(如RIP或OSPF分組等),則把這種分組送交路由器的路由選擇部分中的路由選擇處理機。若接收到的是數據分組,則按照分組首部中的目的地址查找轉發表,根據得出的結果,分組就經過交換結構到達合適的輸出端口。
一個路由器的輸入端口和輸出端口就做在路由器的線路接口卡上。
輸入端口中的查找和轉發功能在路由器的交換功能中是最重要的。為了使交換功能分散化,往往把復制的轉發表放在每一個輸入端口中(如圖4V2中的虛線箭頭所示)。路由選擇處理機負責對各轉發表的副本進行更新。這些副本常稱為“影子副本”(shadow copy)。分散化交換可以避免在路由器中的某一點上出現瓶頸。
以上介紹的查找轉發表和轉發分組的概念雖然並不復雜,但在具體的實現中還是會遇到不少困難。
問題就在於路由器必須以很高的速率轉發分組。最理想的情況是輸入端口的處理速率能夠跟上線路把分組傳送到路由器的速率。這種速率稱為線速(line speed或wirespeed)。
可以粗略地估算一下。設線路是OC-48鏈路,即2.5 Gbit/s。若分組長度為256字節,那么線速就應當達到每秒能夠處理100萬以上的分組。現在常用Mpps (百萬分組每秒)為單位來說明一個路由器對收到的分組的處理速率有多高。
當一個分組正在査找轉發表時,后面又緊跟着從這個輸入端口收到另一個分組。這個后到的分組就必須在隊列中排隊等待,因而產生了一定的時延。圖4-43給出了在輸入端口的隊列中排隊的分組的示意圖。
我們再來觀察在輸出端口上的情況(圖4-44)。輸出端口從交換結構接收分組,然后把它們發送到路由器外面的線路上。在網絡層的處理模塊中設有一個緩沖區,實際上它就是一個隊列。當交換結構傳送過來的分組的速率超過輸出鏈路的發送速率時,來不及發送的分組就必須暫時存放在這個隊列中。
數據鏈路層處理模塊把分組加上鏈路層的首部和尾部,交給物理層后發送到外部線路。
從以上的討論可以看出,分組在路由器的輸入端口和輸出端口都可能會在隊列中排隊等候處理。若分組處理的速率趕不上分組進入隊列的速率,則隊列的存儲空間最終必定減少到零,這就使后面再進入隊列的分組由於沒有存儲空間而只能被丟棄。以前我們提到過的分組丟失就是發生在路由器中的輸入或輸出隊列產生溢出的時候。當然,設備或線路出故障也可能使分組丟失。
交換結構
交換結構是路由器的關鍵構件。正是這個交換結構把分組從一個輸入端口轉移到某個合適的輸出端口。實現這樣的交換有多種方法。
最早使用的路由器就是利用普通的計算機,用計算機的CPU作為路由器的路由選擇處理機。路由器的輸入和輸岀端口的功能和傳統的操作系統中的I/O設備一樣。當路由器的某個輸入端口收到一個分組時,就用中斷方式通知路由選擇處理機。然后分組就從輸入端口復制到存儲器中。路由器處理機從分組首部提取目的地址,査找路由表,再將分組復制到合適的輸出端口的緩存中。
若存儲器的帶寬(讀或寫)為每秒M個分組,那么路由器的交換速率(即分組從輸入端口傳送到輸出端口的速率)一定小於"2。這是因為存儲器對分組的讀和寫需要花費的時間是同一個數量級。
許多現代的路由器也通過存儲器進行交換,圖4-45(a)的示意圖表示分組通過存儲器進行交換。與早期的路由器的區別就是,目的地址的査找和分組在存儲器中的緩存都是在輸入端口中進行的。
圖4-45(b)是通過總線進行交換的示意圖。釆用這種方式時,數據報從輸入端口通過共享的總線直接傳送到合適的輸出端口,而不需要路由選擇處理機的干預。但是,由於總線是共享的,因此在同一時間只能有一個分組在總線上傳送。當分組到達輸入端口時若發現總線忙(因為總線正在傳送另一個分組),則被阻塞而不能通過交換結構,並在輸入端口排隊等待。因為每一個要轉發的分組都要通過這一條總線,因此路由器的轉發帶寬就受總線速率的限制。現代的技術已經可以將總線的帶寬提高到每秒吉比特的速率,因此許多的路由器產品都采用這種通過總線的交換方式。
圖4-45(c)畫的是通過縱橫交換結構(crossbar switch fabric)進行交換。這種交換機構常稱為互連網絡(interconnection network),它有2N條總線,可以使N個輸入端口和N個輸出端口相連接,這取決於相應的交叉結點是使水平總線和垂直總線接通還是斷開。當輸入端口收到一個分組時,就將它發送到與該輸入端口相連的水平總線上。若通向所要轉發的輸出端口的垂直總線是空閑的,則在這個結點將垂直總線與水平總線接通,然后將該分組轉發到這個輸出端口。但若該垂直總線已被占用(有另一個分組正在轉發到同一個輸出端口),則后到達的分組就被阻塞,必須在輸入端口排隊。
IPv6
IP是互聯網的核心協議。現在使用的IP (即IPv4)是在20世紀70年代末期設計的。互聯網經過幾十年的飛速發展,到2011年2月,IPv4的地址己經耗盡,ISP已經不能再申請到新的IP地址塊了。我國在2014年至2015年也逐步停止了向新用戶和應用分配IPv4地址,同時全面開始商用部署IPv6。
解決IP地址耗盡的根本措施就是采用具有更大地址空間的新版本的IP,即IPv6。
IPv6的基本首部
IPv6仍支持無連接的傳送,但將協議數據單元PDU稱為分組,而不是IPv4的數據報。為方便起見,本書仍采用數據報這一名詞。
IPv6所引進的主要變化如下:
- 更大的地址空間。IPv6把地址從IPv4的32位增大到4倍,即增大到128位,使地址空間增大了 2^96倍。這樣大的地址空間在可預見的將來是不會用完的。
- 擴展的地址層次結構。IPv6由於地址空間很大,因此可以划分為更多的層次。
- 靈活的首部格式。IPv6數據報的首部和IPv4的並不兼容。IPv6定義了許多可選的擴展首部,不僅可提供比IPv4更多的功能,而且還可提高路由器的處理效率,這是因為路由器對擴展首部不進行處理(除逐跳擴展首部外)。
- 改進的選項。IPv6允許數據報包含有選項的控制信息,因而可以包含一些新的選項。但IPv6的首部長度是固定的,其選項放在有效載荷中。我們知道,IPv4所規定的選項是固定不變的,其選項放在首部的可變部分。
- 允許協議繼續擴充。這一點很重要,因為技術總是在不斷地發展(如網絡硬件的更新)而新的應用也還會出現。但我們知道,IPv4的功能是固定不變的。
- 支持即插即用(即自動配置)。因此IPv6不需要使用DHCP。
- 支持資源的預分配。IPv6支持實時視像等要求保證一定的帶寬和時延的應用。
- IPv6首部改為8字節對齊(即首部長度必須是8字節的整數倍)。原來的IPv4首部是4字節對齊。
IPv6數據報由兩大部分組成,即基本首部(base header)和后面的有效載荷(payload)。有效載荷也稱為凈負荷。有效載荷允許有零個或多個擴展首部(extension header),再后面是數據部分(圖4-46)。但請注意,所有的擴展首部並不屬於IPv6數據報的首部。
與IPv4相比,IPv6對首部中的某些字段進行了如下的更改:
- 取消了首部長度字段,因為它的首部長度是固定的(40字節)。
- 取消了服務類型字段,因為優先級和流標號字段實現了服務類型字段的功能。
- 取消了總長度字段,改用有效載荷長度字段。
- 取消了標識、標志和片偏移字段,因為這些功能已包含在分片擴展首部中。
- 把TTL字段改稱為跳數限制字段,但作用是一樣的(名稱與作用更加一致)。
- 取消了協議字段,改用下一個首部字段。
- 取消了檢驗和字段,這樣就加快了路由器處理數據報的速度。我們知道,在數據鏈路層對檢測出有差錯的幀就丟棄。在運輸層,當使用UDP時,若檢測出有差錯的用戶數據報就丟棄。當使用TCP時,對檢測出有差錯的報文段就重傳,直到正確傳送到目的進程為止。因此在網絡層的差錯檢測可以精簡掉。
- 取消了選項字段,而用擴展首部來實現選項功能。
由於把首部中不必要的功能取消了,使得IPv6首部的字段數減少到只有8個(雖然首部長度增大了一倍)。
下面解釋IPv6基本首部中各字段的作用(參見圖4-47)。
-
版本(version) 占4位。它指明了協議的版本,對IPv6該字段是6。
-
通信量類(traffic class) 占8位。這是為了區分不同的IPv6數據報的類別或優先級。
-
流標號(flow label) 占20位。IPv6的一個新的機制是支持資源預分配,並且允許路由器把每一個數據報與一個給定的資源分配相聯系。IPv6提出流(flow)的抽象概念。所謂“流”就是互聯網絡上從特定源點到特定終點(單播或多播)的一系列數據報(如實時音頻或視頻傳輸),而在這個“流"所經過的路徑上的路由器都保證指明的服務質所有屬於同一個流的數據報都具有同樣的流標號。因此,流標號對實時音頻/視頻數據的傳送特別有用。對於傳統的電子郵件或非實時數據,流標號則沒有用處,把它置為0即可。
-
有效載荷長度(payload length) 占16位。它指明IPv6數據報除基本首部以外的字節數(所有擴展首部都算在有效載荷之內)。這個字段的最大值是64 KB (65535字節)。
-
下一個首部(next header) 占8位。它相當於IPv4的協議字段或可選字段。
- 當IPv6數據報沒有擴展首部時,下一個首部字段的作用和IPv4的協議字段一樣,
它的值指出了基本首部后面的數據應交付IP層上面的哪一個高層協議(例如:6
或17分別表示應交付運輸層TCP或UDP). - 當出現擴展首部時,下一個首部字段的值就標識后面第一個擴展首部的類型。
- 當IPv6數據報沒有擴展首部時,下一個首部字段的作用和IPv4的協議字段一樣,
-
跳數限制(hop limit) 占8位。用來防止數據報在網絡中無限期地存在。源點在每個數據報發出時即設定某個跳數限制(最大為255跳)。每個路由器在轉發數據報時,要先把跳數限制字段中的值減1。當跳數限制的值為零時,就要把這個數據報丟棄。
-
源地址 占128位。是數據報的發送端的IP地址。
-
目的地址 占128位。是數據報的接收端的IP地址。
下面我們介紹一下IPv6的擴展首部。
大家知道,IPv4的數據報如果在其首部中使用了選項,那么沿着數據報傳送的路徑上的每一個路由器都必須對這些選項一一進行檢查,這就降低了路由器處理數據報的速度。然而實際上很多的選項在途中的路由器上是不需要檢查的(因為不需要使用這些選項的信息)。
IPv6把原來IPv4首部中選項的功能都放在擴展首部中,並把擴展首部留給路徑兩端的源點和終點的主機來處理,而數據報途中經過的路由器都不處理這些擴展首部(只有一個首部例外,即逐跳選項擴展首部),這樣就大大提高了路由器的處理效率。
在RFC 2460中定義了以下六種擴展首部:(1)逐跳選項;(2)路由選擇;(3)分片; (4)鑒別;(5)封裝安全有效載荷;(6)目的站選項。
每一個擴展首部都由若干個字段組成,它們的長度也各不同。但所有擴展首部的第一個字段都是8位的“下一個首部”字段。此字段的值指出了在該擴展首部后面的字段是什么。當使用多個擴展首部時,應按以上的先后順序出現。高層首部總是放在最后面。
IPv6地址
一般來講,一個IPv6數據報的目的地址可以是以下三種基本類型地址之一:
- 單播(unicast) 單播就是傳統的點對點通信。
- 多播(multicast) 多播是一點對多點的通信,數據報發送到一組計算機中的每一個。IPv6沒有釆用廣播的術語,而是將廣播看作多播的一個特例。
- 任播(anycast) 這是IPv6增加的一種類型。任播的終點是一組計算機,但數據報只交付其中的一個,通常是距離最近的一個。
IPv6把實現IPv6的主機和路由器均稱為結點。由於一個結點可能會使用多條鏈路與其他的一些結點相連,因此一個結點可能有多個與鏈路相連的接口。這樣,IPv6給結點的每一個接口指派一個IP地址。一個結點可以有多個單播地址,而其中任何一個地址都可以當作到達該結點的目的地址。
在IPv6中,每個地址占128位,地址空間大於3.4x1038。如果整個地球表面(包括陸地和水面)都覆蓋着計算機,那么IPv6允許每平方米擁有7x1023個IP地址。如果地址分配速率是每微秒分配100萬個地址,則需要1019年的時間才能將所有可能的地址分配完畢。可見在想象到的將來,IPv6的地址空間是不可能用完的。
巨大的地址范圍還必須使維護互聯網的人易於閱讀和操縱這些地址。IPv4所用的點分十進制記法現在也不夠方便了。例如,一個用點分十進制記法的128位的地址為:
104.230.140.100.255.255.255.255.0.0.17.128.150.10.255.255
為了使地址再稍簡潔些,IPv6使用冒號+六進制記法(colon hexadecimal notation,簡寫為colonhex),它把每個16位的值用十六進制值表示,各值之間用冒號分隔。例如,如果前面所給的點分十進制數記法的值改為冒號十六進制記法,就變成了 :
68E6:8C64:FFFF:FFFF:0:1180:960A:FFFF
在十六進制記法中,允許把數字前面的0省略。上面就把0000中的前三個0省略了。冒號十六進制記法還包含兩個技術使它尤其有用。首先,冒號十六進制記法可以允許零壓縮(zero compression),即一連串連續的零可以為一對冒號所取代,例如:
FF05:0:0:0:0:0:0:B3
可壓縮為:
FF05::B3
為了保證零壓縮有一個不含混的解釋,規定在任一地址中只能使用一次零壓縮。該技術對已建議的分配策略特別有用,因為會有許多地址包含較長連續的零串。
其次,冒號十六進制記法可結合使用點分十進制記法的后綴。我們下面會看到這種結合在IPv4向IPv6的轉換階段特別有用。
例如,下面的串是一個合法的冒號十六進制記法:
0:0:0:0:0:0:128.10.2.1
請注意,在這種記法中,雖然為冒號所分隔的每個值是兩個字節(16位)的量,但每個點分十進制部分的值則指明一個字節(8位)的值。再使用零壓縮即可得出:
::128.10.2.1
IPv6的地址分類見表4-10所示。
對表4-10所列舉的幾種地址簡單解釋如下。
-
未指明地址 這是16字節的全0地址,可縮寫為兩個冒號“::”。這個地址不能用作目的地址,而只能為某台主機當作源地址使用,條件是這台主機還沒有配置到一個標准的IP地址。這類地址僅此一個。
-
環回地址 IPv6的環回地址是0:0:0:0:0:0:0:1,可縮寫為 ::1。它的作用和IPv4的環回地址一樣。這類地址也是僅此一個。
-
多播地址 功能和IPv4的一樣。這類地址占IPv6地址總數的1/256。
-
本地鏈路單播地址(Link-Local Unicast Address) 有些單位的網絡使用TCP/IP協議,但並沒有連接到互聯網上。連接在這樣的網絡上的主機都可以使用這種本地地址進行通信,但不能和互聯網上的其他主機通信。這類地址占IPv6地址總數的1/1024。
-
全球單播地址 IPv6的這一類單播地址是使用得最多的一類。曾提出過多種方案來進一步划分這128位的單播地址。根據2006年發布的草案標准RFC 4291的建議,IPv6單播地址的划分方法非常靈活,可以如圖4-48所示的任何一種。
這就是說,可把整個的128比特都作為一個結點的地址。
也可用n比特作為子網前綴,用剩下的(128-n)比特作為接口標識符(相當於IPv4的主機號)。
當然也可以划分為三級,用“比特作為全球路由選擇前綴,用灑比特作為子網前綴,而用剩下的(128-n-m)比特作為接口標識符。
從IPv4向IPv6過渡
由於現在整個互聯網的規模太大,因此,“規定一個日期,從這一天起所有的路由器一律都改用IPv6”,顯然是不可行的。這樣,向IPv6過渡只能采用逐步演進的辦法,同時,還必須使新安裝的IPv6系統能夠向后兼容。這就是說,IPv6系統必須能夠接收和轉發IPv4分組,並且能夠為IPv4分組選擇路由。
雙協議棧
雙協議棧(dual stack)是指在完全過渡到IPv6之前,使一部分主機(或路由器)裝有雙協議棧:一個IPv4和一個IPv6。因此雙協議棧主機(或路由器)既能夠和IPv6的系統通信,又能夠和IPv4的系統通信。雙協議棧的主機(或路由器)記為IPv6/IPv4,表明它同時具有兩種IP地址:一個IPv6地址和一個IPv4地址。
雙協議棧主機在和IPv6主機通信時釆用IPv6地址,而和IPv4主機通信時則釆用IPv4地址。但雙協議棧主機怎樣知道目的主機是釆用哪一種地址呢?它是使用域名系統DNS來査詢的。若DNS返回的是IPv4地址,雙協議棧的源主機就使用IPv4地址。但當DNS返回的是IPv6地址,源主機就使用IPv6地址。
圖4-49所示的情況是源主機A和目的主機F都使用IPv6,所以A向F發送IPv6數據報,路徑是A->B->C->D->E->F。中間B到E這段路徑是IPv4網絡,路由器B不能向C轉發IPv6數據報,因為C只使用IPv4協議。B是IPv6/IPv4路由器,它把IPv6數據報首部轉換為IPv4數據報首部后發送給C。C再轉發到D。當D轉發到IPv4網絡的出口路由器E時(E也是IPv6/IPv4路由器),再恢復成原來的IPv6數據報。
需要注意的是:IPv6首部中的某些字段卻無法恢復。例如,原來IPv6首部中的流標號X在最后恢復出的IPv6數據報中只能變為空缺。這種信息的損失是使用首部轉換方法所不可避免的。
隧道技術
向IPv6過渡的另一種方法是隧道技術(tunneling)。
圖4-50給出了隧道技術的工作原理。這種方法的要點就是在IPv6數據報要進入IPv4網絡時,把IPv6數據報封裝成為IPv4數據報。現在整個的IPv6數據報變成了 IPv4數據報的數據部分。這樣的IPv4數據報從路由器B經過路由器C和D,傳送到E,而原來的IPv6數據報就好像在IPv4網絡的隧道中傳輸,什么都沒有變化。當IPv4數據報離開IPv4網絡中的隧道時,再把數據部分(即原來的IPv6數據報)交給主機的IPv6協議棧。
圖中的一條粗線表示在IPv4網絡中好像有一個從B到E的“IPv6隧道”,路由器B是隧道的入口而E是出口。請注意,在隧道中傳送的數據報的源地址是B而目的地址是E。
要使雙協議棧的主機知道IPv4數據報里面封裝的數據是一個IPv6數據報,就必須把IPv4首部的協議字段的值設置為41(41表示數據報的數據部分是IPv6數據報)。
ICMPv6
和IPv4 一樣,IPv6也不保證數據報的可靠交付,因為互聯網中的路由器可能會丟棄數據報。因此IPv6也需要使用ICMP來反饋一些差錯信息。
新的版本稱為ICMPv6,它比ICMPv4要復雜得多。地址解析協議ARP和網際組管理協議IGMP的功能都己被合並到ICMPv6中(圖 4-51 )。
ICMPv6是面向報文的協議,它利用報文來報告差錯,獲取信息,探測鄰站或管理多播通信。ICMPv6還增加了幾個定義報文功能及含義的其他協議。
在對ICMPv6報文進行歸類時,不同的文獻和RFC文檔使用了不同的策略,有的把其中的一些報文定義為ICMPv6報文,而把另一些報文定義為鄰站發現ND (Neighbor-Discovery)報文或多播聽眾交付MLD(Multicast Listener Delivery)報文。
其實所有這些報文都應當是ICMPv6報文,只是功能和作用不同而已。因此我們把這些報文都列入ICMPv6的不同類別。使用這種分類方法的原因是所有這些報文都具有相同的格式,並且所有報文類型都由ICMPv6協議處理。
其實,像ND和MLD這樣的協議都是運行在ICMPv6協議之下的。基於這樣的考慮,可把ICMPv6報文分類如圖4-52所示。請注意,鄰站發現報文和組成員關系報文分別是在ND協議和MLD協議的控制下進行發送和接收的。
虛擬專用網VPN和網絡地址轉換NAT
虛擬專用網VPN
由於IP地址的緊缺,一個機構能夠申請到的ip地址數往往遠小於本機構所擁有的主機數。考慮到互聯網並不很安全,一個機構內也並不需要把所有的主機接入到外部的互聯網。實際上,在許多情況下,很多主機主要還是和本機構內的其他主機進行通信(例如,在大型商場或賓館中,有很多用於營業和管理的計算機。顯然這些計算機並不都需要和互聯網相連)。
假定在一個機構內部的計算機通信也是釆用TCP/IP協議,那么從原則上講,對於這些僅在機構內部使用的計算機就可以由本機構自行分配其IP地址。這就是說,讓這些計算機使用僅在本機構有效的IP地址(這種地址稱為本地地址),而不需要向互聯網的管理機構申請全球唯一的IP地址(這種地址稱為全球地址)。這樣就可以大大節約寶貴的全球IP地址資源。
但是,如果任意選擇一些IP地址作為本機構內部使用的本地地址,那么在某種情況下可能會引起一些麻煩。例如,有時機構內部的某台主機需要和互聯網連接,那么這種僅在內部使用的本地地址就有可能和互聯網中某個IP地址重合,這樣就會出現地址的二義性問題。
為了解決這一問題,RFC 1918指明了一些專用地址(private address)。這些地址只能用於一個機構的內部通信,而不能用於和互聯網上的主機通信。換言之,專用地址只能用做本地地址而不能用作全球地址。在互聯網中的所有路由器,對目的地址是專用地址的數據報一律不進行轉發。2013年4月,RFC 6890全面地給出了所有特殊用途的IPv4地址,但三個專用地址塊的指派並無變化,即
- 10.0.0.0 到 10.255.255.255 (或記為 10.0.0.0/8,它又稱為 24 位塊)
- 172.16.0.0 到 172.31.255.255 (或記為 172.16.0.0/12,它又稱為 20 位塊)
- 192.168.0.0 到 192.168.255.255 (或記為 192.168.0.0/16,它又稱為 16 位塊)
上面的三個地址塊分別相當於一個A類網絡、16個連續的B類網絡和256個連續的C類網絡。A類地址本來早己用完了,而上面的地址10.0.0.0本來是分配給ARPANET的。由於ARPANET己經關閉停止運行了,因此這個地址就用作專用地址。
采用這樣的專用IP地址的互連網絡稱為專用互聯網或本地互聯網,或更簡單些,就叫做專用網。顯然,全世界可能有很多的專用互連網絡具有相同的專用IP地址,但這並不會引起麻煩,因為這些專用地址僅在本機構內部使用。專用IP地址也叫做可重用地址(reusable address)。
有時一個很大的機構的許多部門分布的范圍很廣(例如,在世界各地),這些部門經常要互相交換信息。這可以有兩種方法。
- 租用電信公司的通信線路為本機構專用。這種方法雖然簡單方便,但線路的租金太高,一般難於承受。
- 利用公用的互聯網作為本機構各專用網之間的通信載體,這樣的專用網又稱為虛擬專用網VPN (Virtual Private Network)。
之所以稱為“專用網”是因為這種網絡是為本機構的主機用於機構內部的通信,而不是用於和網絡外非本機構的主機通信。如果專用網不同網點之間的通信必須經過公用的互聯網,但又有保密的要求,那么所有通過互聯網傳送的數據都必須加密。
“虛擬”表示“好像是”,但實際上並不是,因為現在並沒有真正使用通信專線,而VPN只是在效果上和真正的專用網一樣。一個機構要構建自己的VPN就必須為它的每一個場所購買專門的硬件和軟件,並進行配置,使每一個場所的VPN系統都知道其他場所的地址。
圖4-59以兩個場所為例說明如何使用IP隧道技術實現虛擬專用網。假定某個機構在兩個相隔較遠的場所建立了專用網A和B,其網絡地址分別為專用地址10.1.0.0和10.2.0.0。現在這兩個場所需要通過公用的互聯網構成一個VPN。
顯然,每一個場所至少要有一個路由器具有合法的全球IP地址,如圖4-59(a)中的路由器R1和R2。這兩個路由器和互聯網的接口地址必須是合法的全球IP地址。路由器R1和R2在專用網內部網絡的接口地址則是專用網的本地地址。
在每一個場所A或B內部的通信量都不經過互聯網。但如果場所A的主機X要和另一個場所B的主機Y通信,那么就必須經過路由器R1和R2。
主機X向主機Y發送的IP數據報的源地址是10.1.0.1,而目的地址是10.2.0.3。這個數據報先作為本機構的內部數據報從X發送到與互聯網連接的路由器R1。路由器R1收到內部數據報后,發現其目的網絡必須通過互聯網才能到達,就把整個的內部數據報進行加密(這樣就保證了內部數據報的安全),然后重新加上數據報的首部,封裝成為在互聯網上發送的外部數據報,其源地址是路由器R1的全球地址125.1.2.3,而目的地址是路由器R2的全球地址194.4.5.6。路由器R?收到數據報后將其數據部分取出進行解密,恢復出原來的內部數據報(目的地址是10.2.0.3),交付主機Y。
可見,雖然X向Y發送的數據報是通過了公用的互聯網,但在效果上就好像是在本部門的專用網上傳送一樣。如果主機Y要向X發送數據報,那么所進行的步驟也是類似的。請注意,數據報從R1傳送到R2可能要經過互聯網中的很多個網絡和路由器。但從邏輯上看,在R1到R2之間好像是一條直通的點對點鏈路,圖4-59(a)中的“隧道"就是這個意思。
如圖4-59(b)所示的、由場所A和B的內部網絡所構成的虛擬專用網VPN又稱為內聯網(intranet或intranet VPN,即內聯網VPN),表示場所A和B都屬於同一個機構。
有時一個機構的VPN需要有某些外部機構(通常就是合作伙伴)參加進來。這樣的VPN就稱為外聯網(extranet或extranet VPN,即外聯網VPN)。
請注意,內聯網和外聯網都采用了互聯網技術,即都是基於TCP/IP協議的。
還有一種類型的VPN,就是遠程接入VPN (remote access VPN)。我們知道,有的公司可能並沒有分布在不同場所的部門,但卻有很多流動員工在外地工作。公司需要和他們保持聯系,有時還可能一起開電話會議或視頻會議。遠程接入VPN可以滿足這種需求。在外地工作的員工通過撥號接入互聯網,而駐留在員工個人電腦中的VPN軟件可以在員工的個人電腦和公司的主機之間建立VPN隧道,因而外地員工與公司通信的內容也是保密的,員工們感到好像就是使用公司內部的本地網絡。
網絡轉化地址NAT
在專用網內部的一些主機本來己經分配到了本地IP地址(即僅在本專用網內使用的專用地址),但現在又想和互聯網上的主機通信(並不需要加密),那么應當釆取什么措施呢?
使用得最多的方法是釆用網絡地址轉換。網絡地址轉換NAT (Network Address Translation)方法是在1994年提出的。這種方法需要在專用網連接到互聯網的路由器上安裝NAT軟件。裝有NAT軟件的路由器叫做NAT路由器,它至少有一個有效的外部全球IP地址。這樣,所有使用本地地址的主機在和外界通信時,都要在NAT路由器上將其本地地址轉換成全球IP地址,才能和互聯網連接。
圖4-60給出了NAT路由器的工作原理。在圖中,專用網192.168.0.0內所有主機的IP地址都是本地IP地址192.168.x.x。NAT路由器至少要有一個全球IP地址,才能和互聯網相連。圖4-60表示岀NAT路由器有一個全球IP地址172.38.1.5 (當然,NAT路由器可以有多個全球IP地址)。
NAT路由器收到從專用網內部的主機A發往互聯網上主機B的IP數據報:源IP地址是192.168.0.3,而目的IP地址是213.18.2.4。 NAT路由器把IP數據報的源IP地址192.168.0.3,轉換為新的源IP地址(即NAT路由器的全球IP地址)172.38.1.5,然后轉發出去。因此,主機B收到這個IP數據報時,以為A的IP地址是172.38.1.5。當B給A發送應答時,IP數據報的目的IP地址是NAT路由器的IP地址172.38.1.5。 B並不知道A的專用地址192.168.0.3。實際上,即使知道了,也不能使用,因為互聯網上的路由器都不轉發目的地址是專用網本地IP地址的IP數據報。當NAT路由器收到互聯網上的主機B發來的IP數據報時,還要進行一次IP地址的轉換。通過NAT地址轉換表,就可把IP數據報上的舊的目的IP地址172.38.1.5,轉換為新的目的IP地址192.168.0.3 (主機A真正的本地IP地址)。表4-11給出了 NAT地址轉換表的舉例。表中的前兩行數據對應於圖4-60中所舉的例子。第一列“方向”中的“出”表示離開專用網,而“入”表示進入專用網。表中后兩行數據(圖4&中沒有畫出對應的IP數據報)表示專用網內的另一主機192.168.0.7向互聯網發送了 IP數據報,而NAT路由器還有另外一個全球IP地址172.38.1.6。
可以看出,在內部主機與外部主機通信時,在NAT路由器上發生了兩次地址轉換:
離開專用網時:替換源地址,將內部地址替換為全球地址;
進入專用網時:替換目的地址,將全球地址替換為內部地址;
當 NAT 路由器具有 n 個全球 IP 地址時,專用網內最多可以同時有 n 台主機接入到互聯網。這樣就可以使專用網內較多數量的主機,輪流使用 NAT 路由器有限數量的全球 IP 地址。
通過 NAT 路由器的通信必須由專用網內的主機發起。專用網內部的主機不能充當服務器用,因為互聯網上的客戶無法請求專用網內的服務器提供服務。
為了更加有效地利用 NAT 路由器上的全球IP地址,現在常用的 NAT 轉換表把運輸層的端口號也利用上。這樣,就可以使多個擁有本地地址的主機,共用一個 NAT 路由器上的全球 IP 地址,因而可以同時和互聯網上的不同主機進行通信。
使用端口號的 NAT 叫做網絡地址與端口號轉換NAPT (Network Address and Port Translation),而不使用端口號的 NAT 就叫做傳統的 NAT (traditional NAT)。
NAPT把專用網內不同的源 IP 地址,都轉換為同樣的全球 IP 地址。但對源主機所采用的 TCP 端口號(不管相同或不同),則轉換為不同的新的端口號。因此,當 NAPT 路由器收到從互聯網發來的應答時,就可以從 IP 數據報的數據部分找出運輸層的端口號,然后根據不同的目的端口號,從 NAPT 轉換表中找到正確的目的主機。