IP包通過的接力簡析
IP包的傳輸要通過路由器的接力。每一個主機和路由中都存有一個路由表(routing table)。路由表根據目的地的IP地址,規定了等待發送的IP包所應該走的路線。就好像下圖的路標,如果地址是“東京”,那麼請轉左;如果地址是“悉尼”,那麼請向右。
A real world routing table
比如我們從主機145.17生成發送到146.21的IP包:鋪開信紙,寫好信的開頭(剩下數據部分可以是TCP包,可以是UDP包,也可以是任意亂寫的字,我們暫時不關心),注明目的地IP地址(199.165.146.21)和發出地IP地址(199.165.145.17)。主機145.17隨後參照自己的routing table,裡面有三行記錄:
145.17 routing table (Genmask為子網掩碼,Iface用於說明使用哪個網卡接口)
Destination Gateway Genmask Iface
199.165.145.0 0.0.0.0 255.255.255.0 eth0
0.0.0.0 199.165.145.17 0.0.0.0 eth0
這裡有兩行記錄。
第一行表示,如果IP目的地是199.165.145.0這個網絡的主機,那麼只需要自己在eth0上的網卡直接傳送(“本地社區”:直接送達),不需要前往router(Gateway 0.0.0.0 = “本地送信”)。
第二行表示所有不符合第一行的IP目的地,都應該送往Gateway 199.165.145.17,也就是中間router接入在eth0的網卡IP地址(郵局在eth0的分支)。
我們的IP包目的地為199.165.146.21,不符合第一行,所以按照第二行,發送到中間的router。主機145.17會將IP包放入幀的payload,並在幀的頭部寫上199.165.145.17對應的MAC地址,這樣,就可以按照小喇叭中的方法在局域網中傳送了。
中間的router在收到IP包之後(實際上是收到以太協議的幀,然後從幀中的payload讀取IP包),提取目的地IP地址,然後對照自己的routing table:
Destination Gateway Genmask Iface
199.165.145.0 0.0.0.0 255.255.255.0 eth0
199.165.146.0 0.0.0.0 255.255.255.0 eth1
0.0.0.0 199.165.146.8 0.0.0.0 eth1
從前兩行我們看到,由於router橫跨eth0和eth1兩個網絡,它可以直接通過eth0和eth1上的網卡直接傳送IP包。
第三行表示,如果是前面兩行之外的IP地址,則需要通過eth1,送往199.165.146.8(右邊的router)。
我們的目的地符合第二行,所以將IP放入一個新的幀中,
在幀的頭部寫上199.165.146.21的MAC地址,直接發往主機146.21。
(在下,可以使用$route -n來查看routing table)
IP包可以進一步接力,到達更遠的主機。IP包從主機出發,根據沿途路由器的routing table指導,在router間接力。IP包最終到達某個router,這個router與目標主機位於一個局域網中,可以直接建立連接層的通信。最後,IP包被送到目標主機。這樣一個過程叫做routing(我們就叫IP包接力好了,路由這個詞實在是混合了太多的意思)。
整個過程中,IP包不斷被主機和路由封裝入幀(信封)並拆開,然後借助連接層,在局域網的各個NIC之間傳送幀。整個過程中,我們的IP包的內容保持完整,沒有發生變化。最終的效果是一個IP包從一個主機傳送到另一個主機。利用IP包,我們不需要去操心底層(比如連接層)發生了什麼。