0. 前言
在講解ping過程之前,我們需要了解以下概念。
1). 何為ping
PING (Packet Internet Groper),因特網包探索器,用於測試網絡連通性的程序。
Ping發送一個ICMP(Internet Control Messages Protocol,因特網信報控制協議);回聲請求消息給目的地並報告是否收到所希望的ICMPecho (ICMP回聲應答)。
工作原理:利用網絡上機器IP地址的唯一性,給目標IP地址發送一個數據包,再要求對方返回一個同樣大小的數據包來確定兩台網絡機器是否連接相通,時延是多少。
2). ICMP報文格式:
ICMP屬於OSI七層協議的網絡層,和IP一層,但ICMP使用時必須增加IP報頭。

- 類型:8bit
- 代碼:8bit
類型+代碼決定了ICMP的整體類型- 檢驗和:16bit,用於檢驗ICMP數據的校驗
- 其它選項:根據類型的不同而不同
ICMP協議報文分為查詢報文和差錯控制報文:
| TYPE | CODE | Description | Query | Error |
|---|---|---|---|---|
| 0 | 0 | Echo Reply——回顯應答(Ping應答) | x | |
| 3 | 0 | Network Unreachable——網絡不可達 | x | |
| 3 | 1 | Host Unreachable——主機不可達 | x | |
| 3 | 2 | Protocol Unreachable——協議不可達 | x | |
| 3 | 3 | Port Unreachable——端口不可達 | x | |
| 3 | 4 | Fragmentation needed but no frag. bit set——需要進行分片但設置不分片比特 | x | |
| 3 | 5 | Source routing failed——源站選路失敗 | x | |
| 3 | 6 | Destination network unknown——目的網絡未知 | x | |
| 3 | 7 | Destination host unknown——目的主機未知 | x | |
| 3 | 9 | Destination network administratively prohibited——目的網絡被強制禁止 | x | |
| 3 | 10 | Destination host administratively prohibited——目的主機被強制禁止 | x | |
| 3 | 11 | Network unreachable for TOS——由於服務類型TOS,網絡不可達 | x | |
| 3 | 12 | Host unreachable for TOS——由於服務類型TOS,主機不可達 | x | |
| 3 | 13 | Communication administratively prohibited by filtering——由於過濾,通信被強制禁止 | x | |
| 3 | 14 | Host precedence violation——主機越權 | x | |
| 3 | 15 | Precedence cutoff in effect——優先中止生效 | x | |
| 4 | 0 | Source quench——源端被關閉(基本流控制) | ||
| 5 | 0 | Redirect for network——對網絡重定向 | ||
| 5 | 1 | Redirect for host——對主機重定向 | ||
| 5 | 2 | Redirect for TOS and network——對服務類型和網絡重定向 | ||
| 5 | 3 | Redirect for TOS and host——對服務類型和主機重定向 | ||
| 8 | 0 | Echo request——回顯請求(Ping請求) | x | |
| 9 | 0 | Router advertisement——路由器通告 | ||
| 10 | 0 | Route solicitation——路由器請求 | ||
| 11 | 0 | TTL equals 0 during transit——傳輸期間生存時間為0 | x | |
| 11 | 1 | TTL equals 0 during reassembly——在數據報組裝期間生存時間為0 | x | |
| 12 | 0 | IP header bad (catchall error)——壞的IP首部(包括各種差錯) | x | |
| 12 | 1 | Required options missing——缺少必需的選項 | x | |
| 17 | 0 | Address mask request——地址掩碼請求 | x | |
| 18 | 0 | Address mask reply——地址掩碼應答 | x |
1. ping 過程

如上圖,假設我們是Host A,現在需要訪問Host C,在訪問之前,我們需要知道是否與Host C網絡相通,此時我們就用到了ping.
此處來個小插曲,網絡故障時候,我們一般采用四個步驟:
- 1. ping localhost:
localhost的IP地址一般為127.0.0.1, 也稱loopback(環回路由);如果此時ping不通,則表示協議棧有問題;ping 該地址不經過網卡,僅僅是軟件層面- 2. ping 本機IP:
ping 本機IP其實是從驅動到網卡,然后原路返回;所以如果此時ping不通,則表示網卡驅動有問題,或者NIC硬件有問題;- 3. ping 網關:
所謂網關,就是連接到另外一個網絡的“關卡”, 一般為離我們終端最近的路由器;可以使用ipconfig (windows)或ifconfig (Linux)查看;若此時ping不通,則為主機到路由器間的網絡故障;- 4. ping 目的IP:
若此步驟不成功,應該就是路由器到目的主機的網絡有問題
當然,以上是簡化版,實際網絡故障排查比上面的復雜太多,僅用作參考。
言歸正傳,ping的過程分為很多個步驟:
-
Step 1: ICMP 創建一個回應請求數據包(數據域中只包含字母)

-
Step 2: ICMP將該有效負荷交給IP協議,IP用它創建一個分組

