ICMP協議及應用實例(ping,traceroute)

ICMP協議

在互聯網傳輸過程當中,IP數據報不免會出現差錯,一般出現差錯,處理方法就是丟棄,可是有不少狀況出現差錯後,會發送ICMP報文給主機,告訴它一些差錯信息,以及對當前的網絡狀態進行一個探尋。能夠說,ICMP的主要目的是用於在TCP/IP網絡中發送出錯和控制消息。ICMP報文封裝以下: html

在這裏插入圖片描述

主要ICMP報文

ICMP報文主要分三類,即差錯報告報文、控制報文、請求/應答報文,以下圖所示: 緩存

在這裏插入圖片描述

目的不可達(Destination Unreachable Message)

0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |     Code      |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             unused                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      Internet Header + 64 bits of Original Data Datagram      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
複製代碼

當路由器收到一個沒法傳遞下去的IP報文時,會發送ICMP目的不可達報文(Type爲3)給IP報文的源發送方。報文中的Code就表示發送失敗的緣由。bash

超時(Time Exceeded Message)

0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |     Code      |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             unused                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      Internet Header + 64 bits of Original Data Datagram      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
複製代碼

網絡傳輸IP數據報的過程當中,若是IP數據包的TTL值逐漸遞減爲0時,須要丟棄數據報。這時,路由器須要向源發送方發送ICMP超時報文(Type爲11),Code爲0,表示傳輸過程當中超時了。服務器

一個IP數據報可能會由於過大而被分片,而後在目的主機側把全部的分片重組。若是主機遲遲沒有等到全部的分片報文,就會向源發送方發送一個ICMP超時報文,Code爲1,表示分片重組超時了。微信

參數錯誤報文(Parameter Problem Message)

0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |     Code      |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |    Pointer    |                   unused                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      Internet Header + 64 bits of Original Data Datagram      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
複製代碼

當路由器或主機處理數據報時,發現由於報文頭的參數錯誤而不得不丟棄報文時,須要向源發送方發送參數錯誤報文(Type爲12)。當Code爲0時,報文中的Pointer表示錯誤的字節位置。網絡

源抑制(Source Quench Message)

0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |     Code      |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             unused                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      Internet Header + 64 bits of Original Data Datagram      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
複製代碼

路由器在處理報文時會有一個緩存隊列。若是超過最大緩存隊列,將沒法處理,從而丟棄報文。並向源發送方發一個ICMP源抑制報文(Type爲4),告訴對方下降發送速率。工具

重定向(Redirect Message)

0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |     Code      |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                 Gateway Internet Address                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      Internet Header + 64 bits of Original Data Datagram      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
複製代碼

當路由收到IP數據報,發現數據報的目的地址在路由表上沒有,它就會發ICMP重定向報文(Type爲5)給源發送方,提醒它想要發送的地址不在,去其餘地方找找吧。測試

請求回顯或回顯應答(Echo or Echo Reply Message)

0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |     Code      |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Identifier          |        Sequence Number        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Data ...
   +-+-+-+-+-
複製代碼

Type(8)是請求回顯報文(Echo);Type(0)是回顯應答報文(Echo Reply)。this

請求回顯或回顯應答報文屬於查詢報文。Ping就是用這種報文進行查詢和迴應。spa

信息請求或信息響應(Information Request or Information Reply Message)

0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |      Code     |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Identifier          |        Sequence Number        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
複製代碼

這種報文是用來找出一個主機所在的網絡個數(一個主機可能會在多個網絡中)。報文的IP消息頭的目的地址會填爲全0,表示this,源地址會填爲源IP所在的網絡IP。

最後,補充一張ICMP報文類型碼錶:

在這裏插入圖片描述

更多可參考協議文檔

幾種不發送 ICMP差錯報告報文的特殊狀況

在有些狀況下,爲了防止在網絡中產生大量的ICMP差錯報文(廣播風暴),影響網絡的正常工做,即便發生差錯,也不會產生ICMP差錯報文,這些狀況包括:

  • 對ICMP差錯報告報文再也不發送 ICMP差錯報告報文
  • 除第1個IP數據報分片外, 對全部後續分片均不發送ICMP差錯報告報文
  • 對全部多播IP數據報均不發送 ICMP差錯報告報文
  • 對具備特殊地址( 如127.0.0.0 或 0.0.0.0) 的IP數據報不發送ICMP 差錯報告報文

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回送請求報文。
在這裏插入圖片描述

遠端主機收到後會發送回送應答報文:

在這裏插入圖片描述

在這裏補充一張IP數據報格式圖:

在這裏插入圖片描述

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,到達目的主機,目的主機回覆,終止。

參考文檔:
以太網幀格式、IP數據報格式、TCP段格式+UDP段格式 詳解
www.rfc-editor.org/rfc/rfc792.…

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

相關文章
相關標籤/搜索