當你 ping命令的時候,你知道背後發生了什麼嗎?

1.概覽


對於 ping命令,想必只大家都知道吧?當我們檢查網絡情況的時候,最先使用的命令肯定是 ping命令吧?一般我們用 ping查看網絡情況,主要是檢查兩個指標:


  • 第一個是看看是不是超時
  • 第二個看看是不是延遲太高

如果超時那麼肯定是網絡有問題(禁 ping情況除外);如果延遲太高,網絡情況肯定也是很糟糕的。

那麼對於 ping命令的原理, ping是如何檢查網絡的?大家之前有了解嗎?接下來我們來跟著 ping命令走一圈,看看 ping是如何工作的。


2.環境準備和抓包


  • 環境準備

抓包工具:Wireshark 準備兩臺電腦,進行互 ping操作:

  1. A電腦(IP地址: 192.168.2.135 / MAC地址: 98:22:EF:E8:A8:87)
  2. B電腦(IP地址: 192.168.2.179 / MAC地址: 90:A4:DE:C2:DF:FE)
  • 抓包操作

打開 Wireshark,選取指定的網卡進行抓包,進行 ping操作,在 A電腦上 ping B電腦的 IP

當你 ping命令的時候,你知道背後發生了什麼嗎?

抓包情況如下:

當你 ping命令的時候,你知道背後發生了什麼嗎?

這裡先簡單的介紹下Wireshark的控制面板,這個面板包含7個字段,分別是:

  • NO: 編號
  • Time: 包的時間戳
  • Source: 源地址
  • Destination: 目標地址
  • Protocol: 協議
  • Length: 包長度
  • Info: 數據包附加信息


3.深入解析


上圖中抓包編號 54-132 顯示的就是整個 ping命令的過程,我們知道 ping命令不是依託於 TCP或者 UDP這種傳輸層協議的,而是依託於 ICMP協議實現的, 那麼什麼是 ICMP 協議呢?這裡簡單介紹下:


  • ICMP協議的產生背景

[RFC792]中說明了 ICMP產生的原因:由於互聯網之間通訊會涉及很多網關和主機,為了能夠報告數據錯誤,所以產生了 ICMP協議。也就是說 ICMP 協議就是為了更高效的轉發 IP數據報和提高交付成功的機會。

  • ICMP協議的數據格式
當你 ping命令的時候,你知道背後發生了什麼嗎?

根據上圖我們知道了 ICMP協議頭包含 4個字節,頭部主要用來說明類型和校驗 ICMP報文。下圖是對應的類型和代碼釋義列表,我們後面分析抓包的時候會用到。

當你 ping命令的時候,你知道背後發生了什麼嗎?

簡單介紹完了 ICMP,那麼抓包過程中出現的 ARP協議是什麼呢?我們同樣來簡單解釋下:

  • ARP協議

我們知道,在一個局域網中,計算機通信實際上是依賴於 MAC地址進行通信的,那麼 ARP( AddressResolutionProtocol)的作用就是根據 IP地址查找出對應的 MAC地址。

  • Ping過程解析

瞭解了上面的基礎概念後,我們來分析下抓包的數據,其流程如下:

  1. A 電腦( 192.168.2.135)發起 ping請求, ping192.168.2.179
  2. A 電腦廣播發起 ARP請求,查詢 192.168.2.179的 MAC地址。
  3. B 電腦應答 ARP請求,向 A電腦發起單向應答,告訴 A電腦自己的 MAC地址為 90:A4:DE:C2:DF:FE
  4. 知道了 MAC地址後,開始進行真正的 ping請求,由於 B電腦可以根據A電腦發送的請求知道 源 MAC地址,所以就可以根據源 MAC地址進行響應了。

上面的請求過程我畫成流程圖比較直觀一點:

當你 ping命令的時候,你知道背後發生了什麼嗎?

觀察仔細的朋友可能已經發現,Ping 4次請求和響應結束後,還有一次 B電腦對 A電腦的 ARP請求,這是為什麼呢?這裡我猜測應該是有 2個原因:

  • 由於 ARP有緩存機制,為了防止 ARP過期,結束後重新更新下 ARP緩存,保證下次請求能去往正確的路徑,如果 ARP過期就會導致出現一次錯誤,從而影響測試準確性。
  • 由於 ping命令的響應時間是根據請求包和響應包的時間戳計算出來的,所以一次 ARP過程也是會消耗時間。這裡提前緩存最新的 ARP結果就是節省了下次 ping的 ARP時間。

為了驗證我們的猜測,我再進行一次 ping操作,抓包看看是不是和我們猜測的一樣。此時,計算機裡面已經有了ARP的緩存,我們執行 ARP-a 看看緩存的arp列表:

當你 ping命令的時候,你知道背後發生了什麼嗎?

我們看看第二次 ping的抓包

當你 ping命令的時候,你知道背後發生了什麼嗎?

我們看到上圖中在真正 ping之前並沒有進行一次 ARP請求,這也就是說,直接拿了緩存中的 ARP來執行了,另外當 B計算機進行響應之前還是進行了一次 ARP請求,它還是要確認下之前的 ARP緩存是否為正確的。然後結束ping操作之後,同樣再發一次 ARP請求,更新下自己的 ARP緩存。這裡和我們的猜想基本一致。

弄懂了 ping的流程之後我們來解析下之前解釋的 ICMP數據結果是否和抓包的一致。我們來點擊一個 ping request看看 ICMP協議詳情

當你 ping命令的時候,你知道背後發生了什麼嗎?

圖中紅框內就行 ICMP協議的詳情了,這裡的 Type=8,code=0, 校驗是正確,且這是一個請求報文。我們再點擊Responseframe:57,這裡說明響應報文在序號 57。詳情如下:

當你 ping命令的時候,你知道背後發生了什麼嗎?

上圖的響應報文, Type=0,code=0,這裡知道就是響應報文了,然後最後就是根據請求和響應的時間戳計算出來的響應延遲。 3379.764ms-3376.890ms=2.874ms。

4.總結


我們分析了一次完整的 ping請求過程, ping命令是依託於 ICMP協議的, ICMP協議的存在就是為了更高效的轉發 IP數據報和提高交付成功的機會。 ping命令除了依託於 ICMP,在局域網下還要藉助於 ARP協議, ARP協議能根據 IP地址反查出計算機的 MAC地址。另外 ARP是有緩存的,為了保證 ARP的準確性,計算機會更新ARP緩存。

學了這個,以後面試再問 ping的詳細過程,應該就比較穩了吧!!!


分享到:


相關文章: