網(wǎng)絡(luò)互連討論網(wǎng)絡(luò)互連問題,也就是討論多個網(wǎng)絡(luò)的各種問題?;ヂ?lián)網(wǎng)的核心內(nèi)容是網(wǎng)際協(xié)議IP,這是整個計算機網(wǎng)絡(luò)的一個重要內(nèi)容。只有較深入地掌握了IP的主要內(nèi)容,才能理解因特網(wǎng)是怎樣工作的。我們還要重點討論因特網(wǎng)的路由選擇協(xié)議,以及介紹因特網(wǎng)控制報文協(xié)議ICMP和因特網(wǎng)組管理協(xié)議IGMP。最后簡要地討論下一代的網(wǎng)際協(xié)議IPv6的主要內(nèi)容。 最重要的概念是: (1)IP地址與物理地址的關(guān)系。 (2)傳統(tǒng)的分類IP地址(包括子網(wǎng)掩碼)和無分類域間路由選擇CIDR。 (3)路由選擇協(xié)議的工作原理。 請讀者對上述概念務(wù)必弄清楚。 7.1 網(wǎng)絡(luò)互連概述7.1.1 路由器的作用和組成在現(xiàn)實世界中,單一的網(wǎng)絡(luò)無法滿足各種用戶的多種需求。因此,我們經(jīng)常使用的計算機網(wǎng)絡(luò)往往由許多種不同類型的網(wǎng)絡(luò)互連而成。通常在談到“互連”時,就已暗示這些通過各種網(wǎng)絡(luò)互相連接的計算機不僅僅在物理上是連通的,更重要的是它們能進行通信。那么,這些網(wǎng)絡(luò)是怎樣連接起來的呢?是通過許許多多的路由器。路由器在網(wǎng)絡(luò)互連中起著關(guān)鍵的作用。因此,我們要對路由器有更加深入一些的了解。下面先弄清兩種不同的交付:直接交付和間接交付。 圖7-1直接交付和間接交付 現(xiàn)在,主機A要把數(shù)據(jù)報發(fā)送給連接在另一個網(wǎng)絡(luò)上的主機C。這時主機A應(yīng)把數(shù)據(jù)報發(fā)送給本網(wǎng)絡(luò)上的某個路由器(R1),由路由器R1按照轉(zhuǎn)發(fā)表指出的路由把數(shù)據(jù)報轉(zhuǎn)發(fā)給下一個路由順(R2)。這就叫做間接交付。按照同樣的方法,路由器R2又用間接交付的方法把數(shù)據(jù)報傳送給另一個路由器R3。R3與目的主機C在同一個網(wǎng)絡(luò)上,因此,最后一步就由路由器R3把數(shù)據(jù)報直接交付給目的主機C。 總之,A傳送到B是直接交付,而A傳送到C則要分幾步走:A傳送到R1,再傳送到R2,然后傳送到R3,這些都是間接交付,最后由R3傳送到C才是直接交付。
下面討論路由器的組成。 路由器是一種有多個輸入端口和多個輸出端口的專用計算機,其任務(wù)是轉(zhuǎn)發(fā)組。也就是說,路由器某個輸入端口收到分組后,按照分組要去的目的地(即目的網(wǎng)絡(luò)),把該分組從某個合適的輸出端口轉(zhuǎn)發(fā)給下一跳路由器。下一跳路由器也按照這種方法處理分組,直到該分組到達目的地為止。路由器的轉(zhuǎn)發(fā)分組正是網(wǎng)絡(luò)層的主要工作。路由器框架如圖7-2所示。
圖7-2 典型的路由器結(jié)構(gòu)
整個路由器結(jié)構(gòu)可劃分為兩大部分,即路由選擇部分和分組轉(zhuǎn)發(fā)部分。 路由選擇部分也叫做控制部分,其核心構(gòu)件是路由選擇處理機。路由選擇處理機的任務(wù)是根據(jù)所選定的路由選擇協(xié)議構(gòu)建出路由表,同時經(jīng)常地或定期地和相鄰路由器交換路由信息,從而不斷地更新和維護路由表。關(guān)于怎樣根據(jù)路由選擇協(xié)議構(gòu)建和更新路由表,我們將在后面幾節(jié)詳細討論。 分組轉(zhuǎn)發(fā)部分是本節(jié)所要討論的問題,它由3部分組成,即交換結(jié)構(gòu)、一組輸入端口和一組輸出端口。下面分別討論每一部分的組成。 交換結(jié)構(gòu)又稱為交換組織,它的作用就是根據(jù)轉(zhuǎn)發(fā)表對分組進行處理,將某個輸入端口進入的分組從一個合適的輸出端口轉(zhuǎn)發(fā)出去。交換結(jié)構(gòu)本身就是一種網(wǎng)絡(luò),但這種網(wǎng)絡(luò)完全包含在路由器之中,因此,交換結(jié)構(gòu)可看成是“在路由器中的網(wǎng)絡(luò)”。 在上一章已經(jīng)提到過“轉(zhuǎn)發(fā)”和“路由選擇”的區(qū)別。在互聯(lián)網(wǎng)中,“轉(zhuǎn)發(fā)”就是路由器根據(jù)轉(zhuǎn)發(fā)表將用戶的IP數(shù)據(jù)報從合適的端口轉(zhuǎn)發(fā)出去。但“路由選擇”則是按照復(fù)雜的分布式算法,根據(jù)從各相鄰路由器所得到的關(guān)于整個網(wǎng)絡(luò)的拓撲變化情況,動態(tài)地改變所選擇的路由。路由表是根據(jù)路由器選擇算法得出的。因此,路由表一般僅飽含從目的網(wǎng)絡(luò)到下一跳(以IP地址表示,下一節(jié)就討論什么是IP)的映射。而轉(zhuǎn)發(fā)表是從路由表得出的。轉(zhuǎn)發(fā)表必須包含完成轉(zhuǎn)發(fā)功能所必須的信息。這就是說,在轉(zhuǎn)發(fā)表的每一行必須包含從要到達的目的的網(wǎng)絡(luò)到輸出端口和某些MAC地址信息(如下一跳的以太網(wǎng)地址)的映射。MAC地址需要通過ARP協(xié)議才能得出(這些內(nèi)容將在7、2、3節(jié)介紹)。將轉(zhuǎn)發(fā)表和路由表用不同的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)會帶來一些好處,這是因為在轉(zhuǎn)發(fā)分組時,轉(zhuǎn)發(fā)表的結(jié)構(gòu)應(yīng)當使查找過程最優(yōu)化,但路由表則需要對網(wǎng)絡(luò)拓撲變化的計算最優(yōu)化。路由表總是用軟件實現(xiàn)的,但轉(zhuǎn)發(fā)表甚至可用特殊的硬件來實現(xiàn)。請讀者注意,在討論路由選擇的原理時,往往不去區(qū)分轉(zhuǎn)發(fā)表和路由表的區(qū)別,而是籠統(tǒng)地使用路由表這一名詞。 在路由器的輸入和輸出端口里面有3個方框,方框1、2、3分別代表物理層、數(shù)據(jù)鏈路層和網(wǎng)絡(luò)層的處理模塊。物理層進行比特的接收。數(shù)據(jù)鏈路層則按照鏈路層協(xié)議接收傳送分組的幀。在將幀的首部和尾部剝?nèi)ズ螅纸M就被送入網(wǎng)絡(luò)層的處理模塊。若接收到的分組是路由器之間交換路由信息的分組(如RIP或OSPF分組等),則將這種分組送交路由器的路由選擇部分中的路由選擇處理機。若接收到的是數(shù)據(jù)分組,則按照分組首部中的目的地址查找轉(zhuǎn)發(fā)表,根據(jù)得出的結(jié)果,分組就經(jīng)過交換結(jié)構(gòu)到達合適的輸出端口。一個路由器的輸入端口和輸出端口就做在路由器的線路接口卡上。 輸入端口中的查找和轉(zhuǎn)發(fā)功能在路由器的交換功能中最重要。為了使交換功能分散化,往往將復(fù)制的轉(zhuǎn)發(fā)表放在每一個輸入端口中。路由選擇處理機負責對各轉(zhuǎn)發(fā)表的副本進行更新。 以上介紹的查找轉(zhuǎn)發(fā)表和轉(zhuǎn)發(fā)分組的概念雖然并不復(fù)雜,但在具體的實現(xiàn)中還是會遇到不少困難。問題就在于路由器必須以很高的速率轉(zhuǎn)發(fā)分組。最理想的情況是輸入端口的處理速率能夠跟上線路將分組傳送到路由器的速率。這種速率稱為線速。可以粗略地估算一下。高線路是OC-48鏈路,即2.5Gbit/s。若分組長度為256字節(jié),那么線速就應(yīng)當達到每秒能夠處理100萬以上的分組?,F(xiàn)在常用Mpps(百萬分組每秒)為單位來說明一個路由器對收到的分組的處理速率有多高。在路由器的設(shè)計中,怎樣提高查找轉(zhuǎn)發(fā)表的速率已經(jīng)成為一個十分重要的研究課題。 當一個分組正在查找轉(zhuǎn)發(fā)表時,后面以緊跟著從這個輸入端口收到另一個分組。這個后到的分組就必須在隊列中排隊等待,因而產(chǎn)生了一定的時延。如圖7-3,給出了輸入端口的隊列中排隊分組的示意圖 圖7-3 輸入端口的對線路上收到的分組的處理 我們再來觀察在輸出端口上出現(xiàn)什么情況,如圖7-3所示,輸出端口從交換結(jié)構(gòu)接收分組,然后把它們發(fā)送到路由器外面的線路上。在網(wǎng)絡(luò)層的處理模塊中設(shè)有一個緩存,實際上它就是一個隊列。當交換結(jié)構(gòu)傳送過來的分組的速率超過輸出鏈路的發(fā)送速率時,來不及發(fā)送的分組就必須暫時存放在這個隊列中,數(shù)據(jù)鏈路層處理模塊把分組加上鏈路層的首部和尾部,交給物理層發(fā)送到外部線路。 圖7-3 輸出端口的八交換結(jié)構(gòu)傳送過來的分組發(fā)送到線路上
從以上的討論可以看出,分組在路由器的輸入端口和輸出端口都可能會在隊列中排隊等候處理。若分組處理的速率趕不上分組進入隊列的速率,則隊列的存儲空間最終必定減少到零,這就使后面再進入隊列的分組出于沒有存儲空間而只能被丟棄。以前我們提到分組丟失就是發(fā)生在路由器中的輸入或輸出隊列產(chǎn)生溢出的時候。當然,設(shè)備或線路出故障也可能使分組丟失。 7.1.2 IP虛擬網(wǎng)互連在一起的網(wǎng)絡(luò)要進行通信,會遇到許多問題需要解決,如不同的尋址方案;不同的最大分組長度;不同的網(wǎng)絡(luò)接入機制;不同的超時控制;不同的差錯恢復(fù)方法;不同的狀態(tài)報告方法;不同的路由選擇技術(shù);不同的用戶接入控制;不同的服務(wù)(面向連接服務(wù)和無連接服務(wù));不同的管理與控制方式等。 圖7-5 互聯(lián)網(wǎng)絡(luò)的概念 為了解決上述的許多問題,因特網(wǎng)在IP層采用了標準化協(xié)議。圖7-5(a)表示有許多計算機網(wǎng)絡(luò)通過一些路由器進行互連。由于參加互連的計算機網(wǎng)絡(luò)都使用相同的網(wǎng)際協(xié)議IP,因此,可以將互連以后的計算機網(wǎng)絡(luò)看成一個虛擬互聯(lián)網(wǎng)絡(luò)(如圖7-5(b))。所謂虛擬互聯(lián)網(wǎng)絡(luò)也就是邏輯互聯(lián)網(wǎng)絡(luò),它的意思就是互連起來的各種物理網(wǎng)絡(luò)的異構(gòu)性本來就是客觀存在的,但是我們利用IP就可以使這些性能各異的網(wǎng)絡(luò)從用戶看起來好像是一個統(tǒng)一的網(wǎng)絡(luò)。這種使用IP的虛擬互聯(lián)網(wǎng)絡(luò)可簡稱為IP網(wǎng)。使用虛擬互聯(lián)網(wǎng)絡(luò)的好處是當互聯(lián)網(wǎng)上的主機進行通信時,就好像在一個網(wǎng)絡(luò)上通信一樣,它們看不見互連的各個具體的網(wǎng)絡(luò)的異構(gòu)細節(jié)。本章討論的所有問題都是在這樣的虛擬網(wǎng)絡(luò)上進行的。這種虛擬網(wǎng)絡(luò)現(xiàn)在也稱為互聯(lián)網(wǎng)。 從下一節(jié)起開始討論因特網(wǎng)的核心協(xié)議,即網(wǎng)際協(xié)議IP。 7.2 因特網(wǎng)的網(wǎng)際協(xié)議IP網(wǎng)際協(xié)議IP是TCP/IP體系中兩個最主要的協(xié)議之一,也是最重要的因特網(wǎng)標準協(xié)議。與IP配套使用的還有以下4個協(xié)議。 地址解析協(xié)議ARP 逆地址解析協(xié)議RARP 因特網(wǎng)控制報文協(xié)議ICMP 因特網(wǎng)組管理協(xié)議IGMP
如圖7-6所示,畫出了這4個協(xié)議和網(wǎng)際協(xié)議IP的關(guān)系。在這一層中,ARP和RARP畫在最下面,因為IP經(jīng)常要使用這兩個協(xié)議。ICMP和IGMP畫在這一層的上部,因為它們要使用IP。這4個協(xié)議將在后面陸續(xù)介紹。由于網(wǎng)際協(xié)議IP是用來使互連起來的許多計算機網(wǎng)絡(luò)能夠進行通信,因此,TCP/IP體系中的網(wǎng)絡(luò)層常稱為網(wǎng)際層(Internet layer),或IP層。
圖7-6 網(wǎng)際網(wǎng)協(xié)議IP及其配套協(xié)議 7.2.1 分類IP地址在TCP/IP體系中,IP地址是一個最基本的概念,一定要把它弄清楚。有關(guān)IP最重要的文檔就是RFC 791,它很早就成為了因特網(wǎng)的正式標準。
我們把整個因特網(wǎng)看成一個單一的、抽象的網(wǎng)絡(luò)。IP地址就是給每個連接在因特網(wǎng)上的主機分配一個在全世界范圍是唯一的32位的標識符。IP地址的結(jié)構(gòu)使我們可以在因特網(wǎng)上很方便地進行尋址。IP地址現(xiàn)在由因特網(wǎng)名字與號碼指派公司進行分配。 IP地址的編址方法共經(jīng)過了以下3個歷史階段。 (1)分類的IP地址.這是最基本的編址方法,在1981年就通過了相應(yīng)的標準協(xié)議。 (2)子網(wǎng)的劃分。這是對基本的編址方法的改進,其標準RFC950在1985年通過。 (3)構(gòu)成超網(wǎng)。這是比較新的無分類編址方法。1993年提出后很快就得到推廣和應(yīng)用。 本節(jié)只討論最基本的分類IP地址。后兩種方法將在7、3節(jié)討論。 所謂“分類的IP地址”就是將地址劃分為若干個固定類,每一類地址都由兩個固定長度的字段組成,其中第一個字段是網(wǎng)絡(luò)號,它標志主機所連接到的網(wǎng)絡(luò),而第二個字段是主機號,它標志該主機。或者說,這種兩級的IP地址可以記為: IP地址 ::={<網(wǎng)絡(luò)號>,<主機號>} “::=”表示“定義為”。如圖7-7所示,給出IP地址的網(wǎng)絡(luò)字段和主機號字段,其中A類、B類和C類是單播地址。 圖7-7 IP地址中的網(wǎng)絡(luò)號字段和主機號字段 從圖7-7可以看出:
這里要指出,由于近年來已經(jīng)廣泛使用無分類IP地址進行路由選擇,A類、B類和C類地址的區(qū)分已成為歷史,但由于很多文獻和資料都還使用傳統(tǒng)的分類IP地址,因此我們在這里還要從分類的IP地址講起。 路由器為轉(zhuǎn)發(fā)分組而查找轉(zhuǎn)發(fā)表時,很重要的一點就是查找路由表花費的時間要盡量短。在討論廣域網(wǎng)時已經(jīng)講過簡化轉(zhuǎn)發(fā)表的辦法就是根據(jù)目的主機所連接的目的結(jié)點交換機的位置來尋找路由。當找到目的結(jié)點交換機后,就可直接交付給目的主機。在互聯(lián)網(wǎng)中也是類似的。如果將到時達所有的目的主機的路由全都寫入到轉(zhuǎn)發(fā)表中,就會有很多路由是重復(fù)的,因此沒有必要這樣做。我們應(yīng)將重復(fù)的路由合并。轉(zhuǎn)發(fā)表只使用IP地址中的網(wǎng)絡(luò)號來查找路由。只要IP數(shù)據(jù)報能夠正確到達目的網(wǎng)絡(luò),就可在這個網(wǎng)絡(luò)上直接交付給目的主機而不再需要經(jīng)過其它路由器進行轉(zhuǎn)發(fā)了。 因此,路由器轉(zhuǎn)發(fā)分組有以下兩個步驟。 (1)先按所要找的IP地址中的網(wǎng)絡(luò)號把目的網(wǎng)絡(luò)找到。雖然IP地址的網(wǎng)絡(luò)號字段有3種不同的長度,但根據(jù)IP地址中最前面的類別位,就可以很容易地確定網(wǎng)絡(luò)字段的準確字節(jié)數(shù)。然而以后我們會知道還有更加簡便的方法。 (2)當分組到達目的網(wǎng)絡(luò)后,再利用主機號將數(shù)據(jù)報直接交付給目的主機。 因此,按照整數(shù)字節(jié)劃分網(wǎng)絡(luò)號字段和主機號字段,就可以使用路由器在收到一個分組時能夠更快地將地址中的網(wǎng)絡(luò)號提取出來。 從IP地址的結(jié)構(gòu)來看,IP地址并不僅僅是一個主機的號,而是指出了連接到某個網(wǎng)絡(luò)上的某個主機。如果一個主機的地理位置保持不變,但現(xiàn)在只改變連接的線路,既連接到另一個網(wǎng)絡(luò),那么這個主機的IP地址就必須改變。 把IP地址劃分為3個類別,當初是這樣考慮的。各種網(wǎng)絡(luò)的差異很大,有的網(wǎng)絡(luò)擁有很多主機,而有的網(wǎng)絡(luò)上的主機則很少。把IP地址劃分為A類、B類和C類可更好地滿足不同用戶的要求。A類IP地址的網(wǎng)絡(luò)號數(shù)不多。現(xiàn)在能夠申請到的IP地址只有B類和C類兩種。當某個單位申請到一個IP地址時,實際上是獲得了具有同樣網(wǎng)絡(luò)號的一塊地址。其中具體的各個主機號則由該單位自行分配,只要做到在該單位管轄的范圍內(nèi)無重復(fù)的主機號即可。 在主機或路由器中存放的IP地址都是32位的二進制代碼。為了提高可讀性,在寫出給人看的IP地址時,往往每隔8位插入一個空格,但這樣還是不方便。于是,我們常常將32位的IP地址中的每8位用其等效的十進制數(shù)字表示,并且在這些數(shù)字之間加上一個點。這就叫做點分十進制記法。例如圖7-8所示。 圖7-8 采用點分十進制記法能夠提高可讀性
A類地址的網(wǎng)絡(luò)號字段占一個字節(jié),只有7位可供使用,但可提供使用的網(wǎng)絡(luò)號是126個。減2的原因有兩個。第一,IP地址中的全0表示“這個”。網(wǎng)絡(luò)號字段為全0的IP地址是個保留地址,意思是“本網(wǎng)絡(luò)”。第二,網(wǎng)絡(luò)號字段為127保留作為本地軟件環(huán)回測試本主機之用。A類地址的主機號字段為3個字節(jié),因此,每一個A類網(wǎng)絡(luò)中的最大主機數(shù)是2*24-2,即1677214。這里減2的原因是全0的主機號字段表示該IP地址是“本主機”所連接到的單個網(wǎng)絡(luò)地址,而全1表示“所有的”,因此,全1的主機號字段表示該網(wǎng)絡(luò)上的所有主機。 IP地址空間共有2*32(4294967296)個地址。整個A類地址空間共有2*31個地址,占有整個IP地址空間的50%。 B類地址的網(wǎng)絡(luò)號字段有2字節(jié),但前面兩位已經(jīng)固定了,只剩下14位可以進行分配。雖然這里不存在網(wǎng)絡(luò)總數(shù)減2的問題,因為網(wǎng)絡(luò)號字段最前面的兩位子使得后面的14位無論怎樣排列也不可能出現(xiàn)使整個2字節(jié)的網(wǎng)絡(luò)號字段成為全0或全1。但實際上B類網(wǎng)絡(luò)地址128.0.0.0是不指派的,而可以指派的B類最小網(wǎng)絡(luò)地址是128.1.0.0。因此,B類地址的可用網(wǎng)絡(luò)數(shù)為2*14-1,即16383。B類地址的每一個網(wǎng)絡(luò)上最大主機數(shù)是2*16-2,即65534。這里減2是因為要扣除全0和全1的主機號。整個B類地址空間共約有2*30個地址,占整個IP空間的25%。 C類地址有3個字節(jié)的網(wǎng)絡(luò)號字段,最前面的3位是110,還有21位可以進行分配。雖然這里也不存在網(wǎng)絡(luò)總額減2的問題,但C類網(wǎng)絡(luò)地址192.0.0.0也是不指派的,可以指派的C類最小網(wǎng)絡(luò)地址是192.0.1.0,因此,C類地址的可用網(wǎng)絡(luò)總數(shù)是2*21-1,即2097151。每一個C類地址的最大主機數(shù)是2*8-2,即254。整個C類地址空間共約有2*29個地址,占整個IP地址的12.5%。 這樣一我們就可以得出表7-1所示的IP地址三十一范圍。 IP地址具有以下一些重要特點。 (1)每一個IP地址都由網(wǎng)絡(luò)號和主機號兩部分組成。從這個意義上說,IP地址是一種分等級的地址結(jié)構(gòu)。分兩個等級的好處主要有以下兩個方面。第一,IP地址管理機構(gòu)在分配IP地址時只分配網(wǎng)絡(luò)號,而剩下的主機號則由得到該網(wǎng)絡(luò)號的單位自行分配。這樣就方便了IP地址的管理。第二,路由器根據(jù)目的主機所連接的網(wǎng)絡(luò)號來轉(zhuǎn)發(fā)分組(而不考慮主機號),這樣就可以使路由表中的項目大幅度減少,從而減小了路由表所占的存儲空間。 (2)實際上IP地址是標志一個主機(或路由器)和一條鏈路的接口。當一個主機同時連接到兩個網(wǎng)絡(luò)上時,該主機就必須有兩個相應(yīng)的IP地址,其網(wǎng)絡(luò)號必須是不同的。這種主機稱為多歸屬主機。由于一個路由器至少應(yīng)當連接到兩個網(wǎng)絡(luò)(這樣它才能把IP數(shù)據(jù)報從一個網(wǎng)絡(luò)轉(zhuǎn)發(fā)到另一個網(wǎng)絡(luò)),因此,一個路由器至少應(yīng)當有兩個不同的IP地址。 (3)按照因特網(wǎng)的觀點,用轉(zhuǎn)發(fā)器或網(wǎng)橋連接起來的若干個局域網(wǎng)仍為一個網(wǎng)絡(luò),因此,這些局域網(wǎng)都有同樣的網(wǎng)絡(luò)號。 (4)在IP地址中,所有分配到網(wǎng)絡(luò)號的網(wǎng)絡(luò)都是平等的。 7.2.2 IP地址與硬件地址在學習IP地址時,很重要的一點就是要弄懂主機的IP地址和硬件地址的區(qū)別。 圖7-10說明了這兩種地址的區(qū)別。從層次的角度看,物理地址是數(shù)據(jù)鏈路層使用的地址,而IP地址是虛擬互聯(lián)網(wǎng)絡(luò)所使用的地址,即網(wǎng)絡(luò)層和以上各層使用的地址。
圖7-10 IP地址與硬件地址的區(qū)別
在發(fā)送數(shù)據(jù)時,數(shù)據(jù)從高層下到低層,然后才到通信鏈路上傳輸。使用IP地址的IP數(shù)據(jù)報一旦交給了數(shù)據(jù)鏈路層,就被封裝成MAC幀了。MAC幀在傳送時使用的源地址和目的地址都是硬件地址,這兩個硬件地址都寫在MAC幀的首部中。 連接在通信鏈路上的設(shè)備在接收MAC幀時,其根據(jù)是MAC幀首部中的硬件地址。在數(shù)據(jù)鏈路層看不見隱藏在MAC幀的數(shù)據(jù)中的IP地址。只有在剝?nèi)?/span>MAC幀的首部和尾部,再將MAC層的數(shù)據(jù)上交給網(wǎng)絡(luò)層后,網(wǎng)絡(luò)層才能在IP數(shù)據(jù)報的首部中找到源IP地址和目的IP地址。 總之,IP地址放在IP數(shù)據(jù)報的首部,而硬件地址則放在MAC幀的首部。在網(wǎng)絡(luò)層和網(wǎng)絡(luò)層以上使用的是IP地址,而數(shù)據(jù)鏈路層使用的是硬件地址。在圖7-10中,當IP數(shù)據(jù)報放入數(shù)據(jù)鏈路層的MAC幀中以后,整個的IP數(shù)據(jù)報就成為MAC幀的數(shù)據(jù),因而在數(shù)據(jù)鏈路層看不見數(shù)據(jù)報的IP地址。 如圖7-11(a)所示,畫的是3個局域網(wǎng)用兩個路由器R1和R2互連起來?,F(xiàn)在主機H1要和主機H2通信。這兩個主機的IP地址分別是IP1和IP2,而它們硬件地址分別為HA1.和HA2(HA表示Hardware Address)。通信的路徑是H1→經(jīng)過R1轉(zhuǎn)發(fā)→再經(jīng)過R2轉(zhuǎn)發(fā)→H2。路由器R1因同時連接到兩個局域網(wǎng)上,所以,它有兩個硬件地址,即HA3和HA4。同理,路由器R2也有兩個矹件地址HA5和HA6。 圖7-10 從不同層次上看IP地址和硬件地址 7.2.3 地址解析協(xié)議ARP和逆地址解析協(xié)議RARP上面講的IP地址是不能直接用來通信的。這是因為IP地址只是主機在抽象網(wǎng)絡(luò)層中的地址。若要把網(wǎng)絡(luò)層傳送的數(shù)據(jù)報交給目的主機,還在傳到鏈路層轉(zhuǎn)變成MAC幀后才能發(fā)送到實際的網(wǎng)絡(luò)上。因此,不管網(wǎng)絡(luò)層使用的是什么協(xié)議,在實際網(wǎng)絡(luò)的鏈路上傳送數(shù)據(jù)幀時,最終還是必須使用硬件地址。 因為IP地址有32位,而局域網(wǎng)的硬件地址是48位,所以,它們之間不存在簡單的映射關(guān)系。此外,在一個網(wǎng)絡(luò)上可能經(jīng)常會有新的主機加入進來,或撤走一些主機。更換網(wǎng)卡也會使主機的硬件地址改變??梢?,在主機中應(yīng)存放一個從IP地址到硬件地址的映射表,并且這個映射表還必須能夠經(jīng)常動態(tài)更新。地址解析協(xié)議ARP很好地解決了這些問題。 每一個主機都有一個ARP高速緩存,里面有所在的局域網(wǎng)上的各主機和路由器的IP地址到硬件地址的映射表,這些都是該主機目前知道的一些地址。那么主機怎樣知道這些地址呢?我們可以通過下面的例子來說明。當主機A欲向本局域網(wǎng)上的某個主機B發(fā)送IP數(shù)據(jù)報時,就先在其ARP高速緩存中查看有無主機B的IP地址。如有,就可查出其對應(yīng)的硬件地址,再將此硬件地址寫入MAC幀,然后通過局域網(wǎng)把該MAC幀發(fā)往此硬件地址。 也有可能查不到主機B的IP地址的項目。這可能是主機B才入網(wǎng),也可能是主機A剛加電,其高速緩存還是空的。在這種情況下,主機A就自動運行ARP,然后按以下步驟找到主機B的硬件地址。 (1)ARP進程在本局域網(wǎng)上廣播發(fā)送一個ARP請求分組。圖7-11(a) 是ARP請求分組的主要內(nèi)容是表明:“我的IP地址是209.0.0.5,硬件地址是00-00-C0-15-AD-18。我想知道IP地址為209.0.0.6的主機的硬件地址。” 圖7-11 地址解析協(xié)議ARP的工作原理 (2)在本局域網(wǎng)上的所有主機上運行的ARP進程都收到此ARP請求分組。 (3)主機B在ARP請求分組中見到自己的IP地址,就向主機A發(fā)送ARP響應(yīng)分組,并寫入自己的硬件地址。其余的所有主機都不理睬這個ARP請求分組,ARP響應(yīng)分組主要內(nèi)容是表明:“我的IP地址是209.0.0.6,硬件地址是08-00-2B-00-EE-0A。”請讀者注意,雖然ARP請求分組是廣播發(fā)送的,但ARP響應(yīng)分組是普通的單播,即從一個源地址發(fā)送到一個目的地址。 (4)主機A收到主機B的ARP響應(yīng)分組后,就在其ARP高速緩存中寫入主機B的IP地址到硬件地址的映射。 當主機A向主機B發(fā)送數(shù)據(jù)報時,很可能以后不久主機B還要向A發(fā)送數(shù)據(jù)報,因而主機B也可能要向A發(fā)送ARP請求分組。為了減少網(wǎng)絡(luò)上的通信量,主機A發(fā)送其ARP請求分組時,就將自己的IP地址到硬件地址的映射寫入ARP請求分組。當主機B收到A的ARP請求分組時,就將主機A的這一地址映射寫入主機B自己的ARP高速緩存中。這對主機B以后向A發(fā)送數(shù)據(jù)報時就更方便了。 可見,ARP高速緩存非常有用。如果不使用ARP高速緩存,那么任何一個主機只要進行一次通信,就必須在網(wǎng)絡(luò)上用廣播方式發(fā)送ARP請求分組,這就使得網(wǎng)絡(luò)上的通信量大大增加。ARP把已經(jīng)得到的地址映射保存在高速緩存中,這樣就使得該主機下次再和具有同樣目的地址的主機通信時,可以直接從高速緩存中找到所需的硬件地址,而不必再用廣播方式發(fā)送ARP請求分組。 ARP把保存在高速緩存中的每個映射地址項目都設(shè)置生存時間。凡超過生存時間的項目就從高速緩存中刪除掉。設(shè)置這種地址映射項目的生存時間是很重要的。設(shè)想有一種情況,主機A和主機B通信。A的ARP高速緩存是保存有B的物理地址。但B的網(wǎng)卡突然壞了,B立即更換了一塊,因此B的硬件地址就改變了。A還要和B繼續(xù)通信。A在其ARP高速緩存中查找到B原先的硬件地址,并使用該硬件地址向B發(fā)送數(shù)據(jù)幀。但B原先的硬件地址已經(jīng)失效了,因此A無法找到主機B。但是過了一段時間,A的ARP高速緩存中已經(jīng)刪除了B原先的硬件地址,于是A重新廣播發(fā)送ARP請求分組,又找到了B。 這里需要指出,ARP是解決同一個局域網(wǎng)上的主機或路由器的IP地址的映射問題。如果所要找的主機和源主機不在同一個局域網(wǎng)上,就不能直接找到主機的硬件地址。 這里我們還要指出,這種從IP地址到硬件地址的解析是自動進行的,主機的用戶對這種地址解析過程是不知道的。只要主機或路由器要和本網(wǎng)絡(luò)上的另一個已知IP地址的主機或路由器進行通信,ARP協(xié)議就會自動把這個IP地址解析為鏈路層所需要的硬件地址。 有的讀者可能會產(chǎn)生這樣的疑問,既然在網(wǎng)絡(luò)鏈路上傳送的幀最終是按照硬件地址找到目的主機的,那么為什么我們不直接使用硬件地址進行通信,而是要使用抽象的IP地址并調(diào)用ARP來尋找出相應(yīng)的硬件地址呢? 這個問題必須弄清楚。 因為,全世界存在著各式各樣的網(wǎng)絡(luò),它們使用不同的硬件地址。要使這些異構(gòu)網(wǎng)絡(luò)能夠互相通信就必須進行非常復(fù)雜的硬件地址轉(zhuǎn)換工作,所以,要做到這些幾乎是不可能的事。但統(tǒng)一的IP地址把這個復(fù)雜問題解決了。連接到因特網(wǎng)的主機都擁有統(tǒng)一的IP地址,它們之間的通信就像連接在同一個網(wǎng)絡(luò)上那樣簡單方便,因為調(diào)用ARP來尋找某個路由器或主機的硬件地址都是由計算機軟件自動進行的,對用戶來說是看不見這種調(diào)用過程的。 設(shè)想有兩個主機可以直接使用硬件地址進行通信。再假定其兩個主機的網(wǎng)卡都同時壞了,然后又都更換了一塊,因此它們的硬件地址也都改變了。這時,這兩個主機怎么能夠知道對方的硬件地址呢?顯然很難。但IP地址獨立于主機或路由器的硬件地址的。硬件地址的改變不會影響使用IP的主機的通信。 因此,在虛擬的IP網(wǎng)絡(luò)上用IP地址進行通信給廣大的計算機用戶帶來方便。 在進行地址轉(zhuǎn)換時,有時還要用到逆地址解析協(xié)議RARP使中知道自己硬件地址的主機能夠知道其IP地址。這種主機往往是無盤工作站。這種無盤工作站一般只要運行其ROM中的文件傳送代碼,就可用下行裝載方法從局域網(wǎng)上其他主機得到所需要的操作系統(tǒng)和TCP/IP通信軟件,但這些軟件中并沒有IP地址。無盤工作站要運行ROM中的RARP來獲得其IP地址。RARP的工作過程大致如下。 為了使RARP能工作,在局域網(wǎng)上至少有一個主機要充當RARP服務(wù)器,無盤工作站先向局域網(wǎng)發(fā)出RARP請求分組,并在此分組中給出自己的硬件地址。 RARP服務(wù)器有一個事先做好的從無盤工作站的硬件地址到IP地址的映射表,當收到RARP請求分組后,RARP服務(wù)器就從這映射表查出該無盤工作站的IP地址。然后寫入RARP響應(yīng)分組,發(fā)回給無盤工作站。無盤工作站用此方法獲得自己的IP地址。 ARP和RARP都已經(jīng)成為因特網(wǎng)標準協(xié)議,其RFC文檔分別為RFC826和RFC903。 7.2.4 IP數(shù)據(jù)報格式IP數(shù)據(jù)報的格式能夠說明IP都有什么功能。在TCP/IP的標準中,各種數(shù)據(jù)格式常以32位為單位來描述。圖7-12是IP數(shù)據(jù)報的完整格式。 圖7-12 IP數(shù)據(jù)報的格式
如圖7-12所示,一個IP數(shù)據(jù)報由首部和數(shù)據(jù)兩部分組成。首部的前一部分是固定長度,共20字節(jié),是所有IP數(shù)據(jù)報必須具有的。在首部的固定部分后面是一些可選字段,其長度是可變的。下面介紹首部各字段的意義。 1、IP數(shù)據(jù)報首部的固定部分中的各字段 (1)版本 占4位,指IP的版本。通信雙方使用的IP的版本必須一致。目前,廣泛使用的IP版本號為4(即IPv4)。 (2)首部長度 占4位,可表示的最大數(shù)值是15個單位(一個單位為4字節(jié)),因此,IP的首部長度的最大值是60字節(jié)。當IP分組的首部長度不是4字節(jié)的整數(shù)時,必須利用最后的填充字段加以填充。因此,數(shù)據(jù)部分永遠在4字節(jié)的整數(shù)倍時開始,這樣在實現(xiàn)IP時較為方便。首部長度限制為60字節(jié)的缺點是有時(如源站路由選擇)不夠用。但這樣做是希望用戶盡量減少開銷。最常用的首部長度就是20字節(jié),即不使用任何選項。 (3)區(qū)分服務(wù) 占8位,用來獲得更好的服務(wù)。這個字段在舊標準中叫做服務(wù)類型,但實際上一直沒有被使用過。1998年IETF把這個字段改名為區(qū)分服務(wù)。只要當使用區(qū)分服務(wù)時,這個字段才起作用。在一般的情況下不使用這個字段[RFC2474]。 (4)總長度 占16位,指首部和數(shù)據(jù)之和的長度,單位為字節(jié)??傞L度字段為位,因此數(shù)據(jù)報的最大長度為65535字節(jié)(64KB)。 在IP層下面的每一種數(shù)據(jù)鏈路層都有其自己的幀格式,其中包括幀格式中的數(shù)據(jù)字段的最大長度,這稱為最大傳送單元MTU。當一個IP數(shù)據(jù)報封裝成鏈路層的幀時,此數(shù)據(jù)報的總長度(即首部加上數(shù)據(jù)部分)一定不能超過下面的數(shù)據(jù)鏈路層的MTU值。 雖然使用盡可能的數(shù)據(jù)報會使傳輸效率提高,但由于以太網(wǎng)的普遍應(yīng)用,所以實際上使用的數(shù)據(jù)報長度很少有超過1500字節(jié)的,而有時數(shù)據(jù)報長度還被限制在576字節(jié)。當數(shù)據(jù)報長度超過網(wǎng)絡(luò)所容許的最大傳送單元MTU時,就必須將過長的數(shù)據(jù)報進行分片后才能在網(wǎng)絡(luò)上傳送。這時,數(shù)據(jù)報首部中的“總長度”字段不是指未分片前的數(shù)據(jù)報長度,而是批分片后每片的首部長度與數(shù)據(jù)長度的總和。 (5)標識 占16位,它是一個計數(shù)器,用來產(chǎn)生數(shù)據(jù)報的標識。但這里的“標識”并沒有序號的意思,因為IP是無連接服務(wù),數(shù)據(jù)報不存在按序接收的問題。當IP發(fā)送數(shù)據(jù)報時,它就把這個計數(shù)器的當前值復(fù)制到標識字段中。當數(shù)據(jù)報由于長度超過網(wǎng)絡(luò)的MTU而必須分片時,這個標識字段的值就被復(fù)制到所有的數(shù)據(jù)報片的標識字段中。相同的標識字段的值使分片后的各數(shù)據(jù)報片最后能正確地重裝成為原來的數(shù)據(jù)報。 (6)標志 占3位。目前只有前兩位有意義。 標志字段中的最低位記為MF。MF=1即表示后面“還有分片”的數(shù)據(jù)報。MF=0表示這已是若干數(shù)據(jù)報片中的最后一個。 標志字段中間的一位記為DF,意思是“不能分片”。只有當DF=0時才允許分片。 (7)片偏移 占13位。片偏移指出,較長的分組在分片后,某片在原分組中的相對位置。也就是說,相對于用戶數(shù)據(jù)字段的起點,該片從何處開始。片偏移以8個字節(jié)為偏移單位。這就是說,每個分片的長度一定是8字節(jié)(64位)的整數(shù)倍。 (8)生存時間 占8位,生存時間字段記為TTL,即數(shù)據(jù)報在網(wǎng)絡(luò)中的壽命。設(shè)置這個字段是防止數(shù)據(jù)報無限期地在因特網(wǎng)中兜圈子,因而消耗大量網(wǎng)絡(luò)資源。最初是設(shè)想在數(shù)據(jù)報每經(jīng)過一個路由器時,就把生存時間TTL減少一個單位的時間。當TTL值減為零時,就丟棄這個數(shù)據(jù)報。 因為因特網(wǎng)中的各路由器并沒有進行時鐘同步,而數(shù)據(jù)報在路由器中排隊的時間也越來越短,所以具體實現(xiàn)TTL還是比較困難?,F(xiàn)在已經(jīng)把TTL字段的功能改為“路數(shù)限制”,但名稱仍然不變。路由器在每次轉(zhuǎn)發(fā)數(shù)據(jù)報時,就把其TTL減1。若TTL值為零,就丟棄這個數(shù)據(jù)報。因此,現(xiàn)在TTL的意思就是規(guī)定了一個數(shù)據(jù)報在因特網(wǎng)中至多可以經(jīng)過多少跳,這實際上就是規(guī)定了一個數(shù)據(jù)報在因特網(wǎng)中至多可以經(jīng)過多少個路由器。如果把TTL值設(shè)置為1,就表示這個數(shù)據(jù)報只能在本局域網(wǎng)中傳送,一傳送到某個路由器就會被丟棄。 (9)協(xié)議 占8位,協(xié)議字段指出此數(shù)據(jù)報攜帶的數(shù)據(jù)是使用何種協(xié)議,以便使目的主機的IP層知道應(yīng)將數(shù)據(jù)部分上交給哪個處理過程。 (10)首部檢驗和 占16位。這個字段只檢驗數(shù)據(jù)報的首部,但不包括數(shù)據(jù)部分。這是因為數(shù)據(jù)報每經(jīng)過一個路由器,路由器都要重新計算一下首部檢驗和(一些字段,如生存時間、標志、片偏移等都可能發(fā)生變化)。如把數(shù)據(jù)部分一起檢驗,計算的工作量就太大了。為了減小計算檢驗和的工作量,IP首部的檢驗和不采用復(fù)雜的CRC檢驗碼,而采用下面的簡單計算方法:在發(fā)送方,先把IP數(shù)據(jù)報首部劃分為許多16位字的序列,并把檢驗和字段置零。用反碼算術(shù)運算將所有16位字相加后,將得到的和的反碼寫入檢驗和字段。接收方收到數(shù)據(jù)報后,將首部的所有16位字再使用反碼算術(shù)運算相加一次。將得到的和取反碼,即得出接收方檢驗和的計算結(jié)果。若首部未發(fā)生任何變化,則此結(jié)果必為0,于是就保留這個數(shù)據(jù)報。否則即認為出錯,并將此數(shù)據(jù)報丟棄。 (11)源地址 占4字節(jié)。 (12)目的地址 占4字節(jié)。 2、IP數(shù)據(jù)報首部的可變部分 IP首部的可變部分就是一個選項字段。選項字段用來支持排錯、測量以及安全等措施,內(nèi)容很豐富。此字段長度可變,從1個字節(jié)到40個字節(jié)不等,取決于所選擇的項目。某些選項項目只需要1個字節(jié),它只包括1個字節(jié)的選項代碼。但還有些選項需要多個字節(jié),這些選項一個個拼接起來,中間不需要有分隔符,最后用全0的填充字段補齊成為4字節(jié)的整數(shù)倍。 增加首部的可變部分是為了增加IP數(shù)據(jù)報的功能,但這同時也使得IP數(shù)據(jù)報的首部長度成為可變的。這就增加了每一個路由器處理數(shù)據(jù)報的開銷。實際上這些選項很少被使用。就的IP版本IPv6就把IP數(shù)據(jù)報首部長度做成固定的。因此,這里不再繼續(xù)討論這些選項的細節(jié)。有興趣的讀者可參閱RFC791。 7.2.5 IP層處理數(shù)據(jù)報的流程在因特網(wǎng)中路由器的作用和第6章廣域網(wǎng)中的結(jié)點交換機相似。但路由器和結(jié)點交換機還存在以下區(qū)別。 (1)路由器是用來連接不同的網(wǎng)絡(luò),而結(jié)點交換機只是在一個特定的網(wǎng)絡(luò)中工作。 (2)路由器是專門用來轉(zhuǎn)發(fā)分組的,而結(jié)點交換機還可接上許多個主機。 (3)路由器使用統(tǒng)一的IP,而結(jié)點交換機使用所在廣域網(wǎng)的特定協(xié)議。 (4)路由器根據(jù)目的網(wǎng)絡(luò)地址找出下一跳路由器,而結(jié)點交換機則根據(jù)目的站所接入的交換機號找出下一跳結(jié)點交換機。 圖7-14(a)是一個路由表的簡單例子。有4個A類網(wǎng)絡(luò)通過3個路由器連接在一起。每一個網(wǎng)絡(luò)上都可能有成千上萬個主機??梢韵胂?,若按查找目的主機號來制作路由表,則所得出的路由表就會過于龐大。但若按主機所在的網(wǎng)絡(luò)地址來制作路由表,那么每一個路由器中的路由表就只飲食4個項目。以路由器R2的路由表為例。因為R2同時連接在網(wǎng)絡(luò)2和網(wǎng)絡(luò)3上,所以,只要目的站在這兩個網(wǎng)絡(luò)上,都可通過接口0或接口1由路由器R2直接交付(當然還要利用地址解析協(xié)議ARP才能找到這些主機相應(yīng)的硬件地址)。若目的站在網(wǎng)絡(luò)1中,則下一跳路由器應(yīng)為的,其IP地址為20.0.0.7。因為路由器R2和R1同時連接在網(wǎng)絡(luò)2上,所以從路由器R2把分組轉(zhuǎn)發(fā)到路由器R1是很容易的。同理,若目的站在網(wǎng)絡(luò)4中,則路由器R2應(yīng)把分組轉(zhuǎn)發(fā)給IP地址為30.0.0.1的路由器R3。 可以將整個的網(wǎng)絡(luò)拓撲簡化為如圖7-14(b)所示的那樣。在簡化圖中,網(wǎng)絡(luò)變成了一條鏈路,但每一個路由器旁邊都注明其IP地址。使用這樣的簡化圖,可以使我們不用關(guān)心某個網(wǎng)絡(luò)內(nèi)部的拓撲以及連接在該網(wǎng)絡(luò)上有多少臺計算機,因為這些對于研究分組轉(zhuǎn)發(fā)問題并沒有什么關(guān)系。這樣的簡化圖強調(diào)了在互聯(lián)網(wǎng)上轉(zhuǎn)發(fā)分組時,是從一個路由器轉(zhuǎn)發(fā)到下一個路由器。
圖 7-14 路由表舉例 在路由表中,對每一條路由最主要的是以下兩項: (目的網(wǎng)絡(luò)地址,下一跳地址) 于是,我們就根據(jù)目的網(wǎng)絡(luò)地址來確定下一跳路由器,這樣做得出了以下結(jié)果。 (1)IP數(shù)據(jù)報首先要設(shè)法找到目的主機所在目的網(wǎng)絡(luò)上的路由器(間接交付)。 (2)只有到達最后一個路由器時,才試圖向目的主機進行直接交付。 雖然因特網(wǎng)所有的分組轉(zhuǎn)發(fā)都是基于目的主機所在的網(wǎng)絡(luò),但在大多數(shù)情況下都允許有這樣的特例,即對特定的目的主機指明一個路由。這種路由叫做特定主機路由。采用特定主機路由可使網(wǎng)絡(luò)管理人員能更方便地控制網(wǎng)絡(luò)和測試網(wǎng)絡(luò),同時也可在需要考慮某種安全問題是采用這種特定主機路由。在對網(wǎng)絡(luò)的連接或路由表進行排錯時,指明到某一個主機的特殊路由十分有用。 和結(jié)點交換機路由表的情況相似,路由器也可采用默認路由以減少路由表所占用的空間和搜索路由表所用的時間。 這里我們再強調(diào)指出,在IP數(shù)據(jù)報的首部中沒有地方可以用來指明“下一跳路由器的IP地址”。在IP數(shù)據(jù)報的首部寫上的IP地址是源IP地址,而沒有中間經(jīng)過的路由器的IP地址。既然IP數(shù)據(jù)報中沒有下一跳路由器的IP地址,那么待轉(zhuǎn)發(fā)的數(shù)據(jù)報又怎樣能夠找到下一跳路由器呢? 當路由器收到一個待轉(zhuǎn)發(fā)的數(shù)據(jù)報,在從路由表得出下一跳路由器的IP地址后,不是將下一跳路由器的IP地址填入IP數(shù)據(jù)報,而是送交下層的網(wǎng)絡(luò)接口軟件。網(wǎng)絡(luò)接口軟件負責將下一跳路由器的IP地址轉(zhuǎn)換成硬件地址(使用ARP),并將此硬件地址放在鏈路層MAC幀的首部,然后根據(jù)這個硬件地址找到下一跳路由器。由此可見,當發(fā)送一連串的數(shù)據(jù)報時,上述的這種查找路由表、計算硬件地址、寫入MAC幀的首部等過程,將不斷地重復(fù)進行,造成了一定的開銷。 那么,能不能在路由表中不不使用IP地址而直接使用硬件地址呢 不行。我們一定要弄清楚,使用抽象的IP地址,本來就是為了隱蔽各種底層網(wǎng)絡(luò)的復(fù)雜性而便于分析和研究問題,這樣就不可避免地要付出代價,例如選擇路由時多了一些上述的開銷。但反過來,如果在路由表中直接使用硬件地址,那就會帶來更多的麻煩。 上面所討論的是IP層怎樣根據(jù)路由表的內(nèi)容進行分組轉(zhuǎn)發(fā),而沒有涉及路由表一開始是如何建立的,以及路由表的內(nèi)容應(yīng)如何進行更新。但是,在進一步討論路由選擇之前,我們還要先介紹劃分子網(wǎng)和構(gòu)造超網(wǎng)這兩個非常重要的概念。7.3 劃分子網(wǎng)和構(gòu)造超網(wǎng)7.3.1 子網(wǎng)的劃分1、從兩級IP地址到三級IP地址 在今天看來,在ARPANET的早期,IP地址的設(shè)計確實不夠合理。 第一,IP地址空間的利用率有時很低。 每一個A類地址網(wǎng)絡(luò)可連接的主機數(shù)超過1千萬,而每一個B類地址網(wǎng)絡(luò)可連接的主機數(shù)也超過6萬。然而有些網(wǎng)絡(luò)對連接在網(wǎng)絡(luò)上的計算機數(shù)目有限制,根本達不到這樣大的數(shù)值。例如10BASE-T以太網(wǎng)規(guī)定其最大結(jié)點數(shù)只有1024。這樣的以太網(wǎng)若使用一個B類地址就浪費6萬多個IP地址,地址空間的利用率還不到2%,而其他單位的主機無法使用這些被浪費的地址。所統(tǒng)計,超過半數(shù)的B類地址網(wǎng)絡(luò)所連接的主機還不到50臺,而這些單位并不愿意申請一個足夠使用的C類地址(理由是考慮至今后可能的發(fā)展)。IP地址的浪費,還會使IP地址空間的資源過早地被用完。 第二,給每一個物理網(wǎng)絡(luò)分配一個網(wǎng)絡(luò)號會使路由表變得太大因而使網(wǎng)絡(luò)性能變壞。 每一個路由器都應(yīng)當能夠從路由表查出應(yīng)怎樣到達其他網(wǎng)絡(luò)的下一跳路由器.。因此互聯(lián)網(wǎng)中的網(wǎng)絡(luò)數(shù)越多,路由器的路由表的項目數(shù)也就越多。這樣,即使我們擁有足夠多的IP地址資源可以給每一個物理網(wǎng)絡(luò)分配一個網(wǎng)絡(luò)號,也會導(dǎo)致路由器中的路由表中的項目數(shù)過多。這不僅增加了路由器的成本(需要更多的存儲空間),而且使查找路由時耗費更多的時間,同時也使路由器之間定期交換的路由信息急劇增加,因而使路由器和整個因特網(wǎng)的性能都下降了。 第三,兩級IP地址不夠靈活。 有時情況緊急,一個單位需要在新的地點馬上開通一個新的網(wǎng)絡(luò)。但是在申請到一個新的IP地址之前,新增加的網(wǎng)絡(luò)是不可能連接到因特網(wǎng)上工作的。我們希望有一種方法,使一個單位能隨時靈活地增加本單位的網(wǎng)絡(luò),而不必事先到因特網(wǎng)管理機構(gòu)去申請新的網(wǎng)絡(luò)號。原來的兩級IP地址無法做到這一點。 為解決上述問題,從1985年起在IP地址中又增加了一個“子網(wǎng)號字段”,使兩級IP地址變成為三級IP地址,它能夠較好地解決上述問題,并且使用起來也很靈活。這種做法叫做劃分子網(wǎng),或子網(wǎng)尋址或子網(wǎng)路由選擇。劃分子網(wǎng)已成為因特網(wǎng)的正式標準協(xié)議。 劃分子網(wǎng)的基本思路如下。 (1)一個擁有許多物理網(wǎng)絡(luò)的單位,可將所屬的物理網(wǎng)絡(luò)劃分為若干個子網(wǎng)。劃分子網(wǎng)純屬一個單位內(nèi)部的事情。本單位以外的網(wǎng)絡(luò)看不見這個網(wǎng)絡(luò)是由多少個子網(wǎng)組成,因為這個單位對外仍然表現(xiàn)為一個沒有劃分子網(wǎng)的網(wǎng)絡(luò)。 (2)劃分子網(wǎng)的方法是從網(wǎng)絡(luò)的主機號借用若干位作為子網(wǎng)號,而主機號也就相應(yīng)減少了若干位。于是,兩級IP地址在本單位內(nèi)部就變?yōu)槿?/span>IP地址,即網(wǎng)絡(luò)號、子網(wǎng)號和主機號,或者可以用以下記法來表示: IP地址::={<網(wǎng)絡(luò)號>,<子網(wǎng)號>,<主機號>} (3)凡是從其他網(wǎng)絡(luò)發(fā)送給本單位某個主機的IP數(shù)據(jù)報,仍然是根據(jù)IP數(shù)據(jù)報的目的網(wǎng)絡(luò)號找到連接在本單位網(wǎng)絡(luò)上的路由器。但此路由器在收到IP數(shù)據(jù)報后,再按目的網(wǎng)絡(luò)號和子網(wǎng)號找到目的子網(wǎng),將IP數(shù)據(jù)報交付給目的主機。 下面用例子說明劃分子網(wǎng)的概念。圖7-15表示某單位擁有一個B類IP地址,網(wǎng)絡(luò)地址是145.13.0.0(網(wǎng)絡(luò)號是145.13)。凡目的地址為145.13.x .x的數(shù)據(jù)報都被送到這個網(wǎng)絡(luò)上的路由器R1。
圖7-15 一個B類網(wǎng)絡(luò)145.13.0.0 現(xiàn)把圖7-15的網(wǎng)絡(luò)劃分為3個子網(wǎng),如圖7-16所示。這里假定子網(wǎng)號占用8位,因此在增加了子網(wǎng)號后,主機號就只有8位。所劃分的3個子網(wǎng)分別是:145.13.3,0 ,145.13.7.0和145.13.21.0。在劃分子網(wǎng)后,整個網(wǎng)絡(luò)對外部仍表現(xiàn)為一個網(wǎng)絡(luò),其網(wǎng)絡(luò)地址仍為145.13.0.0。但網(wǎng)絡(luò)145.13.0.0 上的路由器R1在收到數(shù)據(jù)報后,再根據(jù)數(shù)據(jù)報的目的地址將其轉(zhuǎn)發(fā)到相應(yīng)的子網(wǎng)。 圖7-16 劃分為三個子網(wǎng) 總之,當沒有劃分子網(wǎng)時,IP地址是兩級結(jié)構(gòu),地址的網(wǎng)絡(luò)號字段也就是IP地址的“因特網(wǎng)部分”,而主機號字段是IP地址的“本地部分”。 劃分子網(wǎng)后IP地址就變成了三級結(jié)構(gòu)。請注意,劃分子網(wǎng)只是將IP地址的本地部分進行再劃分,而不改變IP地址的因特網(wǎng)部分。
2、子網(wǎng)掩碼 我們知道,從IP數(shù)據(jù)報的首部并不知道源主機或目的主機所連接的網(wǎng)絡(luò)是否進行了子網(wǎng)劃分。這是因為32位的IP地址本身以及數(shù)據(jù)報的首部都沒有包含任何有關(guān)子網(wǎng)劃分的信息。因此必須另外想辦法,這就是使用子網(wǎng)掩碼。 圖7-17(a)是IP地址為145.13.3.10的主機本來的兩級IP地址結(jié)構(gòu)。圖7-17(b)j是同一主機的三級IP地址的結(jié)構(gòu),也就是說,現(xiàn)在從原來16位的主機號中拿出8位作為子網(wǎng)號subnet-id,而主機號減少到8位。請讀者注意,雖然IP地址變?yōu)榱巳?,但?shù)據(jù)報的轉(zhuǎn)發(fā)仍然是分兩步走,即先按網(wǎng)絡(luò)地址找網(wǎng)絡(luò),然后再找主機?,F(xiàn)在網(wǎng)絡(luò)地址是145.13.3.0(既不是原來的網(wǎng)絡(luò)地址145.13.0.0,也不是子網(wǎng)號3)。為了方便地從數(shù)據(jù)報中的目的IP地址中提取出所要找的子網(wǎng)的網(wǎng)絡(luò)地址,路由器R1就要使用子網(wǎng)掩碼。圖7-17(c)是子網(wǎng)掩碼,它也是32位,由一串1和跟隨的一串0組成。子網(wǎng)掩碼中的1對應(yīng)IP地址中的網(wǎng)絡(luò)號(請注意,一定要包括subnet-id),而子網(wǎng)掩碼中的0對應(yīng)現(xiàn)在的主機號。雖然RFC文檔中沒有規(guī)定子網(wǎng)掩碼中的一串1必須是連續(xù)的,但卻極力推薦在子網(wǎng)掩碼中選用連續(xù)的1,以免出現(xiàn)可能發(fā)生的差錯。 圖7-17(d)表示R1把子網(wǎng)掩碼和IP地址145.13.3.10逐位相“與”(AND)(計算機進行這種邏輯AND運算是很容易的),得出了所要找的子網(wǎng)的網(wǎng)絡(luò)地址145.13.3.0。 圖7-17 IP地址的各字段和子網(wǎng)掩碼 使用子網(wǎng)掩碼的好處就是不管網(wǎng)絡(luò)有沒有劃分子網(wǎng),只要把子網(wǎng)掩碼和IP地址進行逐位的“與”運算,就立即得出網(wǎng)絡(luò)地址來。這樣在路由器處理到來的分組時就可采用同樣的算法。 這里還要弄清一個問題,這就是在不劃分子網(wǎng)時,既然沒有子網(wǎng),為什么還要使用子網(wǎng)掩碼?這就是為了更方便地查找路由表。現(xiàn)在因特網(wǎng)的標準規(guī)定:所有的網(wǎng)絡(luò)都必須有一個子網(wǎng)掩碼,同時在路由器的路由表中也必須有子網(wǎng)掩碼這一欄。如果一個網(wǎng)絡(luò)不劃分子網(wǎng),那么該網(wǎng)絡(luò)的子網(wǎng)掩碼就使用默認子網(wǎng)掩碼。默認子網(wǎng)掩碼中的1的位置和IP地址中的網(wǎng)絡(luò)號字段正好相對應(yīng)。因此,若使用默認子網(wǎng)掩碼和某個不劃分子網(wǎng)的IP地址逐位相“與”(AND),就得出該IP地址的網(wǎng)絡(luò)地址來。這樣做可以不用查找該地址的類別位就能知道這是哪一類的IP地址。顯然, A類地址的默認子網(wǎng)掩碼是255.0.0.0,或0XFF000000。 B類地址的默認子網(wǎng)掩碼是255.255.0.0,或0XFFFF0000。 C類地址的默認子網(wǎng)掩碼是255.255.255.0,或0XFFFFFF00。 子網(wǎng)掩碼是一個網(wǎng)絡(luò)或一個子網(wǎng)的重要屬性。在RFC950成為因特網(wǎng)的正式標準后,路由器在和相鄰路由器表中的信息時,必須把自己所在網(wǎng)絡(luò)(或子網(wǎng))的子網(wǎng)掩碼告訴相鄰路由器。在路由器的路由表中的每一個項目,除了要給出目的網(wǎng)絡(luò)地址外,還必須同時給出該網(wǎng)絡(luò)的子網(wǎng)掩碼。若一個路由器連接在兩個子網(wǎng)上就擁有兩個網(wǎng)絡(luò)地址和兩個子網(wǎng)掩碼。 請讀者注意,雖然根據(jù)已成為因特網(wǎng)標準協(xié)議的RFC 950文檔,子網(wǎng)號不能全為1或全為0,但隨著無分類域間路由選擇CIDR的廣泛使用(在7.3.3節(jié)討論),現(xiàn)在全1或全0的子網(wǎng)號也可以使用了,但一定要謹慎使用,要弄清路由器所用的路由選擇軟件是否支持全0或全1的子網(wǎng)號這種較新的用法。 我們可以看出,若使用較少位數(shù)的子網(wǎng)號,則每一個子網(wǎng)上可連接的主機數(shù)就較大。反之,若使用較多位數(shù)的子網(wǎng)號,則子網(wǎng)的數(shù)目較多但每個子網(wǎng)上可連接的主機數(shù)就較小。因此我們可根據(jù)網(wǎng)絡(luò)的具體情況(一共需要分多少個子網(wǎng),每個子網(wǎng)中最多有多少個主機)來選擇合適的子網(wǎng)掩碼。 。 7.3.2 使用子網(wǎng)時分組的轉(zhuǎn)發(fā)在劃分子網(wǎng)的情況下,分組轉(zhuǎn)發(fā)的算法必須做相應(yīng)的改動。 我們應(yīng)當注意到,使用子網(wǎng)劃分后,路由表必須包含以下3項內(nèi)容,即目的網(wǎng)絡(luò)地址、子網(wǎng)掩碼和下一跳地址。 在劃分子網(wǎng)的情況下路由器轉(zhuǎn)發(fā)分組的算法應(yīng)當如下所示。 (1)從收到數(shù)據(jù)報的首部提取的IP地址D。 (2)先判斷是否為直接交付。對路由器直接相連的網(wǎng)絡(luò)逐個進行檢查:用各網(wǎng)絡(luò)的子網(wǎng)掩碼和D逐位相“與”(AND操作),看結(jié)果是否和相應(yīng)的網(wǎng)絡(luò)地址匹配。若匹配,則把分組進行直接交付(當然還需要把D轉(zhuǎn)換成物理地址,把數(shù)據(jù)報封裝成幀發(fā)送出去),轉(zhuǎn)發(fā)任務(wù)結(jié)束。否則就是間接交付,執(zhí)行步驟(3)。 (3)若路由表中有目的地址為D的特定主機路口,則把數(shù)據(jù)報傳送給路由表中所指明的下一路由器;否則,執(zhí)行步驟(4)。 (4)對路由表中的每一行(目的網(wǎng)絡(luò)地址、子網(wǎng)掩碼、下一跳地址),用其中的子網(wǎng)掩碼和D逐位相“與”(AND操作),其結(jié)果為N。若N與該行的目的網(wǎng)絡(luò)地址匹配,則把數(shù)據(jù)報傳送給該行指明的下一跳路由器;否則,執(zhí)行步驟(5)。 (5)若路由表中有一個默認路由,則把數(shù)據(jù)報傳送給路由表中指明的默認路由器;否則,執(zhí)行步驟(6)。 (6)報告轉(zhuǎn)發(fā)分組出錯。 7.3.3 無分類編址CIDR(構(gòu)造超網(wǎng))1. 網(wǎng)絡(luò)前綴 劃分子網(wǎng)在一定程度上緩解了因特網(wǎng)在發(fā)展中遇到的困難。然而在1992年因特網(wǎng)仍然面臨3個必須盡早解決的問題,這就是: (1)B類地址在1992年已分配了近一半,眼看很快就將全部分配完畢! (2)因特網(wǎng)主干網(wǎng)上的 路由表中的項目數(shù)急劇增長(從幾千萬增長到幾萬個)。 (3)整個IPv4的地址空間最終將全部耗盡。 當時預(yù)計前兩個問題就在1994年變的非常嚴重。因此,IETE很快就研究出采用無分類編址的方法來解決前兩個問題。IETE認為上面的3個問題屬于更加長遠的問題,因此,專門成立IPv6工作組負責研究解決新版本IP的問題。 其實早在1987年,RFC1009就指明了在一個劃分子網(wǎng)的網(wǎng)絡(luò)中可同時使用不同的子網(wǎng)掩碼。使用變長子網(wǎng)掩碼VLSM可進一步提高IP地址資源的利用率。在VLSM的基礎(chǔ)上有進一步研究出無分類編址的方法,它的正式名字是無分類域間路由選擇CIDR。在1993年形成了CIDR的RFC文檔:RFC1517~1519和RFC1520?,F(xiàn)在CIDR已成為因特網(wǎng)建議標準協(xié)議。 CIDR最主要的特點有兩個。 (1)CIDR消除了傳統(tǒng)的A類、B類和C類地址以及劃分子網(wǎng)的概念,因而,可以更加有效地分配IPv4的地址空間,并且可以在新的IPv6使用之前容許因特網(wǎng)的規(guī)模繼續(xù)增長。CIDR使用各種長度的“網(wǎng)絡(luò)前綴”來代替分類地址中的網(wǎng)絡(luò)號和子網(wǎng)號,而不是像分類地址中只能使用1字節(jié)、2字節(jié)和3字節(jié)長的網(wǎng)絡(luò)號。CIDR不再使用“子網(wǎng)”的概念而使用網(wǎng)絡(luò)前綴,使IP地址從三級編址(使用子網(wǎng)掩碼)又回到了兩級編址,但這已是無分類的兩級編址。它的記法是: IP地址 ::={〈網(wǎng)絡(luò)前綴〉,〈主機號〉} CIDR還使用“斜線記法”,或CIDR記法,即在IP地址后面加上斜線“/”,然后寫上網(wǎng)絡(luò)前綴所占的位數(shù)(對應(yīng)子網(wǎng)掩碼中的1的個數(shù))。 (2)CIDR把網(wǎng)絡(luò)前綴都相同的連續(xù)的IP地址組成“CIDR地址塊”。一個CIDR地址塊是由地址塊的起始地址(即地址中地址數(shù)值最小的一個)和地址塊中的地址數(shù)來定義的。CIDR地址塊也可用斜線記法來表示。 當我們見到斜線記法表示的地址時,一定要根據(jù)上下文弄清它是指一個單個的IP地址,還是指一個地址塊。 由于一個CIDR地址塊可以表示很多地址,所以在路由表中就利用CIDR地址塊來查找目的網(wǎng)絡(luò)。這種地址的聚合常稱為路由聚合,它使得路由表中的一個項目可以表示原來傳統(tǒng)分類地址的很多個路由。路由聚合也稱為構(gòu)成超網(wǎng)。如果沒有采用CIDR,在1994年和1995年,因特網(wǎng)的一個路由表中就會超過7萬個項目,而使用了CIDR后,在1996年的一個路由表的項目數(shù)才只有3萬多個。路由聚合有利于減少路由器之間的路由選擇信息的交換,從而提高了整個因特網(wǎng)的性能。 為了更方便的進行路由選擇,CIDR使用32位的地址掩碼。地址掩碼是有一串1和一串0組成,而1的個數(shù)就是網(wǎng)絡(luò)前綴的長度。雖然CIDR不使用子網(wǎng)了,但是目前仍有一些網(wǎng)絡(luò)使用子網(wǎng)劃分和子網(wǎng)掩碼,因此,CIDR所使用的地址掩碼也可以繼續(xù)叫做子網(wǎng)掩碼。對于/20地址塊,其地址掩碼是:11111111 11111111 11110000 00000000(20個連續(xù)的1)。斜線記法中的數(shù)字就是地址掩碼中1的個數(shù)。 請讀者注意,在配置基于CIDR的網(wǎng)絡(luò)時,可能有一些主機本來是使用分類的IP地址。它們可能不允許把網(wǎng)絡(luò)前綴設(shè)置為比原來分類地址的子網(wǎng)掩碼的1的長度更短。例如,把網(wǎng)絡(luò)配置成2000.25.16.0/20時就可能不行,因為這原來是一個C類地址,其子網(wǎng)掩碼的長度至少是24位。只有在主機的軟件支持CIDR時,網(wǎng)絡(luò)前綴才能比原來的掩碼長度短。但是,若把200.25.16.0/20配置成16個/24地址塊就不會有問題,因為不支持CIDR的主機會把本地的/24解釋成C類網(wǎng)絡(luò)。 2.最長前綴匹配 在使用CIDR時,由于采用了網(wǎng)絡(luò)前綴這種記法,IP地址由網(wǎng)絡(luò)前綴和主機號這兩個部分組成,因此在路由表中的項目也要有相應(yīng)的改變.這時,每個項目由“網(wǎng)絡(luò)前綴”和“下一跳地址”組成。但是在查找路由表時可能會得到不止一個匹配結(jié)果。這樣就帶來一個問題:我們應(yīng)當從這些匹配結(jié)果中選擇哪一條路由呢? 正確的答案是:應(yīng)當從匹配結(jié)果中選擇最長網(wǎng)絡(luò)前綴的路由。這叫做最長前綴匹配,這是因為網(wǎng)絡(luò)前綴越長,其地址塊就越小,因而路由就越具體。最長前綴匹配又稱為最長匹配或最佳匹配。 7.4 因特網(wǎng)控制報文協(xié)議ICMP為了提高IP數(shù)據(jù)報交付成功的機會,在國際層使用了因特網(wǎng)控制報文協(xié)議ICMP。ICMP允許主機或路由器報告差錯情況和提供有關(guān)異常情況的報告。ICMP是因特網(wǎng)的標準協(xié)議。但ICMP不是高層協(xié)議,而是IP層的協(xié)議。ICMP報文作為IP層數(shù)據(jù)報的數(shù)據(jù),加上數(shù)據(jù)報的首部,組成IP數(shù)據(jù)報發(fā)送出去。ICMP報文如圖7-21所示。 ICMP報文的種類有兩種,即ICMP差錯報告報文和ICMP詢問報文。 ICMP報文的前4個字節(jié)是統(tǒng)一的格式,共有3個字段,即類型、代碼和檢驗和。接著的4個字節(jié)的內(nèi)容與ICMP的類型有關(guān)。最后面是數(shù)據(jù)字段,其長度取決于ICMP的類型。 ICMP報文的代碼字段是為了進一步區(qū)分某種類型中的幾種不同的情況。檢驗和字段用來檢驗整個ICMP報文。讀者應(yīng)當還記得,IP數(shù)據(jù)報首部的檢驗和并不檢驗IP數(shù)據(jù)報的內(nèi)容,因此不能保證經(jīng)過傳輸ICMP報文不產(chǎn)生差錯。 圖7-21 ICMP報文
ICMP差錯報告報文共有以下5種。 (1)終點不可達 當路由器或主機不能交付數(shù)據(jù)報時就向源站發(fā)送終點不可達報文。 (2) 源站抑制 當路由器或主機由于擁塞而丟棄該數(shù)據(jù)報時,就向源站發(fā)送源站抑制報文,使源站知道應(yīng)當將數(shù)據(jù)報的發(fā)送速率放慢。 (3)時間超過 當路由器收到生存時間為零的數(shù)據(jù)報時,除丟棄數(shù)據(jù)報外,還要向源站發(fā)送時間超過報文。當目的站在預(yù)先規(guī)定的時間內(nèi)不能收到一個數(shù)據(jù)報的全部數(shù)據(jù)報片時,就把已收到的數(shù)據(jù)片都丟棄,并向源站發(fā)送時間超過報文。 (4)參數(shù)問題 當路由器或目的主機收到的數(shù)據(jù)報的首部中,有的字段的值不正確時,就丟棄該數(shù)據(jù)報,并向源站發(fā)送參數(shù)問題報文。 (5)改變路由(重定向) 路由器把改變路由報文發(fā)送給主機,讓主機知道下次應(yīng)將數(shù)據(jù)報發(fā)送給另外的路由器(可通過更好的路由)。 下面對改變路由報文進行簡短的解釋。我們知道,在因特網(wǎng)的主機中也要有一個路由表。當主機要發(fā)送數(shù)據(jù)報時,首先是查找主機自己的路由表,看應(yīng)當從哪一個接口把數(shù)據(jù)報發(fā)送出去。在因特網(wǎng)中主機的數(shù)量遠大于路由器的數(shù)量,出于效率的考慮,這些主機的路由表一般都采用人工配置,并且主機不和連接在網(wǎng)絡(luò)上的路由器定期交換路由信息。在主機剛開始工作時,一般都在路由表中設(shè)置一個默認路由器的IP地址。不管數(shù)據(jù)報要發(fā)送到哪個目的地址,都一律先將數(shù)據(jù)報傳送給網(wǎng)絡(luò)上的這個默認路由器,而這個默認路由器知道每一個目的網(wǎng)絡(luò)上的最佳路由(通過和其他路由器交換路由信息)。如果默認路由器發(fā)現(xiàn)主機發(fā)往某個目的地址的數(shù)據(jù)報的最佳路由不應(yīng)當經(jīng)過默認路由器,而是應(yīng)當經(jīng)過網(wǎng)絡(luò)上的另一個路由器R時,就用改變路由報文把這情況告訴主機。于是,該主機就在其路由表中增加一個項目:到某某目的地址應(yīng)經(jīng)過路由器R(而不是默認路由器)。 所有的ICMP差錯報告報文中的數(shù)據(jù)字段都有同樣的格式,如圖7-22所示。把收到的需要進行差錯報告的IP數(shù)據(jù)報的首部和數(shù)據(jù)字段的前8個字節(jié)提取出來,作為ICMP報文的數(shù)據(jù)字段。再加上相應(yīng)的ICMP差錯報告報文的前8個字節(jié),就構(gòu)成了ICMP差錯報告報文。提取收到的數(shù)據(jù)報的數(shù)據(jù)字段的前8個字節(jié)是為了得到運輸層的端口號(對于TCP和UDP)以及運輸層報文的發(fā)送序號(對于TCP)。這些信息對源站通知高層協(xié)議是有用的(端口的作用將在8、2、2節(jié)介紹)。整個ICMP報文作為IP數(shù)據(jù)報的數(shù)據(jù)字段發(fā)送給源站。 圖 7-22 ICMP差錯報告報文的數(shù)據(jù)字段的內(nèi)容
下面是不應(yīng)發(fā)送ICMP差錯報告報文的幾種情況。 對ICMP差錯報告報文不再發(fā)送ICMP差錯報告報文。 對第一個分片的數(shù)據(jù)報片的所有后續(xù)數(shù)據(jù)報片都不發(fā)送ICMP差錯報告報文。 對具有多播地址的數(shù)據(jù)報都不發(fā)送ICMP差錯報告報文。 對具有特殊地址(如127.0.0.1或0.0.0.0)的數(shù)據(jù)報不發(fā)送ICMP差錯報告報文。 ICMP詢問報文有4種,即回送請求和回答、時間戳請求和回答、掩碼地址請求和回答,以及路由器詢問和通告。 ICMP回送請求報文是由主機或路由器向一個特定的目的主機發(fā)出的詢問。收到此報文的機器必須給源主機發(fā)送ICMP回送回答報文。這種詢問報文用來測試目的站是否可達以及了解其有關(guān)狀態(tài)。在應(yīng)用層有一個很常用的服務(wù)叫做PING,用來測試兩個主機之間的連通性。PING使用了ICMP回送請求與回送回答報文。PING是應(yīng)用層直接使用網(wǎng)絡(luò)層ICMP的一個例子。它沒有通過運輸層的TCP或UDP。 ICMP時間戳請求報文是請某個主機或路由器回答當前的日期和時間。在ICMP時間戳回答報文中有一個32位的字段,其中寫入的整數(shù)代表從1990年1月1日起到當前時刻一共有多少秒。時間戳請求與回答可用來進行時鐘同步和測量時間。 主機使用ICMP地址掩碼請求報文可向子網(wǎng)掩碼服務(wù)器得到某個接口的地址掩碼。 主機使用ICMP路由器詢問和通告報文可了解連接在本網(wǎng)絡(luò)上的路由器是否正常工作。主機將路由器詢問報文廣播(或多播)。收到詢問報文的一個或幾個路由器就使用路由器通告報文廣播其路由選擇信息。 7.5 因特網(wǎng)的路由選擇協(xié)議本節(jié)將討論幾種常用的路由選擇協(xié)議,也就是要討論路由表中的路由是怎樣得出的。 7.5.1 有關(guān)路由選擇協(xié)議的幾個基本概念1、理想的路由算法 路由選擇協(xié)議的核心就是路由算法,即需要何種算法獲得路由表中的各項目。一個理想的路由算法應(yīng)具有如下一些特點。 (1)算法必須是正確的和完整的。這里,“正確”的含義是:沿著各路由表所指引的路由,分組一定能夠最終到達目的網(wǎng)絡(luò)和目的主機。 (2)算法在計算上就簡單。進行路由選擇的計算必然要增加分組的時延。因此,路由選擇的計算不應(yīng)使網(wǎng)絡(luò)通信量增加太多的額外開銷。若為了計算合適的路由必須使用網(wǎng)絡(luò)其他路由器發(fā)來的大量狀態(tài)信息時,開銷就會過大。 (3)算法應(yīng)能適應(yīng)通信量和網(wǎng)絡(luò)拓撲的變化,這就是說,要有自適應(yīng)性。當網(wǎng)絡(luò)中的通信量發(fā)生變化時,算法能自適應(yīng)地改變路由以均衡各鏈路的負載。當某個或某個結(jié)點、鏈路發(fā)生故障不能工作,或者修理好了再投入運行時,算法也能及時地改變路由。有時稱這種自適應(yīng)性為“穩(wěn)健性”。 (4)算法應(yīng)具有穩(wěn)定性。在網(wǎng)絡(luò)通信量和網(wǎng)絡(luò)拓撲相對穩(wěn)定的情況下,路由算法應(yīng)收斂于一個可以接受的解,而不應(yīng)使得出的路由不停的變化。 (5)算法應(yīng)是公平的。這就是說,算法應(yīng)對所有用戶(除對少數(shù)優(yōu)先級高的用戶)都是平等的。例如,若使某一對用戶的端到端時延為最小,但卻不考慮其他的廣大用戶,這就明顯不符合公平性原則的要求。 (6)算法應(yīng)是最佳的。這里的“最佳”是指以最低的代價來實現(xiàn)路由算法。這里特別需要注意的是,在研究路由選擇時,需要給每一條鏈路指明一定的代價,而這里“代價”并不是指“錢”,而是一個或幾個因素綜合決定的一種度量,如鏈路長度、數(shù)據(jù)傳輸速率、鏈路容量、是否要保密、傳播時延等,甚至還可以是一天中某一個小時內(nèi)的通信量、結(jié)點的緩存被占用的程度、鏈路差錯率等。可以根據(jù)用戶的具體情況來設(shè)置每一條鏈路的“代價”。由此可見,不存在一種絕對的最佳路由算法。所謂“最佳”只能是相對于某一種特定要求下得出的較為合理的選擇而已。 一個實際的路由選擇算法,應(yīng)盡可能接近理想的算法。在不同的應(yīng)用條件下,對以上提出的6個方面也可有不同的側(cè)重。 應(yīng)當指出,路由選擇是個非常復(fù)雜的問題,因為它是網(wǎng)絡(luò)中的所有結(jié)點共同協(xié)調(diào)工作的結(jié)果。其次,路由選擇的環(huán)境往往是不斷變化的,而這種變化有時無法事先知道,例如,網(wǎng)絡(luò)中出了某些故障。此外當網(wǎng)絡(luò)發(fā)生擁塞時,就特別需要有能緩解這種擁塞的路由選擇策略,但恰好在這種條件下,很難從網(wǎng)絡(luò)中的各結(jié)點獲得所需的路由選擇信息。 倘若從路由算法能否隨網(wǎng)絡(luò)的通信量或拓撲自適應(yīng)地進行調(diào)整變化來劃分,則只有兩大類,即靜態(tài)路由選擇選擇策略與動態(tài)路由選擇策略,。靜態(tài)路由選擇也叫做非自適應(yīng)路由選擇,其特點是簡單和開銷較小,但不能及時適應(yīng)網(wǎng)絡(luò)狀態(tài)的變化。動態(tài)路由選擇也叫做自適應(yīng)路由選擇,其特點是能較好地適應(yīng)網(wǎng)絡(luò)狀態(tài)的變化,但實現(xiàn)起來較為復(fù)雜,開銷也比較大。 2、分層次的路由選擇協(xié)議 因特網(wǎng)采用的路由選擇協(xié)議主要是自適應(yīng)的(即動態(tài)的)、分布式路由選擇協(xié)議。由于以下兩個原因,因特網(wǎng)采用分層次的路由選擇協(xié)議。 (1)因特網(wǎng)的規(guī)模非常大,現(xiàn)在就已經(jīng)有幾百萬個路由器互連在一起。如果讓所有的路由器知道所有的網(wǎng)絡(luò)應(yīng)怎樣到達,則這種路由表將非常大,處理起來也太費時間。而所有這些路由器之間交換路由信息所需的帶寬就會使因特網(wǎng)的通信鏈路飽和。 (2)許多單位不愿意外界了解自己單位網(wǎng)絡(luò)的布局細節(jié)和本部門所采用的路由選擇協(xié)議(這屬于本部門內(nèi)部的事情),但同時希望連接到因特網(wǎng)上。 為此,因特網(wǎng)將互聯(lián)網(wǎng)劃分為許多較小的自治系統(tǒng),一般簡稱為AS。一個自治系統(tǒng)是一組互連起來的IP前綴(一個或多個前綴),由一個或多個網(wǎng)絡(luò)管理員負責其運行,但更重要的特點就是每一個自治系統(tǒng)有一個單一的和明確定義的路由選擇策略。[RFC1930]。這樣,因特網(wǎng)就把路由選擇協(xié)議劃分為以下兩大類。 (1)內(nèi)部網(wǎng)關(guān)協(xié)議IGP,即在一個自治系統(tǒng)內(nèi)部使用的路由選擇協(xié)議,而這與在互聯(lián)網(wǎng)中的其他自治系統(tǒng)選用什么路由選擇協(xié)議無關(guān)。目前,這類路由選擇協(xié)議使用最多,如RIP和OSP協(xié)議。 (2)外部網(wǎng)關(guān)協(xié)議EGP,若源點和終點處在不同的自治系統(tǒng)中(這兩個自治系統(tǒng)使用不同的內(nèi)部網(wǎng)關(guān)協(xié)議),當數(shù)據(jù)報傳到另一個自治系統(tǒng)中。這樣的協(xié)議就是外部網(wǎng)關(guān)協(xié)議EGP。目前,在外部網(wǎng)關(guān)協(xié)議中使用最多的是BGP-4。 自治系統(tǒng)之間的路由選擇也叫做域間路由選擇,而在自治系統(tǒng)內(nèi)部的路由選擇叫做域內(nèi)路由選擇。 如圖7-23所示,為3個自治系統(tǒng)互連在一起的示意圖,在自治系統(tǒng)內(nèi)各路由器之間的網(wǎng)絡(luò)就省略了,而用一條鏈路表示路由器之間的網(wǎng)絡(luò)。每個自治系統(tǒng)運行本自治系統(tǒng)的內(nèi)部路由選擇協(xié)議IGP,但每個自治系統(tǒng)都有一個或多個路由器,除運行本系統(tǒng)的內(nèi)部路由選擇協(xié)議外,還運行自治系統(tǒng)間的路由選擇協(xié)議EGP。在圖7-23中,能運行自治系統(tǒng)間的路由選擇協(xié)議的有R1,R2和R3 3個路由器。在圖中將這類路由器畫得稍大些以示區(qū)別。假定圖中自治系統(tǒng)A的主機H1要向自治系統(tǒng)B的主機H2發(fā)送數(shù)據(jù)報,那么在各自治系統(tǒng)內(nèi)使用的是各自的內(nèi)部網(wǎng)關(guān)協(xié)議IGP(例如,分別使用RIP和OSPF),而在路由器R1和R2之間則必須使用外部網(wǎng)關(guān)協(xié)議EGP(例如,使用BGP-4)。 圖7-23 自治系統(tǒng)和內(nèi)部網(wǎng)關(guān)協(xié)議、外部網(wǎng)關(guān)協(xié)議 這里我們要指出兩點。 (1)因特網(wǎng)的早期RFC文檔中未使用“路由器”,而是使用“網(wǎng)關(guān)”這一名詞。但是,在新的RFC文檔中又使用了“路由器”這一名詞,因此有的書把IGP和EGP分別改為IRP和ERP。為了方便讀者查閱RFC文檔,本書仍使用RFC原先使用的名字。 (2)RFC采用的這兩個名詞IGP和EGP是協(xié)議類別的名稱。但RFC在使用EGP這個名詞時出現(xiàn)了一點混亂,因為最早的一個外部網(wǎng)關(guān)協(xié)議的協(xié)議名字正好也是EGP。后來發(fā)現(xiàn)該RFC提出的EGP有不少缺點,就設(shè)計了一種更好的外部網(wǎng)關(guān)協(xié)議,叫做邊界網(wǎng)關(guān)協(xié)議BGP,用來取代舊的RFC827外部網(wǎng)關(guān)協(xié)議EGP。實際上,舊的協(xié)議EGP和新的協(xié)議BGP都屬于外部網(wǎng)關(guān)協(xié)議EGP這一類別。因此,在遇到名詞EGP時,應(yīng)弄清它是指舊的RFC827協(xié)議EGP,還是指外部網(wǎng)關(guān)協(xié)議EGP這個類別。 總之,使用分層次的路由選擇方法,可將因特網(wǎng)的路由選擇協(xié)議劃分為: 內(nèi)部網(wǎng)關(guān)協(xié)議IGP:具體的協(xié)議有多種,如RIP和OSPF等。 外部網(wǎng)關(guān)協(xié)議EGP:目前使用的協(xié)議就是BGP-4。
對于比較大的自治系統(tǒng),還可將所有的網(wǎng)絡(luò)再進行一次劃分。例如,可以構(gòu)筑一個鏈路速率較高的主干網(wǎng)和許多速率較低的區(qū)域網(wǎng)。每個區(qū)域網(wǎng)通過路由器連接到主干網(wǎng)。在一個區(qū)域內(nèi)找不到目的站時,就通過路由器經(jīng)過主干網(wǎng)到達另一個區(qū)域網(wǎng),或者通過外部路由器到別的自治系統(tǒng)中去查找。下面對這兩類協(xié)議分別進行介紹。 7.5.2 內(nèi)部網(wǎng)關(guān)協(xié)議RIP路由信息協(xié)議RIP是內(nèi)部網(wǎng)關(guān)協(xié)議IGP中最先得到廣泛使用的協(xié)議。RIP是一種分布式的基于距離向量的路由選擇協(xié)議,是因特網(wǎng)的標準協(xié)議,其最大優(yōu)點就是簡單。 RIP要求網(wǎng)絡(luò)中的每一個路由器都要維護從它自己到其他每一個目的網(wǎng)絡(luò)的距離記錄。RIP將“距離”定義如下。 從一路由器到直接連連的網(wǎng)絡(luò)的距離定義為1。從一路由器到直接連接的網(wǎng)絡(luò)的距離定義為所經(jīng)過的路由器數(shù)加1。“加1”是因為到達目的網(wǎng)絡(luò)后就進行直接交付,而到直接連接的網(wǎng)絡(luò)的距離已經(jīng)定義為1。 RIP的距離也稱為“跳數(shù)”,因為每經(jīng)過一個路由器,跳數(shù)就加1。RIP認為一個好的路由就是它通過的路由器的數(shù)目少,即“距離短”。RIP允許一條路徑最多只能包含15個路由器。因此,“距離”的最大值為16時即相當于不可達??梢姡?/span>RIP只適用于小型互聯(lián)網(wǎng)。 需要注意的是,到直接連接的網(wǎng)絡(luò)的距離也可定義為0(采用這種定義的理由是:路由器在和直接連接在該網(wǎng)絡(luò)上的主機通信時不需要經(jīng)過另外的路由器,。既然每經(jīng)過一個路由器要將距離加1,那么不再經(jīng)過路由器的距離就應(yīng)當為零)。本書的其他版本也曾使用過這種定義。但兩種不同的定義對實現(xiàn)RIP并無影響,因為重要的是要找出最短距離,把所有的距離都加1或都江堰市減1,對選擇最佳路由都是一樣的。 RIP不能在兩個網(wǎng)絡(luò)之間同時使用多條路由。RIP選擇一條具有最少路由器的路由,哪怕還存在另一條高速但路由器較多的路由。 本節(jié)討論的RIP和下一節(jié)要討論的OSPF協(xié)議都是分布式路由選擇協(xié)議。它們的共同特點就是每一個路由器都要不斷地和其他一些路由器交換路由信息。讀者一定要弄清以下3個要點,即和哪些路由器交換信息?交換什么信息?在什么時候交換信息? (1)僅和相鄰路由器交換信息。兩個路由器是相鄰的,如果它們之間的通信不需要經(jīng)過另一個路由器。換言之,兩個相鄰路由器在同一個網(wǎng)絡(luò)上都有自己的接口。RIP規(guī)定,不相鄰的路由器不交換信息。 (2)交換的信息是當前本路由器所知道的全部信息,即自己的路由表。因此,交換的信息就是:“到本自治系統(tǒng)中所有網(wǎng)絡(luò)的最短距離,以及到每個網(wǎng)絡(luò)應(yīng)經(jīng)過的下一跳路由器”。至于本路由怎樣獲得這些信息以及路由表是否完整,都是不重要的。 (3)按固定的時間間隔交換路由信息,例如,每隔30秒。然后路由器根據(jù)收到的路由信息更新路由表。當網(wǎng)絡(luò)拓撲發(fā)生變化時,路由器也及時向相鄰路由器通告拓撲變化后的路由信息。 這里要強調(diào)一點:路由器在剛剛開始工作時,只知道到直接連接的網(wǎng)絡(luò)的距離。以后,每一個路由器也中和數(shù)目非常有限的相鄰路由器交換并更新路由信息。但經(jīng)過若干次更新后,所有的路由器最終都會知道到達本自治系統(tǒng)中任何一個網(wǎng)絡(luò)的最短距離和下一跳路由器的地址??雌饋?/span>RIP有些奇怪,因為“我的路由表中的信息要依賴于你的,現(xiàn)時你的信息又依賴于我的。”然而事實證明,RIP的收斂過程較快,。所謂收斂就是在自治系統(tǒng)中所有的結(jié)點都得到正確的路由選擇信息的過程。 路由表中最主要的信息就是:到某個網(wǎng)絡(luò)的距離(即最短距離),以及應(yīng)經(jīng)過的下一跳地址。路由表更新的原則是找出到每個目的網(wǎng)絡(luò)的最短距離。這種更新算法又稱為距離向量算法 。下面就是RIP使用的距離向量算法。 2、距離向量算法 收到相鄰路由器(其地址為X)的一個RIP報文: (1)先修改RIP報文中的所有項目:把“下一跳”字段中的地址都改為X,并把所有的“距離”字段的值加1。 (2)對修改后的RIP報文中的每一個項目,重復(fù)以下步驟: 若項目中的目的網(wǎng)絡(luò)不在路由表中,則把該項目添加到路由表中。否則,若下一跳字段給出的路由器地址是同樣的,則把收到的項目替換原路由表中的項目。否則,若收到的項目中的距離小于路由表中的距離,則進行更新,否則什么也不做。 (3)若3分鐘還沒有收到相鄰路由器的更新路由表,則把此相鄰路由器記為不可達的路由器,即將距離設(shè)置為16。 (4)返回。 上面給出的距離向量算法的基礎(chǔ)就是Bellman-ford算法。這種算法的要點是這樣的:高X結(jié)點A到B的最短路徑上的一個結(jié)點。若將路徑A到B拆成兩段路徑A到X和X到B,則每一段路徑A到X和X到B也都分別是結(jié)點A到X和結(jié)點X到B的最短路徑。 下面是對上述距離向量算法的4點解釋。 解釋1:這樣做是為了便于進行本路由表的更新。設(shè)從位于地址X的相鄰路由器發(fā)來的RIP報文的某一個項目是:“NET2,3,Y”,意思是“我到網(wǎng)絡(luò)NET2的距離是3,要經(jīng)過的下一跳路由器的地址是Y”,那么本路由器就可推斷出:“若我將下一跳路由器先為在地址X的路由器,則我到網(wǎng)絡(luò)NET2的距離應(yīng)為3+1=4”。于是,本路由器就將收到的RIP報文的這一個項目修改為“NET2,4,X”,以便下一步進行比較時使用。讀者可能已經(jīng)注意到,收到的項目中的Y對本路由器是沒有用的,因為Y不是本路由器的路由的下一跳路由器地址。 解釋2:表明這是新的目的網(wǎng)絡(luò),應(yīng)當加入到路由表中,例如 ,本路由表中沒有到目的網(wǎng)絡(luò)NET2的路由,那么在路由表中就要加入新的項目“NET2,4,X”。 解釋3:為什么要替換呢?因為這是最新的消息,要以最新的消息為準。到目的網(wǎng)絡(luò)的距離有可能增大或減小,但也可能沒有變。例如 ,不管原來路由表中的項目是“NET2,3,X”還是“NET2,5,X”,都要更新為現(xiàn)在的“NET2,4,X”。 解釋4:例如,若路由表中已有項目“NET2,5,P”,就要更新為“NET2,4,X”。因為更新后到網(wǎng)絡(luò)NET2的距離更短了(從5減到4)。 RIP讓互聯(lián)網(wǎng)中的所有路由器都和自己的相鄰路由器不斷交換信息,并不斷更新其路由表,使得從每一個路由器到每一個目的網(wǎng)絡(luò)的路由都是最短的。這里讀者還應(yīng)注意,雖然所有的路由器最終都擁有了整個自治系統(tǒng)的全局路由信息,但由于每一個路由器的位置不同,它們的路由表當然也應(yīng)當是不同的。 RIP使用運輸層的用戶數(shù)據(jù)報UDP進行傳送。因此,RIP的位置應(yīng)當在應(yīng)用層。但轉(zhuǎn)發(fā)IP數(shù)據(jù)報的過程是在網(wǎng)絡(luò)層完成的。這里請讀者注意,當路由器轉(zhuǎn)發(fā)在主機之間傳送的數(shù)據(jù)報時,它的協(xié)議只有三層,而沒有運輸層和應(yīng)用層。但路由器之間在交換路由信息時,兩個路由器又相當于兩個主機在通信,因此這時的路由器可以有運輸層的應(yīng)用層。因此,我們不能籠統(tǒng)地認為,路由器不定一定沒有運輸層和應(yīng)用層。 現(xiàn)在較新的RIP版本是1998年11月公布的RIP2[RFC2453],新版本協(xié)議本身并無多大變化,但性能上有些改進。RIP2可以支持變長子網(wǎng)掩碼和CIDR。此外,RIP2還提供簡單的鑒別過程支持多播。 RIP存在的一個問題是當網(wǎng)絡(luò)出現(xiàn)故障時,要經(jīng)過比較長的時間才能將此信息傳送到所有的路由器。 總之,RIP最大的優(yōu)點就是實現(xiàn)簡單,開銷較小。但RIP 缺點也較多。首先,RIP限制了網(wǎng)絡(luò)的規(guī)模,它能使用的最大距離為15。其次,路由器之間交換的路由信息是路由器中的完整路由表,因而隨著網(wǎng)絡(luò)規(guī)模的擴大,開銷也就增加。最后,“壞消息傳播的慢”,使更新過程的收斂時間過長。因此,對于規(guī)模較大的網(wǎng)絡(luò)就應(yīng)當使用下一節(jié)所述的OSPF協(xié)議。然而,目前在規(guī)模較小的網(wǎng)絡(luò)中,使用RIP的仍占多數(shù)。 7.5.3 內(nèi)部網(wǎng)關(guān)協(xié)議OSPF1、OSPF協(xié)議的基本特點 這個協(xié)議的名字是開放最短路徑優(yōu)先OSPF。它是為克服RIP的缺點在1989年開發(fā)出來的。OSPF的原理很簡單,但實現(xiàn)起來卻較復(fù)雜。“開放”表明OSPF協(xié)議不是愛某一家廠商控制,而是公開發(fā)表的。“最短路徑優(yōu)先”是因為使用了Dijkstra提出的最短路徑算法SPF。OSPF的第二個版本OSPF2已成為因特網(wǎng)標準協(xié)議。 請讀者注意,OSPF只是一個協(xié)議的名字,它并不表示其他的路由選擇協(xié)議不是“最短路徑優(yōu)先”。實際上,所有的在自治系統(tǒng)內(nèi)部使用的路由選擇協(xié)議都是要尋找一條最短的路徑。 OSPF是主要的特征就是使用分布式的鏈路狀態(tài)協(xié)議,而不是像RIP那樣的距離向量協(xié)議。和RIP相比,OSPF的3個要點和RIP的都不樣。 (1)向本自治系統(tǒng)中所有路由器發(fā)送消息。這里使用的方法是洪泛法,這就是路由器通過所有輸出端口向所有相鄰的路由器發(fā)送信息。而每一個相鄰路由器又再把這個信息發(fā)往其所有的相鄰路由器。這樣,最終整個區(qū)域中所有的路由器都得到了這個信息的一個副本。更具體的做法在后面還要討論。 (2)發(fā)送的信息就是與本路由器相鄰的所有路由器的鏈路狀態(tài),但這只是路由器所知道的部分信息。所謂“鏈路狀態(tài)”就是說明本路由器都和哪些路由器相鄰,以及該鏈路的“度量”。OSPF將這個“度量”用來表示費用、距離、時延、帶寬等。這些都由網(wǎng)絡(luò)管理人員來決定,因此較為靈活。有時為了方便就稱這個度量為“代價”。 (3)只有當鏈路狀態(tài)發(fā)生變化時,路由器才用洪泛法向所有路由器發(fā)送此信息(而RIP不管網(wǎng)絡(luò)拓撲有無發(fā)生變化,路由器之間都要定期交換路由表的信息)。 從上述的3個方面可以看出,OSPF和RIP的工作原理相差較大。 因為各路由器之間頻繁地交換鏈路狀態(tài)信息,所以,所有的路由器最終都能建立一個鏈路狀態(tài)數(shù)據(jù)庫,這個數(shù)據(jù)庫實際上就是全網(wǎng)的拓撲結(jié)構(gòu)圖。這個拓撲結(jié)構(gòu)圖在全網(wǎng)范圍內(nèi)是一致的(這稱為鏈路狀態(tài)數(shù)據(jù)庫的同步)。因此,每一個路由器使用鏈路狀態(tài)數(shù)據(jù)庫中的數(shù)據(jù),構(gòu)造出自己的路由表,因而能查出到每一個目的網(wǎng)絡(luò)應(yīng)當走哪條路徑。但RIP的每一個路由器雖然知道所有的網(wǎng)絡(luò)的距離以及下一跳路由器,但卻不知道全網(wǎng)的拓撲結(jié)構(gòu)。而是只有到了下一跳路由器,才能知道再下一跳應(yīng)當怎樣走。 OSPF的鏈路狀態(tài)數(shù)據(jù)庫能較快地進行更新,使各個路由器能及時更新其路由表。OSPF的更新過程收斂得快是其主要優(yōu)點。 為了使OSPF能夠用于規(guī)模很大的網(wǎng)絡(luò),OSPF將一個自治系統(tǒng)再劃分為若干個更小的范圍,叫做區(qū)域。 為了使得OSPF能夠用于規(guī)模很大的網(wǎng)絡(luò),OSPF將一個自治系統(tǒng)再劃分為若干個更小的范圍,叫做區(qū)域。圖7-24就表示一個自治系統(tǒng)劃分為4個區(qū)域。每一個區(qū)域都有一個32位的區(qū)域標識符(用點分十進制表示)。當然,一個區(qū)域也不能太大,在一個區(qū)域內(nèi)的路由器最好不超過200個。 圖7-24 OSPF劃分為兩種不同的區(qū)域
劃分區(qū)域的好處就是將利用洪泛法交換鏈路狀態(tài)信息的范圍局限于每一個區(qū)域而不是整個的自治系統(tǒng),這就減少了整個網(wǎng)絡(luò)上的通信量。在一個區(qū)域內(nèi)部的路由器只知道本區(qū)域的完整網(wǎng)絡(luò)拓撲,而不知道其他區(qū)域的網(wǎng)絡(luò)拓撲的情況。 為了使每一個區(qū)域能夠和本區(qū)域進行通信,OSPF使用層次結(jié)構(gòu)的區(qū)域劃分。在上層的區(qū)域叫做主干區(qū)域。主干區(qū)域的標識符規(guī)定為0.0.0.0。主干區(qū)域的作用是來連通其他在下層的區(qū)域。從其他區(qū)域來的信息都由區(qū)域邊界路由器進行概括。 采用分層次劃分區(qū)域不僅使交換信息的種類增多了,而且也使OSPF協(xié)議更加復(fù)雜了。但這樣做卻能使每一個區(qū)域內(nèi)部交換路由信息的通信量大大減小,因而使OSPF協(xié)議能夠用于規(guī)模很大的自治系統(tǒng)中。這里我們再一次看到劃分層次在網(wǎng)絡(luò)設(shè)計中的重要性。 OSPF不用UDP而是直接用IP數(shù)據(jù)報傳送,可見,OSPF的位置在網(wǎng)絡(luò)層。OSPF構(gòu)成的數(shù)據(jù)報很短。這樣做可減少路由信息的通信量。數(shù)據(jù)報很短的另一個好處是可以不必將長的數(shù)據(jù)報分片傳送。分片傳送的數(shù)據(jù)報只要丟失一個,就無法組裝成原來的數(shù)據(jù)報,而整個數(shù)據(jù)報就必須重傳。 除了以上幾個基本特點外,OSPF還具有下列一些特點。 (1)OSPF對不同的鏈路可根據(jù)IP分組的不同服務(wù)類型TOS而設(shè)置成不同的代價。例如,高帶寬的衛(wèi)星鏈路對于非實時的業(yè)務(wù)可設(shè)置為較低的代價,但對于時延敏感的業(yè)務(wù)就可設(shè)置為非常高的代價。因此,OSPF對于不同類型的業(yè)務(wù)可計算出不同的路由。鏈路的代價可以是1~65535中的任何一個無量綱的數(shù),因此十分靈活。商用的OSPF實現(xiàn)通常是根據(jù)鏈路帶寬來計算鏈路的代價。這種靈活性是RIP所沒有的。 (2)如果到同一個目的網(wǎng)絡(luò)有多條相同代價的路徑,那么可以將通信量分配給這幾條路徑。這叫做多路徑間的負載平衡(load balancing)。在代價相同的多條路徑上分配通信量是通信量工程中的簡單形式。RIP只能找出到某個網(wǎng)絡(luò)的一條路徑。 (3)所有的OSPF路由器之間交換的分組(例如,鏈路狀態(tài)更新分組)都具有鑒別的功能,因而保證了僅在可信賴的路由器之間交換鏈路狀態(tài)信息。 (4)OSPF支持可變長度的子網(wǎng)劃分和無分類的編址CIDR。 (5)因為網(wǎng)絡(luò)中的鏈路狀態(tài)可能經(jīng)常發(fā)生變化,所以,OSPF讓每一個鏈路狀態(tài)都帶上一個32位的序號,序號越大狀態(tài)就越新。OSPF規(guī)定,鏈路狀態(tài)序號增長的速率不得超過每5秒鐘1次。這樣,全部序號空間在600年內(nèi)不會產(chǎn)生重復(fù)號。 2.OSPF的5種分組類型。 (1)類型1,問候(Hello)分組,用來發(fā)現(xiàn)和維持鄰站的達性。 (2)類型2,數(shù)據(jù)庫描述(Database Description)分組,向鄰站給出自己的鏈路狀態(tài)數(shù)據(jù)庫中的所有狀態(tài)項目的摘要信息。 (3)類型3,鏈路狀態(tài)請求(Link State Request)分組,向?qū)Ψ秸埱蟀l(fā)送某些鏈路狀態(tài)項目的詳細信息。 (4)類型4,鏈路狀態(tài)更新(Link State Update)分組,用洪泛法對全網(wǎng)更新鏈路狀態(tài)。這種分組是最復(fù)雜的,也是OSPF協(xié)議最核心的部分。路由器使用這種分組將其鏈路狀態(tài)通知給鄰站。鏈路狀態(tài)更新分組共有5種不同的鏈路狀態(tài),這里從略。 (5)類型5,鏈路狀態(tài)確認(Link State Acknowledgment)分組,對鏈路更新分組的確認。 OSPF規(guī)定,每兩個相鄰路由器每隔10秒鐘要交換一次問候分組,這樣就能確信知道哪些鄰站可達的。對相鄰路由器來說,“可達”是最基本的要求,因為只有可達鄰站的鏈路狀態(tài)信息才存入鏈路狀態(tài)數(shù)據(jù)庫(路由表就是根據(jù)鏈路狀態(tài)數(shù)據(jù)庫計算出來的)。在正常情況下,網(wǎng)絡(luò)中傳送的絕大多數(shù)OSPF分組都是問候分組。若有40秒鐘沒有收到某個相鄰路由器發(fā)來的問候分組,則可認為該相鄰路由器是不可達的,應(yīng)立即修改鏈路狀態(tài)數(shù)據(jù)庫,并重新計算路由表。 其他的4種分組都是用來進行鏈路狀態(tài)數(shù)據(jù)庫的同步。所謂同步,就是指不同路由器的鏈路狀態(tài)數(shù)據(jù)庫的內(nèi)容是一樣的。兩個同步的路由器叫做“完全鄰接的”路由器。不是完全鄰接的路由器表明它們雖然在物理上是相鄰的,但其鏈路狀態(tài)數(shù)據(jù)庫并沒有達到一致。 當一個路由器剛開始工作時,它只能通過問候分組得知它有哪些相鄰的路由器在工作,以及將數(shù)據(jù)發(fā)往相鄰路由器所需的“代價”。如果所有的路由器都把自己的本地鏈路狀態(tài)信息(以及其序號)已經(jīng)寫入了數(shù)據(jù)庫。經(jīng)過與相鄰路由器交換數(shù)據(jù)庫描述分組后,路由器就使用鏈路狀態(tài)請求分組,向?qū)Ψ秸埱蟀l(fā)送自己所缺少的某些鏈路狀態(tài)項目的詳細信息。通過一系列的這種分組交換,全網(wǎng)同步的鏈路數(shù)據(jù)庫就建立了。 在網(wǎng)絡(luò)運行的過程中,只要一個路由器的鏈路狀態(tài)發(fā)生變化,該路由器就要使用鏈路狀態(tài)更新分組,用洪泛法向全網(wǎng)更新鏈路新狀態(tài)。OSPF使用的是可靠的洪泛法。其要點如圖7-25所示。設(shè)路由器R用洪泛法發(fā)出鏈路狀態(tài)更新分組。圖中用一些小的箭頭表示更新分組。第一次先發(fā)給相鄰的三個路由器。這三個路由器將收到的分組在進行轉(zhuǎn)發(fā)時,要將其上游路由器除外??煽康暮榉悍ㄊ窃谑盏礁路纸M后要發(fā)送確認。確認的發(fā)送故意遲延一些 時間,為的是希望可以少發(fā)送幾個確認分組。圖中的空心箭頭表示確認分組。
圖7-25 用可靠泛洪法發(fā)送更新分組 為了確保鏈路狀態(tài)數(shù)據(jù)庫與全網(wǎng)的狀態(tài)保持一致,還規(guī)定每隔一段時間,如30分鐘,要刷新一次數(shù)據(jù)庫中的鏈路狀態(tài)。 由于一個路由器的鏈路狀態(tài)只涉及與相鄰路由器的連通狀態(tài),因而與整個互聯(lián)網(wǎng)的規(guī)模并無直接關(guān)系。因此當互連網(wǎng)規(guī)模很大時,OSPF協(xié)議要比距離向量協(xié)議RIP好得多。由于OSPF沒有“壞消息傳播得慢”的問題,據(jù)統(tǒng)計,其響應(yīng)網(wǎng)絡(luò)變化的時間小于100ms。 若N個路由器連接在一個以太網(wǎng)上,則每個路由器要向其他(N—1)個路由器發(fā)送鏈路狀態(tài)信息,因而共有N(N—1)個鏈路狀態(tài)要在這個以太網(wǎng)上傳送。OSPF協(xié)議對這種多點接入的局域網(wǎng)采用了指定的路由器的方法,使廣播的信息量大大減少。指定的路由器代表該局域網(wǎng)上所有的鏈路向連接在該網(wǎng)絡(luò)上的各路由器發(fā)送狀態(tài)信息。 通過各路由器之間的交換鏈路狀態(tài)信息,每一個路由器都可得出該互聯(lián)網(wǎng)的鏈路狀態(tài)數(shù)據(jù)庫。每個路由器中的路由表可從這個鏈路狀態(tài)數(shù)據(jù)庫導(dǎo)出。每個路由器可算出以自己為根的最短路徑樹。再根據(jù)最短路徑樹就很容易地得出路由表來。 目前,大多數(shù)路由器廠商都支持OSPF,并開始在一些網(wǎng)絡(luò)中取代舊的RIP。7.5.4 外部網(wǎng)關(guān)協(xié)議BGP1989年,公布了新的外部網(wǎng)關(guān)協(xié)議——邊界網(wǎng)關(guān)協(xié)議BGP。BGP是不同自治系統(tǒng)的路由器之間交換路由信息的協(xié)議。BGP的較新版本是2006年發(fā)表的BGP-4,它已成為因特網(wǎng)草案標準協(xié)議。本書后面都將BGP-4簡寫BGP。 我們首先應(yīng)當弄清,在不同自治系統(tǒng)之間的路由選擇為什么不使用前面討論的內(nèi)部網(wǎng)關(guān)協(xié)議,如RIP或OSPF。 我們知道,內(nèi)部網(wǎng)關(guān)協(xié)議(如RIP或OSPF)主要是設(shè)法使數(shù)據(jù)報在一個自治系統(tǒng)中盡可能有效地從源站傳送到目的站。在一個自治系統(tǒng)內(nèi)部并不需要考慮其他方面的策略。然而BGP使用的環(huán)境卻不同。這主要是因為以下三個原因。 每一,因特網(wǎng)的規(guī)模太大,使得自治系統(tǒng)之間路由選擇非常困難。連接在因特網(wǎng)主干網(wǎng)上的路由器,必須對任何有效的IP地址都能在路由表中找到匹配的目的網(wǎng)絡(luò)。目前,主干網(wǎng)路由器中的路由表的項目數(shù)早已超過了5萬個網(wǎng)絡(luò)前綴。這些網(wǎng)絡(luò)的性能相差很大。如果用最短距離找出來的路徑,可能并不是應(yīng)當選用的路徑。例如,有的路徑的使用代價很高或很不安全。如果使用鏈路狀態(tài)協(xié)議,則每一個路由器必須維持一個很大的鏈路狀態(tài)數(shù)據(jù)庫。對于這樣大的主干網(wǎng)用Dijkstra算法計算最短路徑時花費的時間也太長。 二,對于自治系統(tǒng)之間的路由選擇,要建筑最佳路由是很不現(xiàn)實的。因為各自治系統(tǒng)是運行自己選定的內(nèi)部路由選擇協(xié)議,使用本自治系統(tǒng)指明的路徑度量,所以,當一條路徑通過幾個不同的自治系統(tǒng)時,要想對這樣的路徑計算出在意義的代價是不可能的。例如,對某個自治系統(tǒng)來說,代價為1000可能表示一條比較長的路由。但對另一個自治系統(tǒng)代價為1000,卻可能表示不可接受的壞路由。因此,自治系統(tǒng)之間的路由選擇只可能交換“可達性”信息(即“可到達”或“不可到達”)。例如,告訴相鄰路由器:“到達目的網(wǎng)絡(luò)N可經(jīng)過自治系統(tǒng)A”。 第三,自治系統(tǒng)之間的路由選擇必須考慮有關(guān)策略。例如,自治系統(tǒng)A要發(fā)送數(shù)據(jù)報到自治系統(tǒng)B,本來最好是經(jīng)過自治系統(tǒng)C。但自治系統(tǒng)C不愿意讓這些數(shù)據(jù)報通過本系統(tǒng)的網(wǎng)絡(luò),因為“這是他們的事情,和我們沒有關(guān)系。”但另一方面,自治系統(tǒng)C愿意讓某些相鄰的自治系統(tǒng)的數(shù)據(jù)報通過自己的網(wǎng)絡(luò),特別是對那些付了服務(wù)費的某些自治系統(tǒng)更是如此。因此,自治系統(tǒng)之間的路由選擇協(xié)議應(yīng)當允許使用多種路由選擇策略。這些策略包括政治、安全或經(jīng)濟方面的考慮。例如:我國國內(nèi)的站點在互相傳送數(shù)據(jù)報時不應(yīng)經(jīng)過國外兜圈子,特別是不要經(jīng)過某些對我國的安全有威脅的國家。這些策略都是由網(wǎng)絡(luò)管理人員對每一個路由器進行設(shè)置的,但這些策略并不是自治系統(tǒng)之間的路由選擇協(xié)議本身。還可舉出一些策略的例子,如:“僅在到達下列這些地址時才經(jīng)過自治系統(tǒng)A”,“自治系統(tǒng)A和自治系統(tǒng)B相比時,應(yīng)優(yōu)先通過自治系統(tǒng)A”等。顯然,使用這些策略是為了找出較好的路徑而不是最佳路徑。 由于上述情況,邊界網(wǎng)關(guān)協(xié)議BGP只能是力求尋找一條能夠到達目的網(wǎng)絡(luò)且比較好的路由,而并非要尋找一條最佳路由。BGP采用了路徑向量路由選擇協(xié)議,它與距離向量協(xié)議和鏈路狀態(tài)協(xié)議都有很大的區(qū)別。 在配置BGP時,每一個自治系統(tǒng)的管理員要選擇至少一個路由器作為該自治系統(tǒng)的“BGP發(fā)言人”。一般說來,兩個BGP發(fā)言人都是通過一個共享網(wǎng)絡(luò)連接在一起的,而BGP發(fā)言人往往就是BGP邊界路由器,但也可以不是BGP邊界路由器。 一個BGP發(fā)言人與其他自治系統(tǒng)中的BGP發(fā)言人要交換路由信息,就要先建立TCP連接,然后在此連接上交換BGP報文以建立BGP會話,利用BGP會話交換路由信息,如增加了新的路由,或撤銷過時的路由,以及報告出差錯的情況等。使用TCP連接能提供可靠的服務(wù),也簡化了路由選擇協(xié)議。使用TCP連接交換路由信息的兩個BGP發(fā)言人,彼此成為對方的鄰站或?qū)Φ日尽?/span> 圖7-26表示BGP發(fā)言人和自治系統(tǒng)AS的關(guān)系的示意圖。在圖中畫出了3個自治系統(tǒng)中的5個BGP發(fā)言人。每一個BGP發(fā)言人除了必須運行BGP協(xié)議外,還必須運行該自治系統(tǒng)所使用的內(nèi)部網(wǎng)關(guān)協(xié)議,如OSPF或RIP。
圖7-26 BGP發(fā)言人和自治系統(tǒng)AS的關(guān)系 BGP所交換的網(wǎng)絡(luò)可達性信息就是要到達某個網(wǎng)絡(luò)(用網(wǎng)絡(luò)前綴表示)所要經(jīng)過的一系列的自治系統(tǒng)。當BGP發(fā)言人互相交換了網(wǎng)絡(luò)可達性的信息后,各BGP發(fā)言人就根據(jù)所采用的策略從收到的路由信息中找出到達各自治系統(tǒng)的比較好的路由。圖7-27表示一個BGP發(fā)言人構(gòu)造成的自治系統(tǒng)連通圖,它是樹形結(jié)構(gòu),不存在回路。
圖7-27 自治系統(tǒng)的連通圖
BGP協(xié)議交換路由信息的結(jié)點數(shù)量級是自治系統(tǒng)數(shù)的量級,這要比這些自治系統(tǒng)中的網(wǎng)絡(luò)數(shù)少很多。要在許多自治系統(tǒng)之間尋找一條較好的路徑,就是要尋找正確的BGP發(fā)言人(或邊界路由器),的數(shù)目是很少的。這樣就使得自治系統(tǒng)之間的路由選擇不會過分的復(fù)雜。 BGP支持CIDR,因此BGP的路由表也就應(yīng)當包括目的網(wǎng)絡(luò)前綴、下一跳路由器,以及到達該目的網(wǎng)絡(luò)所要經(jīng)過的各個自治系統(tǒng)序列。由于使用了路徑向量的信息,就可以很容易地避免產(chǎn)生兜圈子的路由。如果一個BGP發(fā)言人收到了其他BGP發(fā)言人發(fā)來的路徑通知,它就要檢查一下本自治系統(tǒng)是否在此通知的路徑中。如果在這條路徑中,就不能采用這條路徑。 在BGP剛剛運行時,BGP的鄰站要交換整個的BGP路由表。但以后只需要在發(fā)生變化時更新有變化的部分。這樣做對節(jié)省網(wǎng)絡(luò)帶寬和減少路由器的處理開銷方面都有好處。 BGP-4共使用以下4種報文。 (1)打開報文,用來與相鄰的另一個BGP發(fā)言人建立關(guān)系。 (2)更新報文,用來發(fā)送某一路由信息,以及列出要撤銷的多條路由。 (3)保活報文,用來確認打開報文和周期性地證實鄰站關(guān)系。 (4)通知報文,用來發(fā)送檢測到的差錯。 若兩個鄰站屬于兩個不同的自治系統(tǒng),而其中一個鄰站打算和另一個鄰站定期地交換路由信息,這就應(yīng)當有一個商談的過程(因為很可能對方路由器的負荷已經(jīng)很重了,因而不愿意再加重負擔)。因引,一開始向鄰站進行商談時就必須發(fā)送打開報文。如果鄰站接受這種鄰站關(guān)系,就用從中漁利報文響應(yīng)。這樣,兩個BGP發(fā)言人的鄰站關(guān)系建立了。 一旦鄰站關(guān)系建立了,就要繼續(xù)維持這種關(guān)系。雙方中的每方都需要確信對方是存在的,且一直在保持這種鄰站關(guān)系。為此,這兩個BGP發(fā)言人彼此要周期性的交換保活報文(一般每隔30秒)。保活報文只有19字節(jié)長(只用BGP報文的通用首部),因此不會造成網(wǎng)絡(luò)上太大的開銷。 更新報文是BGP協(xié)議的核心內(nèi)容。BGP發(fā)言人可以用更新報文撤銷它以前曾經(jīng)通知過的路由,也可以宣布增加新的路由。撤銷路由可以一次撤銷許多條,但增加新路由時,每個更新報文只能增加一條。 BGP可以很容易解決距離向量路由選擇算法中的“壞消息傳播得慢”這一問題。當某個路由器或鏈路出故障時,因為BGP發(fā)言人可以從不止一個鄰站獲得路由信息,所以,很容易選擇出新的路由。距離向量算法往往不能給出正確的選擇,是因為這些算法不能指出哪些鄰站到目的站的路由是獨立的。 7.6 因特網(wǎng)組中的多播7.6.1 IP多播的基本概念1988年Steve Deering首次在其博士學位論文中提出IP多播的概念。1992年3月IETF在因特網(wǎng)范圍首次試驗IETF會議聲音的多播,當時有20個網(wǎng)點可同時聽到會議的聲音?,F(xiàn)在IP多播(multicast)已成為因特網(wǎng)的一個熱門課題。這是由于有許多的應(yīng)用需要由一個源點通過一次發(fā)送操作,把同樣的分組副本發(fā)送到許多個終點,即一對多的通信。例如,實時信息的交付(如新聞、股市行情等),軟件更新,交互式會議等。隨著因特網(wǎng)的用戶數(shù)目的急劇增加,以及多媒體通信的開展,有更多的業(yè)務(wù)需要多播來支持。關(guān)于IP多播可參考[W-MCASY]。 與單播相比,在一對多的通信中,多播可大大節(jié)約網(wǎng)絡(luò)資源。 當多播組的主機數(shù)很大時(如成千上萬個),采用多播方式就可明顯地減輕網(wǎng)絡(luò)中各種資源的消耗。在因特網(wǎng)范圍的多播要靠路由器來實現(xiàn),這些路由器必須增加一些能夠識別多播分組的軟件。能夠運行多播協(xié)議的路由器成為多播路由器(multicast router)。多播路由器可以是一個單獨的路由器,也可以是運行多播軟件的普通路由器。 為了適應(yīng)交互式音頻和視頻信息的多播,從1992年起,在因特網(wǎng)開始試驗虛擬的多播主干網(wǎng)MBONE。MBONE可以將分組傳播給不在一起,但屬于一個組的許多個主機。現(xiàn)在多播主干網(wǎng)的規(guī)模已經(jīng)很大,有幾千個多播路由器。 然而在因特網(wǎng)上實現(xiàn)多播要比單播復(fù)雜得多,因為必須解決以下的一些問題。 (1)多播組的地址(或簡稱為組地址) D類IP地址就是多播組地址。D類IP地址去掉類別位(1110)后,剩下的28bit共有2*28種組合(超過2億5千萬個)。因此,可以使用的多播組地址的范圍是從224.0.0.0到239.255.255.255。顯然,多播地址只能用做目的地址,而不能用做源地址。 有一些D類IP地址是不能任意使用的,因為因特網(wǎng)號碼指派管理局IANA已經(jīng)指派了一些永久組地址。下面是永久組地址的幾個例子。 224.0.0.0 基地址(保留) 224.0.0.1 在本子網(wǎng)上的所有參加多播的主機和路由器 224.0.0.2 在本子網(wǎng)上的所有參加多播的路由器 224.0.0.3 未指派 224.0.0.4 DVMRP路由器 …… 224.0.0.19 至 224.0.0.225 未指派 239.192.0.0 至 239.251.255.255 限制在一個組織的范圍 239.252.0.0 至 239.255.255.255 限制在一個地點的范圍 順便指出,多播組成員中的每一個主機另外還有一個單播的IP地址。 (2)多播最短路徑支撐樹 參加多播的源點主機和所有參加多播的路由器都必須能夠把多播IP地址轉(zhuǎn)化為包含有多播組成員的網(wǎng)絡(luò)的清單,然后根據(jù)這個網(wǎng)絡(luò)清單構(gòu)造出到所有包含多播組成員的網(wǎng)絡(luò)的多播最短路徑支撐樹。 如果不使用最短路徑支撐樹,那么就會在某些鏈路上出現(xiàn)重復(fù)的通信量因而造成浪費。假定在路由器R2和R3之間還有一條連接的鏈路(請讀者注意,圖中并沒有畫出這條鏈路,而里的鏈路就是網(wǎng)絡(luò)),那么路由器R2必須知道,不應(yīng)當向R3發(fā)送多播分組的副本,因為這是多余的。 圖7-29 D 類 IP 地址與以太網(wǎng)多播地址的映射關(guān)系 (3)IP多播地址到局域網(wǎng)上的路由器時,還必須把32位的IP多播地址轉(zhuǎn)換為局域網(wǎng)的48位多播地址。這樣才能在局域網(wǎng)進行多播。 因特網(wǎng)號碼指派管理局IANA擁有的以太網(wǎng)地址塊的高24位為00-00-5E,也就是說,IANA擁有的以太網(wǎng)MAC地址的范圍是從00-00-5E-00-00-00到00-00-5E-FF-FF-FF。在5、3、1節(jié)已講過,以太網(wǎng)MAC地址字段中第一字節(jié)的最低位1時即為多播地址。IANA用其中的一半作為多播地址,因此只剩下23位可自由使用了。這樣,以太網(wǎng)多播地址中的范圍就是從01-00-5E-00-00-00到01-00-5E-7F-FF-FF。但D類IP地址可供分配的有28位,可見,在這28位中的前5位不能映射到以太網(wǎng)的多播地址中。例如,IP多播地址224.128.64.32和另一個IP多播地址224.0.64.32轉(zhuǎn)換成以太網(wǎng)的多播地址都是01-00-5E-00-40-20。因為多播IP地址與以太網(wǎng)多播地址的映射關(guān)系不是唯一的,所以,主機中的IP模塊還需要利用軟件進行過慮,把不是本主機要接收的數(shù)據(jù)報丟棄。 (4)組成員的動態(tài)關(guān)系 嚴格說來,組成員應(yīng)當是主機中的進程。一個主機中的多個進程可以分別加入不同的多播組.然而多播組中的成員關(guān)系是動態(tài)變化的.臨時組地址則是在每一次使用前都必須創(chuàng)建多播組.一個進程可請求參加某個特定的多播組,或在任意時間退出該組。因此,應(yīng)當使用一種機制使得單個的主機能夠把自己的組成員關(guān)系及時通告給本網(wǎng)絡(luò)上的路由器。因特網(wǎng)組管理協(xié)議IGMP就是用來支持這種機制的。 (5)多播路由器需要交換的信息 轉(zhuǎn)發(fā)多播分組的路由器需要彼此交換兩種信息。首先,這些路由器要知道哪些網(wǎng)絡(luò)包含給定多播組的成員。其次,這些路由器需要有足夠的信息來計算到達每一個包含多播組成員的網(wǎng)絡(luò)的最短路徑,這就需要有多播路由選擇協(xié)議和計算最短路徑的算法。 7.6.2 因特網(wǎng)組管理協(xié)議IGMPIGMP已經(jīng)有了3個版本.19889年公布的RFC1112(IGMPv1)早已成了因特網(wǎng)的標準協(xié)議。1997年公布的RFC(IGMPv2)對IGMPv1進行了更新,但IGMPv2只是個建議標準。2002年10月公布了RFC3376(IGMPv3,目前是建議標準),宣布了RFC2236(IGMPv2)是陳舊的。 和ICMP相似,IGMP使用IP數(shù)據(jù)報傳遞其報文(即IGMP報文加上IP首部構(gòu)成IP數(shù)據(jù)報)。但IGMP也向IP提供服務(wù)。從原理上講,IGMP包括以下兩種操作。 (1)主機向多播路由器發(fā)送報文,要求加入或退出某給定地址的多播組。本地的多播路由器收到IGMP報文后,把組成員關(guān)系轉(zhuǎn)發(fā)給因特網(wǎng)上的其他多播路由器。 (2)多播路由器要周期性地檢驗?zāi)男┒嗖ソM感興趣。前兩個版本的IGMP都具有以下的操作模型。 接受方必須申請加入某個多播組。 發(fā)送方不需要加入到任何多播組。 任何主機都可以向任何多播組發(fā)送多播分組。 但前兩個版本具有下面的缺點。 (1)多播組很容易泛濫成災(zāi),消耗大量網(wǎng)絡(luò)資源。 (2)在不知道發(fā)送方的位置的情況下,有時無法建立多播樹。 (3)不同的多播組可能使用相同的多播地址,因此全球多播地址不是唯一的。 IGMPv3采用以下措施來解決上述問題。 (1)允許主機指明“我愿意從哪些主機接收多播分組”,而從其他主機發(fā)送來的多播分組可以被阻攔掉。 (2)允許主機阻攔自己所不愿意要的多播分組。 IGMP定義了兩種報文:成員關(guān)系詢問報文和成員關(guān)系報告報文。主機要加入或退出多播組,都要發(fā)送成員關(guān)系報告報文。連接在局域網(wǎng)上的所有多播路由器都能收到這樣的報告報文。多播路由器周期性地發(fā)送成員關(guān)系詢問報文以維持當前有效的、活躍的組地址。愿意繼續(xù)參加多播組的主機必須響應(yīng)以報告報文。 7.7 虛擬專用網(wǎng)VPN和網(wǎng)絡(luò)地址轉(zhuǎn)換NAT7.7.1 虛擬專用網(wǎng)VPN由于IP地址的緊缺,一個機構(gòu)能夠申請到的IP地址數(shù)往往遠小于本機構(gòu)所擁有的主機數(shù)。實際上,出于安全等原因,一個機構(gòu)內(nèi)的很多主機并不需要接入到外部的因特網(wǎng),它們主要是和內(nèi)部的其他主機進行通信。假定在一個機構(gòu)內(nèi)部的計算機通信也是采用TCP/IP,那么從原則上講,對于這些僅在機構(gòu)內(nèi)部使用的計算機就可以由本機構(gòu)自行分配其IP地址。這就是說,讓這些計算機使用僅在本機構(gòu)有效的IP地址(這種地址稱為本地地址),而不需要向因特網(wǎng)的管理機構(gòu)申請全球唯一的IP地址(這種地址稱為全球地址)。這樣就可以大大節(jié)約寶貴的全球IP地址資源。 但是,如果任意選擇一些IP地址作為本地地址,那么在某種情況下可能會引起一些麻煩。例如,一個不連接因特網(wǎng)的主機A分配到一個本地地址150.1.2.3。這個地址不需要在因特網(wǎng)地址管理機構(gòu)登記,但在本機構(gòu)內(nèi)必須是唯一的。然而正巧因特網(wǎng)上有一個主機,其IP地址就是150.1.2.3,而且這個主機要和本機構(gòu)的某個具有全球地址的主機通信。這樣就會出現(xiàn)地址的二義性問題。 為了解決這一問題,RFC1918指明了一些專用地址。這些地址只能用于一個機構(gòu)的內(nèi)部通信,而不能用于和因特網(wǎng)上的主機通信。換言之,專用地址只能做本地地址而不能用做全球地址。在因特網(wǎng)中的所有路由器對目的地址是專用地址的數(shù)據(jù)報一律不進行轉(zhuǎn)發(fā)。RFC1918指明的專用地址是: (1)10.0.0.0到10.255.255.255 (或記為10/8,共有2*24個地址) (2)172.16.0.0到172.31.255.255 (或記為172.16/12,共有2*20個地址) (3)192.168.0.0到192.168.255.255 (或記為192.168/16,共有2*16個地址) 上面的3個地址塊分別相當于一個A類網(wǎng)絡(luò)、16個連續(xù)的B類網(wǎng)絡(luò)和256個連續(xù)的C類網(wǎng)絡(luò)。A類地址本來早已用完了,而上面的地址10.0.0.0本來是分配給ARPANET的。因為ARPANET已經(jīng)關(guān)閉停止運行了,所以這個地址就用做專用地址。 采用這樣的專門IP地址的互聯(lián)網(wǎng)絡(luò)稱為專用網(wǎng)絡(luò)或本地互聯(lián)網(wǎng),更簡單些說,就叫做專用網(wǎng)。顯然,全世界可能有很多的專用互聯(lián)網(wǎng)絡(luò)具有相同的專用IP地址,但這并不會引起麻煩,因為這些專用地址僅在本機構(gòu)內(nèi)部使用。專用IP地址也叫做可重用地址。 有時一個很大的機構(gòu)有很多部門分布在相距很遠的一些地點,而在每一個地點都有自己的專用網(wǎng)。假定這些分布在不同地點的專用網(wǎng)需要經(jīng)常進行通信。這時,可以有兩種方法。第一種方法是租用電信公司的路線為本機構(gòu)專用。這種方法的好處是簡單方便,但線路的租金太高。第二種方法是利用因特網(wǎng)(即公用互聯(lián)網(wǎng))來實現(xiàn)本機構(gòu)的專用網(wǎng),因此,這樣的專用網(wǎng)又稱為虛擬專用網(wǎng)VPN。“虛擬”即“好象是”,但實際上不是,因為現(xiàn)在是因特網(wǎng)(而并沒有用專線)來連接分散在各地的本地網(wǎng)絡(luò)。VPN只是在效果上和真正的專用網(wǎng)一樣。 假定某個機構(gòu)在兩個相隔較遠的部門A和部門B建立了專用網(wǎng),其網(wǎng)絡(luò)地址分別為專用地址10.1.0.0和10.2.0.0?,F(xiàn)在這兩個部門需要通過因特網(wǎng)進行通信。 顯然,每一個部門至少要有一個路由器具有合法的全球IP地址,如圖7-31(a)所示的路由器R1和R2。這兩個路由器和因特網(wǎng)的接口地址必須是合法的全球IP地址。路由器R1和R2在與專用網(wǎng)內(nèi)部網(wǎng)絡(luò)的接口地址則是專用網(wǎng)的本地地址。 現(xiàn)在設(shè)部門A的主機X要向部門B的主機Y發(fā)送數(shù)據(jù)報,源地址是10.1.0.1,而目的地址是10.2.0.3。這個數(shù)據(jù)報作為本機構(gòu)的內(nèi)部數(shù)據(jù)報從X發(fā)送到與外界連接的路由器R1。路由器R1收到內(nèi)部數(shù)據(jù)后把整個的內(nèi)部數(shù)據(jù)報進行加密,然后重新添加上數(shù)據(jù)報的首部封裝成為在因特網(wǎng)上發(fā)送的外部數(shù)據(jù)報,其源地址是路由器R1的全球地址125.1.2.3,而目的地址是路由器R2的全球地址194,4.5.6。路由器R2收到數(shù)據(jù)報后將其數(shù)據(jù)部分取出進行解密,恢復(fù)出原來的內(nèi)部數(shù)據(jù)報,并轉(zhuǎn)發(fā)給主機Y。 圖7-31 用隧道技術(shù)實現(xiàn)虛擬專用網(wǎng) 7.7.2 網(wǎng)絡(luò)地址轉(zhuǎn)換NAT下面討論另一種情況,就是在專用網(wǎng)內(nèi)部的一些主機本來已經(jīng)分配到了本地IP地址,但現(xiàn)在又想和因特網(wǎng)上的主機通信(并不需要加密),那么應(yīng)當采取什么措施呢? 最簡單的辦法就是設(shè)法再申請一些全球IP地址。但這在很多情況下是不容易做到了,因為全球IP地址已所剩不多了。目前使用的最多的方法是采用網(wǎng)絡(luò)地址轉(zhuǎn)換。 網(wǎng)絡(luò)地址轉(zhuǎn)換NAT方法是在1994年提出的。這種方法需要在專用網(wǎng)連接到因特網(wǎng)的路由器上安裝NAT軟件。裝有NAT路由器,它至少有一個有效的外部全球地址IPG。這樣,所有使用本地地址的主機在和外界通信時,都要在NAT路由器上將其本地地址轉(zhuǎn)換成IPG才能和因特網(wǎng)連接。 例如,當內(nèi)部主機X用其本地地址IPX和因特網(wǎng)上的主機Y通信時,,它所發(fā)送的數(shù)據(jù)報必須經(jīng)過的NAT路由器。NAT路由器將數(shù)據(jù)報的源地址IPX轉(zhuǎn)換成自己的全球地址IPG,但目的地址IPY保持不變,然后發(fā)送到因特網(wǎng)。當NAT路由器從因特網(wǎng)收到主機Y發(fā)回的數(shù)據(jù)報時,知道數(shù)據(jù)報中的源地址是IPY,而目的地址是IPG。根據(jù)原來的記錄(這個記錄叫做NAT轉(zhuǎn)換表),NAT路由器知道這個數(shù)據(jù)報是要發(fā)送給主機X的,因此,NAT路由器將目的地址IPG轉(zhuǎn)換為IPX,轉(zhuǎn)發(fā)給最終的內(nèi)部主機X。 如果NAT路由器具有多個全球IP地址,那么就可以同時將多個本地地址轉(zhuǎn)換為全球IP地址,因而可以是多個擁有本地地址的主機能夠和因特網(wǎng)的主機進行通信。 還有一種NAT轉(zhuǎn)換表將運輸層的端口號也利用上,這樣就可以用一個全球IP地址是多個擁有本地地址的主機同時和因特網(wǎng)上的不同主機進行通信。 7.8 下一代的網(wǎng)際協(xié)議IPV67.8.1 解決IP地址耗盡的措施IP是因特網(wǎng)的核心協(xié)議。現(xiàn)在使用的IP是在20世紀70年代末期設(shè)計的,無論從計算機本身發(fā)展還是從因特網(wǎng)規(guī)模和網(wǎng)絡(luò)傳輸速率來看,現(xiàn)在IPV4已很不適用了。這里最主要的問題就是32位的IP地址不夠用。 要解決IP地址耗盡的問題,可以采用以下3個措施。 (1)采用無類別編址CIDR,使IP地址的分配更加合理。 (2)采用網(wǎng)絡(luò)地址轉(zhuǎn)換NAT方法,可節(jié)省許多全球IP地址。 (3)采用具有更大地址空間的新版本的IP,即IPV6。 盡管上述前兩項措施的采用使得IP地址耗盡的日期推后了不少,但卻不能從根本上解決IP地址即將耗盡的問題。因此,治本的方法應(yīng)當是上述的第3種方法。 IETE早在1992年6月就提出要制定下一代的IP,即Ipng。Ipng現(xiàn)正式稱為IPV6。1998年12月發(fā)表的RFC2460~2463已成為因特網(wǎng)草案標準協(xié)議。應(yīng)當指出,換一個新版的IP并非易事。世界上許多團體都從因特網(wǎng)的發(fā)展中看到了機遇,因此,在新標準的制定過程中出于自身的經(jīng)濟利益而產(chǎn)生了激烈的爭論。到目前為止,IPV6還只是草案標準階段。 及早開始過渡到IPV6的好處是:有更多的時間來規(guī)劃平滑過渡;有更多的時間培養(yǎng)IPV6的專門人才;及早提供IPV6服務(wù)比較便宜。因此,現(xiàn)在有些ISP已經(jīng)開始進行IPV6的過渡。 下面是IPv6的簡介。 7.8.2 IPv6的基本首部格式IPv6仍支持無連接的傳送,但將協(xié)議數(shù)據(jù)單元PDU稱分組,而不是IPv4的數(shù)據(jù)報。為方便起見,本書仍采用數(shù)據(jù)報這一名詞([COME06]和[TANE03]也是這樣做的)。 IPv6所引進的主要變化如下。 (1)更大的地址空間。IPv6將地址從IPv4的32位增大到了128位,使地址空間增大了2*96倍。這樣大的地址空間在可預(yù)見的將來是不會用完的。 (2)擴展的地址層次結(jié)構(gòu)。IPv6由于地址空間很大,因此可以劃分為更多的層次。 (3)靈活的首部格式,。IPv6數(shù)據(jù)報的首部和IPv4的并不兼容。IPv6定義了許多可選的擴展首部,不僅可提供比IPv4更多的功能,而且還可提高路由器的處理效率,這是因為路由器對擴展首部不進行處理(除逐跳擴展首部外)。 (4)改進的選項。IPv6允許數(shù)據(jù)包含有選項的控制信息,因而可以包含一些新的選項。我們知道,IPv4所規(guī)定的選項是固定不變的。 (5)允許協(xié)議糾結(jié)擴充。這一點很重要因為技術(shù)總是在不斷地發(fā)展(如網(wǎng)絡(luò)硬件的更新)而新的應(yīng)用也還會出現(xiàn)。但我們知道,IPv4的功能是固定不變的。 (6)支持即插即用(即自動配置)。 (7)支持資源的預(yù)分配。IPv6支持實時視像等要求保證一定的帶寬和時延的應(yīng)用。 IPv6將首部長度變?yōu)楣潭ǖ?/span>40字節(jié),稱為基本首部。將不必要的功能取消了,首部的字段數(shù)減少到只有8個(雖然首部長度增大了一倍)。此外,還取消了首部的檢驗和字段(考慮到數(shù)據(jù)鏈路層和運輸層都有差錯檢驗功能)。這樣就加快了路由器處理數(shù)據(jù)報的速度。 IPv6數(shù)據(jù)報在基本首部的后面允許有零個或多個擴展首部,再后面是數(shù)據(jù),如圖7-32所示。但請讀者注意,所有的擴展的首部都不屬于數(shù)據(jù)報的首部。所有的擴展首部和數(shù)據(jù)合起來叫做數(shù)據(jù)報的有效載荷或凈負荷。 圖 7-32是具有多個可選擴展首部的IPv6數(shù)據(jù)報的一般形式
圖7-33是IPv6數(shù)據(jù)包的基本首部。在基本首部后面是有效載荷,它包括運輸層的數(shù)據(jù)和可能選用的擴展首部。下面解釋IPv6基本首部中的各字段的作用。 圖7-33 IPv6的基本首部格式 (1)版本占4位。它指明了協(xié)議的版本,對IPv6該字段總是6。 (2)通信量類占8位。這是為了區(qū)分不同的IPv6數(shù)據(jù)報的類別或優(yōu)先級。目前正在進行不同的通信量類性能的實驗。 (3)流標號占20位。IPv6的一個新的機制是支持資源預(yù)分配,并且允許路由器將每一個數(shù)據(jù)報與一個給定的資源分配相聯(lián)系。IPv6提出流的抽象概念。所謂“流”就是互聯(lián)網(wǎng)網(wǎng)絡(luò)上從特定源點到特定終點(單播或多播)的一系列數(shù)據(jù)報(如實時音頻或視頻傳輸),而在這個“流”所經(jīng)過路徑上的路由器都保證指明的服務(wù)質(zhì)量。所有屬于同一個流的數(shù)據(jù)報都具有同樣的流標號。 (4)有效載荷長度占16位。它指明IPv6數(shù)據(jù)報除基本首部以外的字節(jié)數(shù)(所有擴展首部都算在有效載荷之內(nèi))。這個字段的最大值是64KB。 (5)下一個首部占8位,。它相當于IPv4的協(xié)議字段或可選字段。 當IPv6數(shù)據(jù)報沒有擴展首部時,下一個首部字段的作用和IPv4的協(xié)議字段一樣,它的值指出了基本首部后面的數(shù)據(jù)應(yīng)交付給IP上面的哪一個高層協(xié)議(例如,6或17分別表示應(yīng)付給TCP或UDP)。 當出現(xiàn)擴展首部時,下一個首部字段的值就標識后面第一個擴展首部的類型。 (6)跳數(shù)限制占8位。用來防止數(shù)據(jù)報在網(wǎng)絡(luò)中無限期地存在。源站在每個數(shù)據(jù)報發(fā)出時即設(shè)定某個跳數(shù)限制。每個路由器在轉(zhuǎn)發(fā)數(shù)據(jù)報時,要先在跳數(shù)限制字段中的值減1。當跳數(shù)限制的值為零時,就要將此數(shù)據(jù)報丟棄。 (7)源地址 占128位。是數(shù)據(jù)報的發(fā)送站的IP地址。 (8)目的地址 占128位。是數(shù)據(jù)報的接收站的IP地址。 IPv6為什么要使用擴展首部呢?大家知道,IPv4的數(shù)據(jù)報如果在其首部中使用了選項,那么沿數(shù)據(jù)報傳送的路徑上的每路由器都必須對這些選項進行一一檢查,這就降低了路由器處理數(shù)據(jù)報的速度。然而實際上,在一條路徑途中的路由器上很多選項是不需要檢查的。IPv6把原來IPv4首部中選項的功能都放在擴展首部中,并將擴展首部留給路徑兩端的源站和目的站的主機來處理,而數(shù)據(jù)報途中經(jīng)過的路由器都不處理這些擴展首部(只有一個首部例外,即逐跳選項擴展首部),這樣就大提高了路由器的處理效率。 在RFC2460中定義了以下6種擴展首部:1.逐跳選項;2.路由選擇;3.分片;4.鑒別;5.封裝安全有效載荷;6.目的站選項。 每一個擴展首部都由若干個字段組成,他們的長度也各不同。但所有擴展首部的第一個字段都是8位的“下一個首部”字段。次字段的值指出了在該擴展首部后面的字段是什么。當使用多個擴展首部時,,應(yīng)按以上的先后順序出現(xiàn)。高層首部總是放在最后面。 7.8.3 IPV6的編址一般來講,,一個IPV6數(shù)據(jù)報的目的地址可以是以下3種基本類型地址之一。 (1)單播 單播就是傳統(tǒng)的點對點通信。 (2)多播 多播是一點對多點的通信,數(shù)據(jù)報交付到一組計算機中的每一個。IPV6沒有采用廣播的術(shù)語,而是將廣播看作多播的一個特例。 (3)任播 這是IPV6增加的一種類型。任播的目的站是一組計算機,但來自用戶的數(shù)據(jù)報在交付時只交付給這組計算機中的任何一個,通常是距離最近的一個。 IPV6將實現(xiàn)IPV6的主機和路由器均稱為結(jié)點,并將IPV6地址分配給結(jié)點上面的接口。一個接口可以有多個單播地址。一個結(jié)點接口的單播地址可用來唯一地標志該結(jié)點。 在IPV6中,每個地址占128位,地址空間大于3.4*10*38。如果整個地球表面都覆蓋計算機,那么IPV6允許每平方米擁有7*10*23個IP地址。如果地址分配速率是每微秒分配100萬個地址,則需要10*19年的時間才能將所有可能的地址分配完畢??梢?,在想象得到的將來,IPV6的地址空間是不可能用完的。 巨大的地址范圍還必須是維護互聯(lián)網(wǎng)的人易于閱讀和操作這些地址。IPV6所用的點分十進制記法現(xiàn)在也不夠方便了。例如,一個用點分十進制的128位的地址: 104.230.140.100.255.255.255.255.0.0.17.128.150.10.255.255 為了使地址再簡潔些,IPV6使用冒號十六進制記法,它把每個16位的值用十六進制表示,各值之間用冒號分隔。例如,如果前面所給的點分十進制記法的值改為冒號十六進制記法,就變成了: 68E6:8C64: FFFF: FFFF: 0:1180:960A: FFFF 在十六進制記法中允許省去冒號之間的數(shù)中最前面的一串0,如000F可縮寫為F。 冒號十六進制記法還包括兩個技術(shù)使它尤其有用。首先,冒號十六進制記法可以允許零壓縮,即一連串連續(xù)的零可以為一對冒號所取代,例如: FF05:0:0:0:0:0:0:B3 可以寫成:FF05::B3 為了保證零壓縮有一個不含混的解釋,規(guī)定在任意一個地址中只能使用一次零壓縮。該技術(shù)對已建議的分配策略特別有用,因為會有很多地址包含連續(xù)的零串。 其次,冒號十六進制記法可結(jié)合有點分十進制記法的后綴。,我們下面會看到這種結(jié)合在IPV4向IPV6的轉(zhuǎn)換階段特別有用。例如,下面的串是一個合法的冒號十六進制記法: 0:0:0:0:0:0:128.10.2.1 請讀者注意,在這種記法中,雖然為冒號所分隔的每一個值是一個16位值,但每個點分十進制部分的值則指明一個字節(jié)(8位)的值。再使用零壓縮即可得出: ::128.10.2.1 IPV6和IPV4最重要的變化之一就是單播地址所使用的劃分策略,以及由此產(chǎn)生的多級地址體系.我們知道,采用CIDR后,IPV4的地址是兩級結(jié)構(gòu),它的地址被劃分為一個前綴和一個后綴。IPV6擴展了地址的分級概念,它使用以下的3個等級。(1)等一級(頂級),指明全球知道的公共拓撲。(2)第二級(地點級),指明單個的地點。(3)第三級,指明單個的網(wǎng)絡(luò)接口。IPV6的地址體系采用多級體系是充分考慮到怎樣使路由器可更快地查找路由。 7.8.4 ICMPV6和IPV4一樣,IPV6也需要使用ICMP。但舊版本的、適合于IPV4的ICMP并不能滿足IPV6全部的要求。因此,叫做ICMPV6的新版本在1998年底也問世了[RFC2463],它目前還只是草案標準協(xié)議。 ICMPV6的報文格式和IPV4使用的ICMP的相似,即前4個字節(jié)的字段名稱都是一樣的,但ICMPV6把第5個字節(jié)起的后面部分作為報文主體。ICMPV6把報文種類劃分為兩大類,即差錯報文和提供信息的報文,并取消了使用得很少的ICMP報文。差錯報文的類型字段的最高位是0,因此,其類型字段的值是0到127。提供信息的報文的類型字段的最高位是1,其值是128到255。但在RFC2463中只定義了6種類型的ICMPV6報文。 ICMPV6報文的前面是IPV6首部和零個或更多的IPV6擴展首部。在ICMPV6前面的一個首部中的“下一個首部字段”的值應(yīng)當置為58。請讀者注意,這和IPV4中標志ICMP的值不同,在IPV4中標志ICMP的值是1。 順便指出,與IPV6配套使用的沒有IGMPV6,因為ICMPV6已經(jīng)包含了所有ICMPV4和IGMP的功能。
|
|