天天看點

13.IP路由流程淺析

   TCP/IP 協定簇是目前網際網路應用最廣的協定棧,談到 TCP/IP 協定棧就不能不講一講 IP 路由的問題,因為在我們使用的網絡通信中幾乎每時每刻都在發生着 IP 路由的事件 …… 。當你在網絡世界中還是一位新手的時候,你也許認為裝置之間實作 IP 路由所需的僅僅是一台裝置的 IP 位址而已,如果你真的這樣認為那就錯了。每台裝置在進行 IP 路由的時候除了必需的 IP 位址外還需要很多其他資訊來完成資料的封裝!我将通過以下網絡場景提供的案例一步一步地來分析裝置在進行 IP 路由時将會發生哪些通信事件。

13.IP路由流程淺析

  在這個場景中有兩個網絡,這兩個網絡通過一台具有兩個以太網接口(F0/0,F0/1)的路由器連接配接在一起。路由器的這兩個端口和你自己電腦上的RJ-45型号的網卡端口是一樣的,都是内建在路由器中的。

現在我們來看一看當位于網絡A的主機A想要和位于網絡B的主機B進行通信時都發生了什麼?

      主機A打開指令提示符(具體方法:開始——運作——cmd),指令提示符(>)後輸入ping 1.1.1.5 當“ping”這個指令被計算機執行的時候,TCP/IP協定棧會調用該協定棧網際網路層的“ICMP”協定封裝“ping 1.1.1.5”這個請求。

ICMP協定封裝如下:

ICMP報頭 (主機A) Ping 1.1.1.5

      Host A(主機A)若要将這個ICMP協定封裝的請求發送給目标主機B(Host B)就必須要使用IP協定來“運輸”該請求。這樣,IP協定這個時候就充當了一個郵差的角色,将ICMP這個資料包寫上發送者(主機A)的IP位址和接收者(主機B)的IP位址,然後就可以根據這個目标位址(主機B的位址)來“投遞”這個資料包了。

IP協定封裝如下:

IP報頭 ICMP報頭 (主機A) Ping 1.1.1.5

      經過IP協定封裝的資料包隻是完成了TCP/IP協定簇網絡層上的封裝,接下來要完成的是資料鍊路層的封裝。在進行資料鍊路層的資訊封裝之前主機A還需啟動IP路由程序來判斷目标主機B在本地網絡還是在遠端網絡。若主機B在本地網絡,說明主機B和主機A在同一個邏輯子網中,也就是同一個IP網段内。若主機B在遠端網絡則說明主機B與主機A不在同一個網段内,比如本例中,主機A位于網絡A而主機B位于網絡B。顯而易見,在本例的網絡場景中主機A會判斷出主機B位于遠端網絡。

那麼問題是主機A是如何做出判斷的呢?

      首先主機A将自己的IP位址和子網路遮罩作“與運算”。所謂與運算就是無論是二進制的“0”和“1”相與還是二進制的“0”和“0”相與,得出的結果都為“0”,而隻有二進制“1”和“1”相與得出的結果為“1”。比如本例中,主機A的IP位址為192.168.0.5,将這個IP位址轉換為二進制就是:11000000 10101000 00000000 00000101

      主機A的子網路遮罩為255.255.255.0,将該掩碼轉換為二進制就是:11111111 11111111 11111111 00000000 将主機A二進制形式的IP位址和子網路遮罩作“與運算”的結果是: 11000000 10101000 00000000 00000000

      為了友善檢視将這個“與運算”的結果再轉換為點分十進制的數就是:192.168.0.0      這樣主機A就通過“與運算”完成了IP路由判斷的第一步。

