天天看點

Ping、Traceroute工作原理

在工作開發過程中,我們經常會使用到ping和traceroute。在這裡,我們将細述其工作原理,讓你在會用的基礎之上了解其内部工作過程。

ICMP應用執行個體——Ping

Ping 是 ICMP 的一個重要應用,主要用來測試兩台主機之間的連通性。Ping 的原理是通過向目的主機發送 ICMP Echo 請求封包,目的主機收到之後會發送 Echo 回答封包。Ping 會根據時間和成功響應的次數估算出資料包往返時間以及丢包率。

Ping的完整工作流程:

Ping本質上是ICMP資料包,是以其工作流程就是ICMP資料包的發送與解析流程。

大緻流程如下:

構造ICMP資料包-->構造IP資料包-->構造以太網資料幀----實體傳輸到目标主機---->擷取以太網資料幀-->解析出IP資料包-->解析出ICMP資料包-->發送回送應答封包

本地主機處理流程:

  1. 在本地,ping指令會建構一個ICMP資料包(構造回送請求封包)
  2. 将該ICMP資料包和目标IP位址給IP協定,IP協定将本地位址作為源位址,與目的位址等構造IP資料包
  3. 根據本地ARP緩存查找目的位址IP對應的MAC位址,如果緩存中沒有則通過ARP協定找到對應IP的MAC位址。将MAC位址交給資料鍊路層以構造資料幀
  4. 經實體層發送給目的主機

目的主機處理流程:

  1. 目的主機接收到資料包
  2. 實體層接收到二進制資料流經資料鍊路層,按照以太網協定解析出資料幀,如果資料幀中的目标MAC位址與本機MAC位址相同,則接收該資料包,否則丢棄該資料包。
  3. 接收到該資料包之後,經網絡層解析出IP資料包,通過IP標頭中的協定字段判斷出是ICMP資料包。之後解析出ICMP資料包,發現是回送請求封包(ping request)後馬上建構一個ICMP回送應答封包(ping reply)
  4. 将封裝好的ICMP資料包經網絡層、資料鍊路層、實體層發送回源主機

是以,Ping的本質其實就是ICMP回送請求封包和回送應答封包。我們可通過Wireshark抓包工具對Ping進行分析。使用ping指令:

本機會向遠端主機發送ICMP回送請求封包。

遠端主機收到後會發送回送應答封包:

ICMP應用執行個體——Traceroute

Traceroute 是 ICMP 的另一個應用,用來跟蹤一個分組從源點到終點的路徑。有2種實作方案:基于UDP實作和基于ICMP實作。

基于UDP實作traceroute工作原理

在基于UDP的實作中,用戶端發送的資料包是通過UDP協定來傳輸的,使用了一個大于30000的端口号,伺服器在收到這個資料包的時候會傳回一個端口不可達的ICMP錯誤資訊,用戶端通過判斷收到的錯誤資訊是TTL逾時還是端口不可達來判斷資料包是否到達目标主機。流程如下:

  1. 源主機向目的主機發送一連串的 IP 資料報(UDP封包)。第一個資料報 P1 的生存時間 TTL 設定為 1,當 P1 到達路徑上的第一個路由器 R1 時,R1 收下它并把 TTL 減 1,此時 TTL 等于 0,R1 就把 P1 丢棄,并向源主機發送一個 ICMP 時間超過差錯報告封包;
  2. 源主機接着發送第二個資料報 P2,并把 TTL 設定為 2。P2 先到達 R1,R1 收下後把 TTL 減 1 再轉發給 R2,R2 收下後也把 TTL 減 1,由于此時 TTL 等于 0,R2 就丢棄 P2,并向源主機發送一個 ICMP 時間超過差錯封包。
  3. 不斷執行這樣的步驟,直到最後一個資料報剛剛到達目的主機,主機不轉發資料報,也不把 TTL 值減 1。但是因為資料報封裝的是無法傳遞的 UDP,是以目的主機要向源主機發送 ICMP 終點不可達差錯報告封包。
  4. 之後源主機知道了到達目的主機所經過的路由器 IP 位址以及到達每個路由器的往返時間。

Linux中的traceroute就是這種實作方式。

基于ICMP實作的tracert工作原理

在這一種實作中我們不使用UDP協定,而是直接發送一個ICMP回應要求(echo request)資料包,伺服器在收到回應要求的時候會向用戶端發送一個ICMP回應答覆(echo reply)資料包。流程與上面相似,隻是最後判斷結束上為目标主機(而不是中間經過的主機或路由器)傳回一個ICMP回應答覆,則結束。

Windows中的tracert就是這種實作方式。利用Wireshark分析如下:

在cmd下輸入

tracert www.baidu.com

每一跳預設發送三個資料包,我們會看到下面這樣的輸出:

可以看到TTL逐個遞增,并且最終到達目的主機180.97.33.107,到達目的主機,目的主機回複,終止。

關注微信公衆号,每天進步一點點!