ping過程詳細解讀
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)都會接收到這些位元,並將其重新組裝成幀
-
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