接下來的第二步是将目标主機(主機B)的IP位址與發送方(主機A)的子網路遮罩作“與運算”,比如本例中,主機B的IP位址為1.1.1.5,将這個IP位址轉換為二進制就是:00000001 00000001 00000001 00000101

      主機A的子網路遮罩為255.255.255.0将該掩碼轉換為二進制就是:11111111 11111111 11111111 00000000 将以上兩組二進制的數進行“與運算”的結果是:00000001 00000001 00000001 00000000 将這個“與運算”的結果轉換為點分十進制的數就是:1.1.1.0 這樣我們就得到了兩組“與運算”的結果,分别是:192.168.0.0和1.1.1.0

      對于主機A來說,經過這樣一番“與運算”後,如果兩個“與運算”結果相同,則說明目标主機B和自己在同一個網絡内,即目标主機B在本地網絡。相反地,對于主機A來說,經過這樣一番“與運算”後,如果兩個“與運算”結果不同,則說明目标主機B和自己不在同一個網絡内,即目标主機B在遠端網絡。在本例中,很顯然目标主機B對于發送方(主機A)來說在遠端網絡——也就是在網絡B。

      主機A通過以上與目标主機B略顯複雜的“與運算”後,完成了路由判斷的第一步——判斷出了目标主機B在遠端網絡。接下來主機A需要“思考”的是如何才能夠到達主機B所在的網絡?主機A首先會查詢自己的路由表,看在自己的路由表中能否找到去往目标網絡(網絡B)的路由條目。為了友善大家了解,我将主機A的路由表輸出顯示如下:

13.IP路由流程淺析

  從主機A路由表的輸出顯示中我們沒有找到與目标主機B所在的網絡相比對的具體路由,也就是說主機A沒有到達1.1.1.0這個網絡的路由。但是我們注意到在該路由表的最後一行輸出的是:  DefaultGateway(預設/預設網關):192.168.0.1 路由表最後一行的輸出說明主機A在沒有找到能夠到達目标網絡的具體路由的情況下,會将發往目标網絡的資料包發送到預設/預設網關(192.168.0.1),由這個預設/預設網關再将該資料包轉發到目标網絡。

      好了,現在主機A知道了預設網關(192.168.0.1)是自己的下一跳位址,主機A開始執行封裝。封裝資訊如下:

目的MAC:

下一跳裝置的MAC

源MAC:

主機A的MAC位址

源IP:

192.168.0.5

目的IP:

1.1.1.5

ICMP報頭

(主機A)

Ping 1.1.1.5

      在以上所封裝的尋址資訊當中,主機A唯一不知道的就是“下一跳裝置的MAC位址”,這裡的“下一跳裝置MAC位址”是指主機A的預設網關192.168.0.1的F0/0接口的MAC位址。這裡容易讓人産生一個困惑,主機A的目的IP位址是主機B,那麼為什麼主機A封裝的鍊路層的目的MAC位址卻是路由器F0/0的MAC位址呢?原因是當初人們在設計資料鍊路層時主要考慮如何解決一條線路上相鄰兩端裝置之間的通信。

      從這個網絡場景中我們看到主機A和主機B從各自所處的實體位置上看并不屬于相鄰的兩台裝置(中間隔着一台路由器)。既然主機B并不是主機A直接相鄰的裝置,那麼主機A在資料鍊路層封裝的目的MAC位址當然就不可能是主機B了。

主機A通過IP路由的流程判斷和查詢路由表知道要想到達主機B就必須将資料包發給路由器A的F0/0接口(F0/0接口也是主機A到達主機B必經的直接相鄰的接口),是以F0/0的MAC位址就成為主機A在資料鍊路層封裝的目的MAC位址。在本例中假如主機A要給ServerA發送資料而不是給主機B,那麼主機A在資料鍊路層封裝的目的MAC位址就是Server A的MAC位址,因為Server A與主機A是彼此直接相鄰的裝置。那麼對于主機A來說它是否知道路由器F0/0接口的MAC位址呢?主機A是不知道的。是以接下來主機A需要做的是如何才能找到F0/0接口的MAC位址以完成資料鍊路層的封裝成幀。

