ping命令用於判斷與對方網絡是否暢通,ping 是基於ICMP協議工作的。
ICMP協議(互聯網控制報文協議):
ICMP報文:
ICMP主要的功能:確認 IP 包是否成功送達目標地址;報告發送過程中 IP 包被廢棄的原因;改善網絡設置等。
ICMP 的通知消息會使用IP進行發送,收到該 ICMP 包的主機分解 ICMP 的首部和數據,得知發生問題的原因。
ICMP報文類型:
查詢報文類型:
回送消息(回送應答和回送請求)用於進行通信的主機或路由器之間,判斷所發送的數據包是否已經成功到達對端,ping
命令就是利用回送消息實現的。
差錯報文類型:
目標不可達消息:
網絡不可達:IP 地址分為網絡號和主機號,當路由器中的路由器表匹配不到接收方 IP 的網絡號,通過 ICMP 協議以網絡不可達(Network Unreachable
)的原因告知主機。
主機不可達:當路由表中沒有該主機的信息,或者該主機沒有連接到網絡,那么會通過 ICMP 協議以主機不可達(Host Unreachable
)的原因告知主機。
協議不可達:當主機使用 TCP 協議訪問對端主機時,能找到對端的主機了,可是對端主機的防火牆已經禁止 TCP 協議訪問,那么會通過 ICMP 協議以協議不可達的原因告知主機。
端口不可達:當主機訪問對端主機 8080 端口時,這次能找到對端主機了,防火牆也沒有限制,可是發現對端主機沒有進程監聽 8080 端口,那么會通過 ICMP 協議以端口不可達的原因告知主機。
需要進行分片但是設置了不可分片:發送端主機發送 IP 數據報時,將 IP 首部的分片禁止標志位設置為1
。根據這個標志位,途中的路由器遇到超過 MTU 大小的數據包時,不會進行分片,而是直接拋棄。通過 ICMP 協議以需要進行分片但是設置了不可分片告知發送端主機。
原點抑制消息:
當路由器向低速線路發送數據時,其發送隊列的緩存變為零而無法發送出去時,可以向 IP 包的源地址發送一個 ICMP 原點抑制消息,收到這個消息的主機知道了在整個線路的某一處發生了擁堵的情況,從而增大 IP 包的傳輸間隔,減少網絡擁堵的情況。
ICMP
原點抑制消息的目的就是為了緩和這種擁堵情況
重定向消息:
如果路由器發現發送端主機使用了「不是最優」的路徑發送數據,那么它會返回一個 ICMP 重定向消息給這個主機,在這個消息中包含了最合適的路由信息和源數據。這主要發生在路由器持有更好的路由信息的情況下。路由器會通過這樣的 ICMP 消息告知發送端,讓它下次發給另外一個路由器。
超時消息:
IP 包中有一個字段叫做 TTL
(Time To Live
,生存周期),它的值隨着每經過一次路由器就會減 1,直到減到 0 時該 IP 包會被丟棄,此時,IP 路由器將會發送一個 ICMP 超時消息給發送端主機,並通知該包已被丟棄。設置 IP 包生存周期的主要目的,是為了在路由控制遇到問題發生循環狀況時,避免 IP 包無休止地在網絡上被轉發。
ping的工作過程(同網段):
ping 命令執行的時候,源主機首先會構建一個 ICMP 回送請求數據包發送給目的主機。ICMP 數據包內包含多個字段,最重要的是兩個:
-
第一個是類型,對於回送請求消息而言該字段為
8
; -
另外一個是序號,主要用於區分連續 ping 的時候發出的多個數據包。每發出一個請求數據包,序號會自動加
1
。
此外,為了能夠計算往返時間 RTT
,它會在報文的數據部分插入發送時間。由 ICMP 協議將這個數據包連同IP地址一起交給 IP 層。
目的主機收到IP數據包以后,將有用的信息提取后交給 ICMP 協議。同時,構建一個 ICMP 回送應答數據包,發送出去給主源機 。
在規定的時候間內,源主機如果沒有接到 ICMP 的應答包,則說明目標主機不可達;如果接收到了 ICMP 回送響應消息,則說明目標主機可達。此時,源主機會檢查,用當前時刻減去該數據包從源主機上發出的時刻,就是 ICMP 數據包的時間延遲。
原文鏈接 https://mp.weixin.qq.com/s/leE2DgDOl5z90hG2gG1Urw