三、IP地址
在可路由的網絡層協議中,協議地址必須含有兩部分信息:網絡地址和主機地址。存貯這種信息最明顯的方法是用兩個分離的域,這樣我們必須考慮到兩個域的最大長度,有些協議(如IPX)就是這樣的,它在小型和中型的網絡里可以工作的很好。
另一種方案是減少主機地址域的長度,如24位網絡地址、8位主機地址,這樣就有了較多的網段,但每個網段內的主機數目很少。這樣一來,對于多于256個主機的網絡,就必須分配多個網段,其問題是很多的網絡給路由器造成了難以忍受的負擔。
IP把網絡地址和主機地址一起包裝在一個32位的域里,有時主機地址部分很短,有時很長,這樣可以有效利用地址空間,減少IP地址的長度,并且網絡數目不算多。有兩種將主機地址分離出來的方法:基于類的地址和無類別的地址。
1、主機和網關
主機和網關的區別常產生混淆,這是由于主機意義的轉變。在RFC中(1122/3和1009)中定義為:
主機是連接到一個或多個網絡的設備,它可以向任何一個網絡發送和從其接收數據,但它從不把數據從一個網絡傳向另一個。
網關是連接到多于一個網絡的設備,它選擇性的把數據從一個網絡轉發到其它網絡。
換句話說,過去主機和網關的概念被人工地區分開來,那時計算機沒有足夠的能力同時用作主機和網關。主機是用戶工作的計算機,或是文件服務器等?,F代的計算機的能力足以同時擔當這兩種角色,因此,現代的主機定義應該如此:
主機是連接到一個或多個網絡的設備,它可以向任何一個網絡發送和從其接收數據。它也可以作為網關,但這不是其唯一的目的。
路由器是專用的網關,其硬件經過特殊的設計使其能以極小的延遲轉發大量的數據。然而,網關也可以是有多個網卡的標準的計算機,其操作系統的網絡層有能力轉發數據。由于專用的路由硬件較便宜,計算機用作網關已經很少見了,在只有一個撥號連接的小站點里,還可能使用計算機作為非專用的網關。
2、基于類的地址
最初設計IP時,地址根據第一個字節被分成幾類:
0: 保留
1-126: A類(網絡地址:1字節,主機地址:3字節)
127: 保留
128-191: B類(網絡地址:2字節,主機地址:2字節)
192-223: C類(網絡地址:3字節,主機地址:1字節)
224-255: 保留
3、子網劃分
雖然基于類的地址系統對因特網服務提供商來說工作得很好,但它不能在一個網絡內部做任何路由,其目的是使用第二層(橋接/交換)來導引網絡中的數據。在大型的A類網絡中,這就成了個特殊的問題,因為在大型網絡中僅使用橋接/交換使其非常難以管理。在邏輯上其解決辦法是把大網絡分割成若干小的網絡,但在基于類的地址系統中這是不可能的。為了解決這個問題,出現了一個新的域:子網掩碼。子網掩碼指出地址中哪些部分是網絡地址,哪些是主機地址。在子網掩碼中,二進制1表示網絡地址位,二進制0表示主機地址位。傳統的各類地址的子網掩碼為:
A類:255.0.0.0
B類:255.255.0.0
C類:255.255.255.0
如果想把一個B類網絡的地址用作C類大小的地址,可以使用掩碼255.255.255.0。
用較長的子網掩碼把一個網絡分成多個網絡就叫做劃分子網。要注意的是,一些舊軟件不支持子網,因為它們不理解子網掩碼。例如UNIX的routed路由守護進程通常使用的路由協議是版本1的RIP,它是在子網掩碼出現前設計的。
上面只介紹了三種子網掩碼:255.0.0.0、255.255.0.0和255.255.255.0,它們是字節對齊的子網掩碼。但是也可以在字節中間對其進行劃分,這里不進行詳細講解,請參照相關的TCP/IP書籍。
子網使我們可以擁有新的規模的網絡,包括很小的用于點到點連接的網絡(如掩碼255.255.255.252,30位的網絡地址,2位的主機地址:兩個主機的子網),或中型網絡(如掩碼255.255.240.0,20位網絡地址,12位主機地址:4094個主機的子網)。
注意DNS被設計為只允許字節對齊的IP網絡(在in-addr.arpa.域中)。
4、超網(supe.netting)
超網是與子網類似的概念--IP地址根據子網掩碼被分為獨立的網絡地址和主機地址。但是,與子網把大網絡分成若干小網絡相反,它是把一些小網絡組合成一個大網絡--超網。
假設現在有16個C類網絡,從201.66.32.0到201.66.47.0,它們可以用子網掩碼255.255.240.0統一表示為網絡201.66.32.0。但是,并不是任意的地址組都可以這樣做,例如16個C類網絡201.66.71.0到201.66.86.0就不能形成一個統一的網絡。不過這其實沒關系,只要策略得當,總能找到合適的一組地址的。
5、可變長子網掩碼(VLSM)
如果你想把你的網絡分成多個不同大小的子網,可以使用可變長子網掩碼,每個子網可以使用不同長度的子網掩碼。例如:如果你按部門劃分網絡,一些網絡的掩碼可以為255.255.255.0(多數部門),其它的可為255.255.252.0(較大的部門)。
6、無類別地址(CIDR)
因特網上的主機數量增長超出了原先的設想,雖然還遠沒達到232,但地址已經出現匱乏。1993年發表的RFC1519--無類別域間路由CIDR(Classless Inter-Domain Routing)--是一個嘗試解決此問題的方法。CIDR試圖延長IPv4的壽命,與128位地址的IPv6不同,它并不能最終解決地址空間的耗盡,但IPv6的實現是個龐大的任務,因特網目前還沒有做好準備。CIDR給了我們緩沖的準備時間。
基于類的地址系統工作的不錯,它在有效的地址使用和少量的網絡數目間做出了較好的折衷。但是隨著因特網意想不到的成長出現了兩個主要的問題:
已分配的網絡數目的增長使路由表大得難以管理,相當程度上降低了路由器的處理速度。
僵化的地址分配方案使很多地址被浪費,尤其是B類地址十分匱乏。
為了解決第二個問題,可以分配多個較小的網絡,例如,用多個C類網絡而不是一個B類網絡。雖然這樣能夠很有效地分配地址,但是更加劇了路由表的膨脹(第一個問題)。
在CIDR中,地址根據網絡拓撲來分配。連續的一組網絡地址可以被分配給一個服務提供商,使整組地址作為一個網絡地址(很可能使用超網技術)。例如:一個服務提供商被分配以256個C類地址,從213.79.0.0到213.79.255.0,服務提供商給每個用戶分配一個C類地址,但服務提供商外部的路由表只通過一個表項--掩碼為255.255.0.0的網絡213.79.0.0--來分辨這些路由。
這種方法明顯減少了路由表的增長,CIDR RFC的作者估計,如果90%的服務提供商使用了CIDR,路由表將以每3年54%的速度增長,而如果沒有使用CIDR,則增長速度為776%。如果可以重新組織現有的地址,則因特網骨干上的路由器廣播的路由數量將大大減少。但這實際是不可行的,因為將帶來巨大的管理負擔。
四、路由
1、路由表
如果一個主機有多個網絡接口,當向一個特定的IP地址發送分組時,它怎樣決定使用哪個接口呢?答案就在路由表中。來看下面的例子:
目的 子網掩碼 網關 標志 接口
------ ------------ ----------- ----- -----
201.66.37.0 255.255.255.0 201.66.37.74 U eth0
201.66.39.0 255.255.255.0 201.66.39.21 U eth1
主機將所有目的地為網絡201.66.37.0內主機(201.66.37.1-201.66.37.254)的數據通過接口eth0(IP地址為201.66.37.74)發送,所有目的地為網絡201.66.39.0內主機的數據通過接口eth1(IP地址為201.66.39.21)發送。標志U表示該路由狀態為“up”(即激活狀態)。對于直接連接的網絡,一些軟件并不象上例中一樣給出接口的IP地址,而只列出接口。
此例只涉及了直接連接的主機,那么目的主機在遠程網絡中如何呢?如果你通過IP地址為201.66.37.254的網關連接到網絡73.0.0.0,那么你可以在路由表中增加這樣一項:
目的 掩碼 網關 標志 接口
----------- ------------ ----------- ----- ----
73.0.0.0 255.0.0.0 201.66.37.254 UG eth0
此項告訴主機所有目的地為網絡73.0.0.0內主機的分組通過201.66.37.254路由過去。標志G(gateway)表示此項把分組導向外部網關。類似的,也可以定義通過網關到達特定主機的路由,增加標志H(host):
目的 掩碼 網關 標志 接口
----------- -------------- ------------ ----- ----
91.32.74.21 255.255.255.255 201.66.37.254 UGH eth0
下面是路由表的基礎,除了特殊表項之外:
目的 掩碼 網關 標志 接口
----------- ------------ ----------- ---- -----
127.0.0.1 255.255.255.255 127.0.0.1 UH lo0
default 0.0.0.0 201.66.37.254 UG eth1
第一項是loopback接口,用于主機給自己發送數據,通常用于測試和運行于IP之上但需要本地通信的應用。這是到特定地址127.0.0.1的主機路由(接口lo0是IP協議棧內部的“假”網卡)。第二項十分有意思,為了防止在主機上定義到因特網上每一個可能到達網絡的路由,可以定義一個缺省路由,如果在路由表中沒有與目的地址相匹配的項,該分組就被送到缺省網關。多數主機簡單地通過一