首先主機A檢視自己的ARP快取記錄,每台主機/電腦都有這個ARP快取記錄,該緩存表記錄着與自己發生過通信的所有的直接相鄰裝置或主機的硬體位址(MAC位址),ARP快取記錄經過一段時間會自動删除,比如Windows的動态 ARP 緩存條目不超過 10 分鐘就會被删除。如果主機A與路由器之前曾發生過通信,主機A自然能在ARP快取記錄中找到路由器F0/0的硬體MAC位址,可是如果這是主機A與路由器的第一次通信,則主機A會向網絡A上發送ARP廣播請求資料包,該ARP請求包包含的關鍵資訊如下:

發送方IP位址(192.168.0.5) 發送方MAC位址(主機A MAC位址)
目的IP位址(192.168.0.1) 目的MAC位址(000000000000)

      以上ARP請求包中封裝的三項資訊都是已知的,隻有“目的MAC位址”這一資訊是未知的(全“0”填充)。當該ARP請求包發送到網絡A上時,網絡A上的裝置接收該ARP包并檢視該ARP包内的具體封裝資訊。因為該ARP包中封裝的目的IP位址是192.168.0.1,是以隻有具有192.168.0.1這個IP的接口或裝置才應答該ARP查詢請求,應答者會将自己的硬體MAC位址封裝到這個ARP應答資料包中。

這個ARP應答資料包(本例中由路由器F0/0接口發出ARP應答)封裝的關鍵資訊如下:

發送方IP位址(192.168.0.1) 發送方MAC位址(F0/0接口MAC位址)
目的IP位址(192.168.0.5) 目的MAC位址(主機A的MAC位址)

      主機A通過ARP協定解析出路由器F0/0接口的MAC位址進而完成了資料鍊路層的封裝。通過主機A這個解析過程大家可以看到主機A在第一次與預設網關通信時的确是費了一番周折,為了找到預設網關F0/0接口的MAC位址也“耽擱”了一些時間,這也是為什麼我們在第一次ping網絡上某台主機/裝置的時候通常會看到第一個資料包會出現“requesttimed out!”(請求逾時!)的情況。最後主機A完成MAC位址解析後将該幀發送到網絡A上,該幀的具體封裝如下:

目的MAC:

路由器F0/0接口

源MAC:

主機A的MAC位址

源IP:

192.168.0.5

目的IP:

1.1.1.5

ICMP報頭 (主機A) Ping 1.1.1.5

      因為該幀的目的MAC位址是F0/0的MAC位址,是以隻有路由器的F0/0接口接收并處理該資料幀。路由器将該幀解封裝并檢視網絡層的封裝資訊,路由器看到該資料包網絡層封裝的目的位址是1.1.1.5。路由器為了将這個資料包轉發到1.1.1.5,使用前面提到的“與運算”的方法進行計算,依據計算結果判斷目标位址1.1.1.5對于路由器自己來說在本地網絡還是在遠端網絡。路由器所做“與運算”過程簡述如下:

      路由器的F0/0接口上的IP位址192.168.0.1與F0/0接口的子網路遮罩255.255.255.0作“與運算”得到“結果1”;目标位址1.1.1.5與路由器F0/0接口的子網路遮罩255.255.255.0作“與運算”得到“結果2”;“結果1”與“結果2”并不相同,證明目标位址1.1.1.5并不處在路由器的F0/0接口所在的網絡A。

      路由器的另一個接口F0/1的IP位址1.1.1.1與F0/1接口的子網路遮罩255.255.255.0作“與運算”得到“結果3”;目标位址1.1.1.5與F0/1接口上

的子網路遮罩255.255.255.0作“與運算”得到“結果4”;“結果3”與“結果4”相同,證明目标位址1.1.1.5處在路由器的F0/1接口所在的網絡B。這也就意味着路由器B隻需将發送給1.1.1.5的資料包從F0/1接口發出去就OK了。我們将路由器的這種路由稱為直接路由。

      路由器得出上述結論後立刻執行封裝,封裝的具體資訊如下:

