5. IP地址與路由

IPv4的IP地址長度為4位元組,通常採用點分十進製表示法(dotted decimal representation)例如0xc0a80002表示為192.168.0.2。Internet被各種路由器和網關設備分隔成很多網段,為了標識不同的網段,需要把32位的IP地址劃分成網絡號和主機號兩部分,網絡號相同的各主機位於同一網段,相互間可以直接通信,網絡號不同的主機之間通信則需要通過路由器轉發。

過去曾經提出一種劃分網絡號和主機號的方案,把所有IP地址分為五類,如下圖所示(該圖出自[TCPIP])。

圖 36.9. IP地址類

IP地址類

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.688C FC 14 44
子網掩碼255.255.255.0FF FF FF 00
網絡號140.252.20.08C FC 14 00
子網地址範圍140.252.20.0~140.252.20.255 

表 36.2. 劃分子網的例子2

IP地址140.252.20.688C FC 14 44
子網掩碼255.255.255.240FF FF FF F0
網絡號140.252.20.648C 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上,如下表所示。

使用私有IP地址的區域網路主機雖然沒有Internet的IP地址,但也可以通過代理伺服器或NAT(網絡地址轉換)等技術連到Internet上。

除了私有IP地址之外,還有幾種特殊的IP地址。127.*的IP地址用於本機環回(loop back)測試,通常是127.0.0.1。loopback是系統中一種特殊的網絡設備,如果發送數據包的目的地址是環回地址,或者與本機其它網絡設備的IP地址相同,則數據包不會發送到網絡介質上,而是通過環回設備再發回給上層協議和應用程序,主要用於測試。如下圖所示(該圖出自[TCPIP])。

圖 36.10. loopback設備

loopback設備

還有一些不能用作主機IP地址的特殊地址:

下面介紹路由的過程,首先正式定義幾個名詞:

路由(名詞)

數據包從源地址到目的地址所經過的路徑,由一系列路由節點組成。

路由(動詞)

某個路由節點為數據報選擇投遞方向的選路過程。

路由節點

一個具有路由能力的主機或路由器,它維護一張路由表,通過查詢路由表來決定向哪個介面發送數據包。

介面

路由節點與某個網絡相連的網卡介面。

路由表

由很多路由條目組成,每個條目都指明去往某個網絡的數據包應該經由哪個介面發送,其中最後一條是預設路由條目。

路由條目

路由表中的一行,每個條目主要由目的網絡地址、子網掩碼、下一跳地址、發送介面四部分組成,如果要發送的數據包的目的網絡地址匹配路由表中的某一行,就按規定的介面發送到下一跳地址。

預設路由條目

路由表中的最後一行,主要由下一跳地址和發送介面兩部分組成,當目的地址與路由表中其它行都不匹配時,就按預設路由條目規定的介面發送到下一跳地址。

假設某主機上的網絡介面配置和路由表如下:

$ 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路由器,再讓路由器根據它的路由表決定下一跳地址。