當網絡不通的情況下,通常會想到ping命令,ping一下,但是ping命令內部如何執行的,可能並不清楚,其實ping是基於ICMP協議進行工作的。
一、ICMP協議的格式
ICMP是在RFC 792中定義的互聯網協議族之一。通常用於返回的錯誤信息或是分析路由。ICMP錯誤消息總是包括了源數據並返回給發送者。 ICMP錯誤消息的例子之一是TTL值過期。每個路由器在轉發數據報的時候都會把IP包頭中的TTL值減1。如果TTL值為0,“TTL在傳輸中過期”的消息將會回報給源地址。 每個ICMP消息都是直接封裝在一個IP數據包中的,因此,和UDP一樣,ICMP是不可靠的。
ping是基於ICMP協議的,ICMP全程Internet Control Message Protocol,就是互聯網控制報文協議,網絡包在異常復雜的網絡環境進行傳輸的時候,常常會遇到各種各樣的問題,當遇到問題的時候,總要傳出消息來,報告情況,這樣才可以調整傳輸策略。
ICMP報文是封裝在IP包里面的,因為傳輸的時候,肯定需要源地址和目標地址,它本身非常簡單。ICMP報文有很多種類型,最常用的類型是主動請求為8,主動應答為0。

1、查詢報文類型
常用的ping就是查詢報文,是一種主動請求,並且獲得主動應答的ICMP協議,所以,ping包也是符合ICMP協議的格式的,只不過他在后面增加了自己的格式。
對ping的主動請求,進行網絡抓包,稱為ICMP ECHO REQUEST,同理,主動請求的回復,稱為ICMP ECHO REPLY,比起原生的ICMP,這里面多了兩個字段,一個是標識符,一個是序號,在選項數據中,ping還會存放發送請求的時間值,來計算往返時間,說明路程的長短。
2、差錯報文類型
ICMP差錯報文的幾個例子:終點不可達為3,源抑制為4,超時為11,重定向為5
(1)終點不可達
網絡不可達、主機不可達、協議不可達、端口不可達、需要設置了分片但設置了不可分片
(2)源站抑制
讓源站放慢發送速度
(3)時間超時
超過網絡的生存時間還沒有到達
(4)路由重定向
也就是下次發送給下一個路由
二、ping:查詢報文的使用
ping的發送和接受過程:

具體的執行過程:
假設主機A的IP地址是192.168.1.1,主機B的IP地址是192.168.1.2,他們都在同一個子網。那么當你在主機A上運行“ping 192.168.1.2”后,會發生什么呢?
(1)ping命令執行的時候,源主機首先會構建一個ICMP請求數據包,ICMP數據包內包含多個字段。最重要的是兩個,第一個是類型字段,對於請求數據包而言該字段為8;另一個是順序號,主要用於區分連續ping的時候發出的多個數據包。每發出一個數據包,順序號會自動加1,為了能夠計算往返的時間RTT,它會在報文的數據部分插入發送時間。
(2)由ICMP協議將這個數據包,連同地址192.168.1.2一起交給IP層,IP層將以192.168.1.2作為目的地址,本機IP作為源地址,加上一些其他的信息,構建一個IP數據包。
(3)接下來,需要加入MAC頭,如果在本節ARP映射表中查找出IP地址192.168.1.2所對應的MAC地址,由數據鏈路層構建一個數據幀,目的地址是IP層傳過來的MAC地址,源地址則是本機的MAC 地址;還要加上一些控制信息,依據以太網的介質訪問規則,將它們傳送出去。
(4)主機B收到這個數據幀后,先檢查它的目的MAC地址,並和本機的MAC地址對比,如符合,則接收,否則就丟棄,接收后檢查該數據幀,將IP包從數據幀中取出來,交給本機的IP層,同樣,IP層檢查后,將有用的信息提取出來后交給ICMP協議。
(5)主機B會構建一個ICMP應答包,應答數據包的類型字段為0,順序號為接收到的請求數據包中的順序號,然后再發送給主機A
分析:
在規定的時間內,源主機如果沒有接收到ICMP的應答包,則說明目標主機不可達。
如果接收到了ICMP的應答包,則說明目標主機可達
此時,源主機會檢查,用當前時刻減去該數據包最初從源主機上發出的時刻,就是ICMP數據包的時間延遲
擴展:
如果跨網斷的話,還會涉及到網關的轉發、路由器的轉發等等。但是對於ICMP的頭來講,是沒什么影響的,會影響的是根據目標IP地址,選擇路由的下一跳,還有每經過一個路由器到達一個新的局域網,需要換MAC頭里面的MAC地址。
附上原文地址極客時間趣談網絡協議:https://time.geekbang.org/column/article/8445#previewimg