目的MAC:

主機B的MAC位址

源MAC:

路由器F0/1接口

源IP位址

192.168.0.5

目的IP位址

1.1.1.5

ICMP報頭 (主機A) Ping 1.1.1.5

      在以上路由器封裝的具體資訊中的目的MAC位址是主機B的MAC位址。

如果路由器在ARP快取記錄中并未查到主機B的硬體MAC位址,則路由器仍然會像主機A查詢路由器F0/0接口硬體MAC位址一樣發送ARP請求來查詢主機B的MAC位址。

關于路由器對主機B 硬體MAC位址的查詢過程在這裡就不再重複了。

      這樣主機B就收到了該資料幀,主機B對該幀進行解封裝看到了網絡層封裝的目的IP位址,知道這個資料包的目的地是自己後,主機B繼續對其拆封裝并檢視ICMP報頭内的資訊得出結論:這是一個請求自己進行回報的資料包,需要自己将這條“資料包已到達主機B”的資訊回饋給主機A。

是以主機B為了将回饋資訊順利送達主機A需要經過如封裝:

目的MAC:

路由器F0/1接口

源MAC:

主機B的MAC位址

源IP:

1.1.1.5

目的IP:

192.168.0.5

ICMP報頭 對(主機A) Ping 1.1.1.5的應答

      主機B在發送應答資料包時封裝的目的MAC位址是路由器F0/1接口的MAC位址,這也是主機B通過路由判斷和與運算得出的結論,對于主機B來說路由器F0/1接口是它的下一跳。

     路由器F0/1接口在收到主機B發來的資料包後為了将其轉發給主機A再次進行封裝,具體的封裝資訊如下:

目的MAC:

主機A的MAC位址

源MAC:

路由器F0/0接口

源IP:

1.1.1.5

目的IP:

192.168.0.5

ICMP報頭 對(主機A) Ping 1.1.1.5的應答

      從主機A到路由器再到主機B執行的封裝過程中我們可以看出網絡層封裝的資訊是始終不變的:源IP是192.168.0.5 目的IP是1.1.1.5。始終變化的是一跳一跳的硬體MAC位址。從主機B到路由器再到主機A執行的封裝過程中我們同樣可以看出網絡層封裝的資訊也是始終不變的:源IP是1.1.1.5目的IP是192.168.0.5。始終變化的還是一跳一跳的硬體MAC位址。

      總結一下這個流程:

1:A:192.168.0.5要發送到B:1.1.1.5。首先與自己的子網路遮罩:255.255.255.0,分别做與運算。若結果相同,則B是同一網絡,則直接通過ARP協定直接查MAC位址跳轉即可。否則,繼續以下步驟。

2:首先查詢A的路由表,看是否去往目标網絡(網絡B)的路由條目,若有,則直接申請MAC位址跳轉即可,否則,繼續以下步驟。

3:直接跳轉到預設位址:路由位址:A’:192.168.0.1。此時A需要獲得A’的MAC位址,通過ARP協定,釋出通知,A’收到後,傳回自己的MAC位址。然後A包裝後,跳轉。

4:A’收到A的跳轉後,解封,看到了B的目的IP。B與A’做與,看A’是否為B的預設位址,若是,則請求B的MAC位址,然後再進行跳轉,若不是,則看有沒有另外一個接口B’:1.1.1.1的,剛好是B的預設位址,有的話,則B’再通過查找MAC步驟,把B的MAC位址傳回,再從該B’的接口跳轉到B,完成,該步驟稱為直接路由。否則,繼續以下步驟。

5:通過路由各種尋址方法找到找B,重複上面找的步驟。直到一跳一跳到B所在的卻省接口B’,再通過MAC找到B。

6:B給反應,也是類似的,相反的步驟。

13.IP路由流程淺析