對於ping命令,想必只要是程序員都知道吧?當咱們檢查網絡狀況的時候,最早使用的命令確定是ping命令吧?通常咱們用ping查看網絡狀況,主要是檢查兩個指標,第一個是看看是否是超時,第二個看看是否是延遲過高。若是超時那麼確定是網絡有問題啦(禁ping狀況除外),若是延遲過高,網絡狀況確定也是很糟糕的。那麼對於ping命令的原理,ping是如何檢查網絡的?你們以前有了解嗎?接下來咱們來跟着ping命令走一圈,看看ping是如何工做的。html
2.1 環境準備程序員
1.抓包工具。我這裏使用Wireshark。編程
2.我準備了兩臺電腦,進行ping的操做。 ip地址分別爲:設計模式
A電腦:192.168.2.135緩存
mac地址:98:22:EF:E8:A8:87網絡
B電腦:192.168.2.179工具
MAC:90:A4:DE:C2:DF:FEpost
2.2 抓包操做測試
打開 Wireshark,選取指定的網卡進行抓包,進行ping操做,在A電腦上ping B電腦的ip計算機網絡
抓包狀況以下:
這裏先簡單的介紹下Wireshark的控制面板,這個面板包含7個字段,分別是:
上圖中抓包編號54-132顯示的就是整個ping命令的過程,咱們知道ping命令不是依託於TCP或者UDP這種傳輸層協議的,而是依託於ICMP協議實現的, 那麼什麼是ICMP協議呢?這裏簡單介紹下:
3.1 ICMP協議的產生背景
[RFC792]中說明了ICMP產生的緣由:因爲互聯網之間通信會涉及不少網關和主機,爲了可以報告數據錯誤,因此產生了ICMP協議。也就是說ICMP協議就是爲了更高效的轉發IP數據報和提升交付成功的機會。
3.2 ICMP協議的數據格式
3.3 ARP協議
咱們知道,在一個局域網中,計算機通訊其實是依賴於MAC地址進行通訊的,那麼ARP(Address Resolution Protocol)的做用就是根據IP地址查找出對應ip地址的MAC地址。
3.4 Ping過程解析
瞭解了上面的基礎概念後,咱們來分析下抓包的數據。圖b的流程以下:
上面的請求過程我畫成流程圖比較直觀一點:
觀察仔細的朋友可能已經發現,Ping4次請求和響應結束後,還有一次B電腦對A電腦的ARP請求,這是爲何呢?這裏我猜想應該是有2個緣由:
1.因爲ARP有緩存機制,爲了防止ARP過時,結束後從新更新下ARP緩存,保證下次請求能去往正確的路徑,若是ARP過時就會致使出現一次錯誤,從而影響測試準確性。
2.因爲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協議詳情
上圖的響應報文,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緩存。
《計算機網絡》
設計模式:
Java集合:
《帶你走進Java集合之ConcurrentHashMap》
NIO:
Java鎖: