網絡環境如圖1所示。PC1基本配置:IP為 172.16.20.8,掩碼為255.255.255.0,網關為172.16.20.254;PC2基本配置:IP為172.16.20.58掩碼為255.255.255.0,網關為172.16.20.254。下面進行兩個實驗說明。
實驗1:默認路由配置下PC1與PC2的通信。
在PC1上PING 172.16.20.58。PC1根據自己的子網掩碼判斷PC2跟自己同一網段,ARP請求172.16.20.58的MAC地址。三層封裝IP地址 172.16.20.58,二層封裝172.16.20.58的MAC地址,發送相關數據。

圖1 網絡拓撲圖

圖2 封裝對應IP的真實MAC

圖3 路由配置

圖4 封裝對應網關IP的MAC
分析:PC1跟PC2通信的時候二層的MAC地址封裝的是 PC2( 172.16.20.58),對應的 MAC(真實 MAC);這個通過抓包可以得到驗證,如圖2。任何一個主機(或三層網卡)跟目的IP通信的時候,網絡層的IP已定,那就是目的IP地址,但是二層(數據鏈路層)的地址是未知的,需要用ARP協議去獲取。通常情況下二層的地址有兩種可能性:目的IP對應的真實MAC或自己網關的MAC。
在上述實驗的默認路由配 置 下,172.16.20.0目 標網絡的下一跳(網關)是在鏈路上,即出接口,因為在Windows XP及之前的操作系統下路由表顯示的網關就是接口地址172.16.20.8。這種情況下就是封裝真實IP對應的MAC。
實驗2:用戶路由配置下PC1與PC2的通信。
先來增加一條路由配置:
route add 172.16.20.58 mask 255.255.255.255172.16.20.254。
如圖3所示,這里增加了一條路由配置,當PC1與PC2通信時,發現目的IP為172.16.20.58的 下一跳并不是在鏈路上,而是直接指向了網關的地址172.16.20.254,這樣二層MAC地址封裝的就是網關的MAC,如圖4所示。
網絡環境及配置如圖5所示。PC1基 本 配 置IP為172.16.20.8,掩 碼 為255.255.255.0,網 關為 172.16.20.254;PC2基本配置 IP為 172.16.12.1,掩碼 為 255.255.255.0,網 關為 172.16.12.254;PC3基本配置 IP為 172.16.10.3,掩碼為255.255.255.0,網關為172.16.10.254。
實驗1:默認路由配置下PC1與PC3的通信。
PC1根據自己的子網掩碼判斷PC3跟自己不在同一網段(實質上是默認路由里沒有下一跳IP地址), ARP請求網關172.16.20.254 的mac地址。三層封裝IP地址172.16.10.3,二層封裝172.16.20.254的mac地址,發送相關數據,如圖6所示。
實驗2:用戶路由配置下PC1與PC2的通信。
在默認情況下,PC1與PC2肯定是不通的,因為從它們的網絡配置來看分別屬于不同的網段,PC1會將到PC2的數據發送到自己的網關172.16.20.254,而在網關設備上沒有172.16.12.0的路由接口,所以最后無法完成連通。按照以往的觀點在沒有路由設備的情況下是無法連通的。
下面我們通過改變默認的路由配置來顛覆由來以久的觀點。
在 PC1上 配 置route add 172.16.12.0 mask 255.255.255.255172.16.20.8。

圖5 網絡拓撲圖

圖6 封裝網關的IP

圖7 封裝IP真實的MAC
在 PC2上 配 置route add 172.16.20.0 mask 255.255.255.255172.16.12.1。
通過以上的路由配置是將到特定網絡地址的數據直接發送到自己接口上,不通過自己的網關接口。
在PC1上 運 行PING為172.16.12.1竟然連通了。
從抓包數據來看,二層封裝的MAC是PC2真實的MAC,三層封裝IP是172.16.12.1,如圖7所示,而且中間沒有經過任何路由設備了。
結語:從以上四個實驗對比來看,最終選用哪個MAC地址進行二層封裝,并不是靠判斷目的IP是否跟自己同一網段,而是靠查看路由表:如果目的IP對應的路由的下一跳(網關)是出接口(僅有出接口,Windows XP顯示的就是自己的IP地址,Windows 7及以上系統顯示的是在鏈路上),則ARP請求目的IP的MAC;如果目的IP對應路由的下一跳是一個IP地址,則ARP請求下一跳IP的MAC。