一、概覽
當我們檢查網絡情況的時候,最先使用的命令肯定是 ping 命令。一般我們用 ping 查看網絡情況,主要是檢查兩個指標,第一個是看看是不是超時,第二個看看是不是延遲太高。如果超時那麼肯定是網絡有問題啦(禁 ping 情況除外),如果延遲太高,網絡情況肯定也是很糟糕的。那麼對於 ping 命令的原理,以及ping 是如何檢查網絡的?大家之前有了解嗎?接下來簡述 ping 是如何工作的。
二、環境準備和抓包
2.1 環境準備
- 抓包工具:本文使用 Wireshark。
- 準備兩臺電腦,進行 ping 的操作。
A 電腦:192.168.1.135 ,MAC 地址:98:22:EF:E8:A8:87
B 電腦:192.168.2.179 ,MAC 地址:90:A4:DE:C2:DF:FE
2.2 抓包操作
打開 Wireshark,選取指定的網卡進行抓包,進行 ping 操作,在 A 電腦上 ping B 電腦的 ip。
抓包情況如下:
先簡單的介紹下 Wireshark 的控制面板,這個面板包含 7 個字段,分別是:
(1)NO:編號
(2)Time:包的時間戳
(3)Source:源地址
(4)Destination:目標地址
(5)Protocol:協議
(6)Length:包長度
(7)Info:數據包附加信息
三、深入解析
上圖中抓包編號 54-132 顯示的就是整個 ping 命令的過程,我們知道 ping 命令不是依託於 TCP 或者 UDP 這種傳輸層協議的,而是依託於 ICMP 協議實現的,先簡單介紹下ICMP協議:
3.1 ICMP 協議的產生背景
[RFC792] 中說明了 ICMP 產生的原因:由於互聯網之間通訊會涉及很多網關和主機,爲了能夠報告數據錯誤,所以產生了 ICMP 協議。也就是說 ICMP 協議就是爲了更高效的轉發 IP 數據報和提高交付成功的機會。
3.2 ICMP 協議的數據格式
ICMP 協議頭包含 4 個字節,頭部主要用來說明類型和校驗 ICMP 報文。下圖是對應的類型和代碼釋義列表,我們後面分析抓包的時候會用到。
簡單介紹完了 ICMP,那麼抓包過程中出現的 ARP 協議是什麼呢?我們同樣來簡單解釋下:
3.3 ARP 協議
在一個局域網中,計算機通信實際上是依賴於 MAC 地址進行通信的,那麼 ARP(Address Resolution Protocol)的作用就是根據 IP 地址查找出對應 ip 地址的 MAC 地址。
3.4 Ping 過程解析
瞭解了上面的基礎概念後,我們來分析下抓包的數據。圖 b 的流程如下:
(1)A 電腦(192.168.2.135)發起 ping 請求,ping 192.168.2.179。
(2)A 電腦廣播發起 ARP 請求,查詢 192.168.2.179 的 MAC 地址。
(3)B 電腦應答 ARP 請求,向 A 電腦發起單向應答,告訴 A 電腦自己的 MAC 地址爲 90:A4:DE:C2:DF:FE。
知道了 MAC 地址後,開始進行真正的 ping 請求,由於 B 電腦可以根據 A 電腦發送的請求知道源 MAC 地址,所有就可以根據源 MAC 地址進行響應了。
上面的請求過程畫成流程圖比較直觀一點:
觀察仔細的朋友可能已經發現,Ping4 次請求和響應結束後,還有一次 B 電腦對 A 電腦的 ARP 請求,這是爲什麼呢?我們猜測應該是有 2 個原因:
- 由於 ARP 有緩存機制,爲了防止 ARP 過期,結束後重新更新下 ARP 緩存,保證下次請求能去往正確的路徑,如果 ARP 過期就會導致出現一次錯誤,從而影響測試準確性。
- 由於 ping 命令的響應時間是根據請求包和響應包的時間戳計算出來的,所以一次 ARP 過程也是會消耗時間。這裏提前緩存最新的 ARP 結果就是節省了下次 ping 的 arp 時間。
爲了驗證我們的猜測,我再進行一次 ping 操作,抓包看看是不是和我們猜測的一樣。此時,計算機裏面已經有了 ARP 的緩存,我們執行 ARP -a 看看緩存的 arp 列表:
我們看看第二次 ping 的抓包:
我們看到上圖中在真正 ping 之前並沒有進行一次 ARP 請求,這也就是說,直接拿了緩存中的 arp 來執行了,另外當 B 計算機進行響應之前還是進行了一次 ARP 請求,它還是要確認下之前的 ARP 緩存是否爲正確的。然後結束 ping 操作之後,同樣在發一次 ARP 請求,更新下自己的 ARP 緩存。這裏和我們的猜想基本一致。
弄懂了 ping 的流程之後我們來解析下之前解釋的 ICMP 數據結果是否和抓包的一致。我們來點擊一個 ping request 看看 ICMP 協議詳情:
圖中紅框內就行 ICMP 協議的詳情了,這裏的 Type=8, code=0, 校驗是正確。我們對比就知道了這是一個請求報文。我們再點擊 Response frame:57,這裏說明響應報文在序號 57。詳情如下:
上圖的響應報文,Type=0, code=0。這裏知道就是響應報文了,然後最後就是根據請求和響應的時間戳計算出來的響應延遲。3379.764 ms-3376.890 ms=2.874 ms。
四、總結
通過分析一次完整的 ping 請求過程,我們明白了ping 命令是依託於 ICMP 協議的,ICMP 協議的存在就是爲了更高效的轉發 IP 數據報和提高交付成功的機會。
ping 命令除了依託於 ICMP,在局域網下還要藉助於 ARP 協議,ARP 協議能根據 IP 地址查出計算機 MAC 地址。ARP 是有緩存的,爲了保證 ARP 的準確性,計算機會更新 ARP 緩存。