Ping經過路由器的運行過程解析

閒來無事,就用Packet Tracer 5.0搭建網絡環境模擬一下Ping的運行過程,以此來捋順ARP、ICMP等協議在TCP/IP網絡體系各層上的詳細流程。 用Packet Tracer 5.0搭建如下圖所示的簡化網絡環境: 

PS:以上模擬環境搭建後,arp –a 查看主機A、B都無ARP記錄。A和B都配置正確的網關。然後PCA執行ping PCB動作,PCA:>ping 192.168.1.2 –n 1
 一、在主機PCA端:  

1. Ping處理進程產生一個 ICMP迴應請求(ICMP Echo Request message),ICMP把這個數據段發給網絡層協議進行ip封裝。 
2. IP協議創建一個數據包,其中包含源和目的ip地址、協議字段0x01(告訴接收方主機IP協議,應把這個包中的DATA交由ICMP來處理)。  

3. 數據包創建後,在發出之前,IP協議判斷目的IP,發現192.168.1.2不是本地網絡的地址也不是廣播地址。

4. 在IP判定數據包是發往遠程網絡的之後,就要把數據包發給默認網關處理.

5. 主機A的默認網關被配置爲192.168.0.1,即Router0的F0/0端口。本地局域網通信都是根據MAC地址的,要將數據包發給Router0的F0/0就要知道它的MAC地址。啓動ARP協議。

6. ARP進程查詢PCA主機上的ARP緩存,發現ARP緩存表中沒有192.168.0.1對應的MAC條目。這時ARP暫存數據包併產生一個ARP請求。

7. ARP請求被封裝成幀後被廣播出去,在同一個網絡內的網絡設備都接收這個幀(因爲MAC爲廣播地址)。

二、在Router0端:

8. 和PCA同一子網內的Router0的F0/0網卡接口接收上面到的ARP數據封裝幀後,進行幀校驗(不正確丟棄)後,該幀將被傳送給設備驅動程序。設備驅動程序判斷這是ARP類型數據,就交給ARP協議,ARP協議讀取這個ARP數據,判斷其中TARGET IP(不是自己的丟棄)是不是發給自己的數據。 

9. 目標IP:192.168.0.1,是給自己的數據,ARP進程則讀取數據中的Opcode(操作碼)判斷這是一個ARP請求。然後根據數據裏的SOURCE地址把對方的IP-MAC映像寫入本地ARP緩存表裏,然後產生一個ARP迴應給192.168.0.2(PCA)。 


10. ARP進程把產生的ARP迴應交給數據鏈路層封裝成幀(看上圖),然後交給物理層一位一位發出去。過程類似上面的過程。
  

三、回到主機PCA端:

11. 網卡收到ARP迴應幀後,判斷這個幀,過程類似Router0端接收ARP請求過程。ARP進程從這個迴應數據中讀取source IP-MAC地址映象並寫入本地ARP緩存中。ARP進程將之前暫存的IP數據包和Router0的f0/0的MAC地址交給數據鏈路層,封裝成幀後發出。如下圖:


四、再到Router0端

12. Router0的f0/0接到上面的數據幀後,幀校驗正確後,檢查Destination MAC是給自己的,且TYPE指示幀中數據部分是是IP數據包,所以就把其中的數據部分交給IP協議。IP進程讀取數據包中的目標地址:192.168.1.2,發現它和該路由器配置的任一個接口的IP地址都不匹配。

13. 接下來,路由器在其路由表中查找目的地址192.168.1.2的網絡地址192.168.1.0的表項(如果查不到丟棄並回應一個目標不可達的ICMP給源IP),這裏查到目標網絡是和f0/1接口直接相連的,不需要路由協議,直接把數據包交換到F0/1接口的緩衝區中。注意:交換數據包的過程不改變IP數據包的內容,只把TTL-1=127(因爲經過了一跳)。
 

14. 同樣的,f0/1得到這個數據包後,也要先找到目標IP的MAC地址才能把它交給數據鏈路層封裝成幀。ARP進程查詢路由器上的ARP緩存,發現ARP緩存表中沒有192.168.1.2對應的MAC條目。這時ARP暫存數據包併產生一個ARP請求。過程同PCA主機尋找默認網關MAC,不在詳述。

15. f0/1ARP進程取得目標主機的MAC後,把PCB的映像寫入ARP緩存。並把數據包和目標MAC交給數據鏈路層封裝成幀,發出去。 

 
五、在PCB主機端

16. 在15步之前,PCB收到Router0F0/1(192.168.1.1)的ARP請求後,把F0/1的IP-MAC地址寫入該機ARP 緩存表。

17. PCB接收到Router0 f0/1發來的數據幀後。幀校驗正確後,檢查Destination MAC是給自己的,且TYPE指示幀中數據部分是是IP數據包,所以就把其中的數據部分交給IP協議。

18. IP進程讀取數據包中的目標地址:192.168.1.2,發現是給自己的數據,然後發現PROTOCOL字段(0x01)是ICMP。則把該包中數據部分交給ICMP協議,ICMP進程讀取數據。

19. ICMP進程發現TYPE: 0x8是一個Ping迴應請求。它就應邀產生一個TYPE: 0x0的ICMP(Ping請求響應),然後交給IP協議,IP進程把之前數據包的源IP當目的IP進行封裝,之後檢查這個IP是遠程網絡的。就要交給默認網關處理。調用ARP協議,ARP進程查本機ARP緩存,發現有192.168.1.1(網關)的條目。IP協議從ARP進程得到網關的MAC後,把數據包和MAC地址交給數據鏈路層封裝成幀。然後由物理層發出去。


六、在Router0端

20. F0/1接口收到這個幀後(其實這裏忽略了物理層),經過校驗和檢查MAC,判斷是給自己的正確的幀,且數據內容是IP數據包,就把數據交給IP協議。IP進程發現目標IP不是本地網絡,就查路由表,查到它的網絡地址連接在f0/0接口,就把數據包中TTL-1後交換到F0/0的緩存中。

21. f0/0接口的IP進程檢查從F0/1轉過來的數據包的目的IP,發現在它在自己網絡內。ARP進程從ARP緩存中查到目標ip的MAC後提供給IP協議,IP協議把數據包和MAC再交給數據鏈路層封裝成幀。
  

七、在PCA端

22. PCA主機網卡接口收到f0/0發來的幀後(其實這裏忽略了物理層),經校驗和確認MAC是自己的後,讀取幀類型,發現是IP數據包,就交給IP協議。IP覈對目的IP地址後發現數據包協議字段是ICMP的,就把數據包中數據部分(ICMP報文)交給ICMP協議。ICMP進程發現報文中類型字段是對Ping請求的響應(0x00),然後就把處理響應的結果顯示給正在等待的Ping請求的用戶的屏幕上.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章