增加的IP頭包含:源IP(Host A的IP),目標IP(Host C的IP),協議字段(0x01, ICMP的協議號),這些信息在接收方主機用來判斷將數據交給哪個協議處理
- Step 3: IP協議判斷目的IP是處於LAN還是某個遠程網絡
具體的判斷方法是將目標IP和子網掩碼一起找出目標網絡,看是否等於本地網絡;
本例中:目標IP(192.168.20.2), 子網掩碼 255.255.255.0,因此目標網絡為192.168.20.0,不屬於本地網絡(192.168.1.0)
- Step 4: 由於IP協議判定這是一個遠程的跨網絡請求,要將這一分組路由到遠程網絡,就必須將它發給默認路由
- 本例的默認路由為:
192.168.1.1;
- Step 5: 主機 Host A(192.168.1.2)要將分組數據發送到默認網關(192.168.1.1), 就必須要知道Router A接口F0/0的MAC地址
- 主要知道了默認網關的MAC地址,分組才可以向下遞交給數據鏈路層,並在哪里完成幀組建;
- 記住:如果要將分組發送到LAN以外的網絡,目標方的MAC將永遠只能是路由器的接口地址(忽略交換機)
MAC地址永遠只能作用本地LAN,不能繞過或通過路由器- MAC地址:
- bit 1: 單播/多播地址 (0/1)
- bit 2: 全局/本地地址 (0/1)
- bit 3-24: IEEE統一管理,保證各個廠商不同
- bit 25-48: 廠商自己管理,保證產品間的不同
- Step 6: 檢查主機ARP緩存,查看默認網關IP地址是否已經被解析為一個硬件地址
- 若已被解析:此分組可被傳送到數據鏈路層以組建幀(可使用
arp -a查看)- 若未被解析:Host A使用ARP廣播(MAC廣播地址為:FF-FF-FF-FF-FF-FF), Router A接受到廣播后,通過F0/0口返回該口的硬件地址
- Step 7: 一旦分組和硬件地址交給鏈路層,局域網驅動程序負責選擇合適的局域網類型(本例為以太網)的介質訪問方式,創建數據幀
- 幀格式:
-
Step 8: 一旦幀創建完成,該幀被提交到物理層;物理層將 1bit/次的方式將數據發送到物理介質中
-
Step 9: 本沖突域中的每台主機(Host B)都會接收到這些比特,並將其重新組裝成幀
- 沖突域:參考https://www.cnblogs.com/bakari/archive/2012/09/08/2677086.html
- 每個接收到此比特的數據,都將進行CRC運算,然后與幀中的FCS進行比對,查看是否匹配:
- 若不匹配:直接丟棄
- 若匹配:檢查目的MAC是否與自己的相同,若相同,繼續處理;否則,丟棄
-
Step 10: 將分組數據從幀中取出,並將其他部分丟棄;然后,分組被遞交給以太網類型字段中列出的協議(本例為IP協議)
-
Step 11:IP接受該分組,並檢查其目的IP
由於分組的目的IP與本路由(Router A)的配置IP不匹配,此路由將在其路由表中查找目的IP的位置
-
Step 12: 如果路由表中沒有網絡 192.168.20.0 的路由表項,則立即丟棄該分組;並向源主機Host A發送目標網絡不可達的ICMP報文
-
Step 13: 如果在路由表中查找到了相關的路由表項,則分組將被交換到指定的輸出接口 -- 本例為F0/1
-
Step 14: 路由器Router A將此分組交換到F0/1的緩沖區內
-
Step 15: F0/1需要獲得目的方設備的MAC地址(本例為Router B的F0/0 MAC地址)
- 查看F0/1的ARP緩存,若存在,則分組和MAC地址將被提交到數據鏈路層,用於數據幀的組建;
- 若不存在,采用路由選擇協議(RIP/EIGRP/OSPF);
-
Step 16: 幀創建完成后,將其交給物理層,並由物理層逐比特發送到物理介質中
-
Step 17: Router B執行與Router A相同的操作 (即step9 - step16)
-
Step 18: Host C 接收到該幀,並立即運行CRC運算,若與FCS匹配,則檢測幀中的目標MAC,如果同樣相同,檢查以太網類型值,判斷網絡層協議 -- 本例為IP
-
Step 19: 在網絡層,IP接受到該分組,並對其頭部進行CRC;若相同,則檢查目標IP是否與本機相同;若相同,檢查分組的協議字段,了解上層的交付對象 -- 本例為ICMP
-
Step 20: 負荷提交給ICMP;ICMP知道此為回應請求信號,ICMP將應答此請求
- 應答方式:首先丟棄接受到的字段,產生一個新的有效負荷作為回應字段
-
Step 21: 此時一個新的有效負荷產生,目標為Host A
-
Step 22: 將其提交給IP層,IP判斷目的地址為本地LAN還是遠程主機(本例為遠程主機),此分組首先發到默認網關
-
Step 23: 重復請求包所經歷的步驟,直到將應答包發送到Host B的ICMP協議為止
-
Step 24: Host A的ICMP通過用戶界面發送一個 ! 表示已經收到這個回復
-
Step 25: Host A嘗試發送后續的ICMP應答請求包給Host C
另外,感覺知乎中一些大神關於網絡的理解很到位,可以參考下:https://www.zhihu.com/question/51074319


