IPv4的IP地址長度為4位元組,通常採用點分十進製表示法(dotted decimal representation)例如0xc0a80002表示為192.168.0.2。Internet被各種路由器和網關設備分隔成很多網段,為了標識不同的網段,需要把32位的IP地址劃分成網絡號和主機號兩部分,網絡號相同的各主機位於同一網段,相互間可以直接通信,網絡號不同的主機之間通信則需要通過路由器轉發。
過去曾經提出一種劃分網絡號和主機號的方案,把所有IP地址分為五類,如下圖所示(該圖出自[TCPIP])。
A類 0.0.0.0到127.255.255.255
B類 128.0.0.0到191.255.255.255
C類 192.0.0.0到223.255.255.255
D類 224.0.0.0到239.255.255.255
E類 240.0.0.0到247.255.255.255
一個A類網絡可容納的地址數量最大,一個B類網絡的地址數量是65536,一個C類網絡的地址數量是256。D類地址用作多播地址,E類地址保留未用。
隨着Internet的飛速發展,這種劃分方案的侷限性很快顯現出來,大多數組織都申請B類網絡地址,導致B類地址很快就分配完了,而A類卻浪費了大量地址。這種方式對網絡的劃分是flat的而不是層級結構(hierarchical)的,Internet上的每個路由器都必須掌握所有網絡的信息,隨着大量C類網絡的出現,路由器需要檢索的路由表越來越龐大,負擔越來越重。
針對這種情況提出了新的劃分方案,稱為CIDR(Classless Interdomain Routing)。網絡號和主機號的劃分需要用一個額外的子網掩碼(subnet mask)來表示,而不能由IP地址本身的數值決定,也就是說,網絡號和主機號的劃分與這個IP地址是A類、B類還是C類無關,因此稱為Classless的。這樣,多個子網就可以彙總(summarize)成一個Internet上的網絡,例如,有8個站點都申請了C類網絡,本來網絡號是24位的,但是這8個站點通過同一個ISP(Internet service provider)連到Internet上,它們網絡號的高21位是相同的,只有低三位不同,這8個站點就可以彙總,在Internet上只需要一個路由表項,數據包通過Internet上的路由器到達ISP,然後在ISP這邊再通過次級的路由器選路到某個站點。
下面舉兩個例子:
表 36.1. 劃分子網的例子1
IP地址 | 140.252.20.68 | 8C FC 14 44 |
子網掩碼 | 255.255.255.0 | FF FF FF 00 |
網絡號 | 140.252.20.0 | 8C FC 14 00 |
子網地址範圍 | 140.252.20.0~140.252.20.255 |
表 36.2. 劃分子網的例子2
IP地址 | 140.252.20.68 | 8C FC 14 44 |
子網掩碼 | 255.255.255.240 | FF FF FF F0 |
網絡號 | 140.252.20.64 | 8C FC 14 40 |
子網地址範圍 | 140.252.20.64~140.252.20.79 |
可見,IP地址與子網掩碼做與運算可以得到網絡號,主機號從全0到全1就是子網的地址範圍。IP地址和子網掩碼還有一種更簡潔的表示方法,例如140.252.20.68/24,表示IP地址為140.252.20.68,子網掩碼的高24位是1,也就是255.255.255.0。
如果一個組織內部組建區域網路,IP地址只用於區域網路內的通信,而不直接連到Internet上,理論上使用任意的IP地址都可以,但是RFC 1918規定了用於組建區域網路的私有IP地址,這些地址不會出現在Internet上,如下表所示。
10.*,前8位是網絡號,共16,777,216個地址
172.16.*到172.31.*,前12位是網絡號,共1,048,576個地址
192.168.*,前16位是網絡號,共65,536個地址
使用私有IP地址的區域網路主機雖然沒有Internet的IP地址,但也可以通過代理伺服器或NAT(網絡地址轉換)等技術連到Internet上。
除了私有IP地址之外,還有幾種特殊的IP地址。127.*的IP地址用於本機環回(loop back)測試,通常是127.0.0.1。loopback是系統中一種特殊的網絡設備,如果發送數據包的目的地址是環回地址,或者與本機其它網絡設備的IP地址相同,則數據包不會發送到網絡介質上,而是通過環回設備再發回給上層協議和應用程序,主要用於測試。如下圖所示(該圖出自[TCPIP])。
還有一些不能用作主機IP地址的特殊地址:
目的地址為255.255.255.255,表示本網絡內部廣播,路由器不轉發這樣的廣播數據包。
主機號全為0的地址只表示網絡而不能表示某個主機,如192.168.10.0(假設子網掩碼為255.255.255.0)。
目的地址的主機號為全1,表示廣播至某個網絡的所有主機,例如目的地址192.168.10.255表示廣播至192.168.10.0網絡(假設子網掩碼為255.255.255.0)。
下面介紹路由的過程,首先正式定義幾個名詞:
數據包從源地址到目的地址所經過的路徑,由一系列路由節點組成。
某個路由節點為數據報選擇投遞方向的選路過程。
一個具有路由能力的主機或路由器,它維護一張路由表,通過查詢路由表來決定向哪個介面發送數據包。
路由節點與某個網絡相連的網卡介面。
由很多路由條目組成,每個條目都指明去往某個網絡的數據包應該經由哪個介面發送,其中最後一條是預設路由條目。
路由表中的一行,每個條目主要由目的網絡地址、子網掩碼、下一跳地址、發送介面四部分組成,如果要發送的數據包的目的網絡地址匹配路由表中的某一行,就按規定的介面發送到下一跳地址。
路由表中的最後一行,主要由下一跳地址和發送介面兩部分組成,當目的地址與路由表中其它行都不匹配時,就按預設路由條目規定的介面發送到下一跳地址。
假設某主機上的網絡介面配置和路由表如下:
$ ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:C2:8D:7E inet addr:192.168.10.223 Bcast:192.168.10.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:10 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:420 (420.0 b) Interrupt:10 Base address:0x10a0 eth1 Link encap:Ethernet HWaddr 00:0C:29:C2:8D:88 inet addr:192.168.56.136 Bcast:192.168.56.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:603 errors:0 dropped:0 overruns:0 frame:0 TX packets:110 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:55551 (54.2 Kb) TX bytes:7601 (7.4 Kb) Interrupt:9 Base address:0x10c0 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:37 errors:0 dropped:0 overruns:0 frame:0 TX packets:37 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3020 (2.9 Kb) TX bytes:3020 (2.9 Kb) $ route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.10.0 * 255.255.255.0 U 0 0 0 eth0 192.168.56.0 * 255.255.255.0 U 0 0 0 eth1 127.0.0.0 * 255.0.0.0 U 0 0 0 lo default 192.168.10.1 0.0.0.0 UG 0 0 0 eth0
這台主機有兩個網絡介面,一個網絡介面連到192.168.10.0/24網絡,另一個網絡介面連到192.168.56.0/24網絡。路由表的Destination是目的網絡地址,Genmask是子網掩碼,Gateway是下一跳地址,Iface是發送介面,Flags中的U標誌表示此條目有效(可以禁用某些條目),G標誌表示此條目的下一跳地址是某個路由器的地址,沒有G標誌的條目表示目的網絡地址是與本機介面直接相連的網絡,不必經路由器轉發,因此下一跳地址處記為*號。
如果要發送的數據包的目的地址是192.168.56.3,跟第一行的子網掩碼做與運算得到192.168.56.0,與第一行的目的網絡地址不符,再跟第二行的子網掩碼做與運算得到192.168.56.0,正是第二行的目的網絡地址,因此從eth1介面發送出去,由於192.168.56.0/24正是與eth1介面直接相連的網絡,因此可以直接發到目的主機,不需要經路由器轉發。
如果要發送的數據包的目的地址是202.10.1.2,跟前三行路由表條目都不匹配,那麼就要按預設路由條目,從eth0介面發出去,首先發往192.168.10.1路由器,再讓路由器根據它的路由表決定下一跳地址。