Ping 的工作原理你懂了,那 ICMP 你懂不懂?

程式設計師cxuan發表於2021-02-25

計算機網路我也連載了很多篇了,大家可以在我的公眾號「程式設計師cxuan」 或者我的 github

系統學習。

計算機網路第一篇,聊一聊網路基礎 :計算機網路基礎知識總結

計算機網路第二篇,聊一聊 TCP/IP 基礎:TCP/IP 基礎知識總結

計算機網路第三篇,這些應用層協議你也應該知道:拿下計網協議後,我就是公園裡最靚的仔

計算機網路第四篇,這篇文章寫的時間很長了,圖文精美,非常值得花時間閱讀:40 張圖帶你搞懂 TCP 和 UDP

計算機網路第五篇,網路層之路由器的基本概念:路由器你竟然是這樣的...

計算機網路第六篇,瞭解一下 IP 基礎知識的概念:IP 基礎知識總結

計算機網路第七篇,全方位瞭解一下網路層的知識:我畫了 40 張圖就是為了讓你搞懂計算機網路層

計算機網路第八篇,瞭解一下 ARP 協議是什麼:ARP,這個隱匿在計網背後的男人

計算機網路第九篇,DNS 協議是面試經常會考到的點,這篇帶你深入瞭解一下 DNS 協議:萬字長文爆肝 DNS 協議!

我們之前的文章中瞭解過 TCP/IP 協議,我那時候碼了一句

原文連結見如下:

TCP/IP 基礎知識總結

下面我們就來真正認識一下 ICMP 協議

什麼是 ICMP

ICMP 的全稱是 Internet Control Message Protocol(網際網路控制協議),它是一種網際網路套件,它用於IP 協議中傳送控制訊息。也就是說,ICMP 是依靠 IP 協議來完成資訊傳送的,它是 IP 的主要部分,但是從體系結構上來講,它位於 IP 之上,因為 ICMP 報文是承載在 IP 分組中的,就和 TCP 與 UDP 報文段作為 IP 有效載荷被承載那樣。這也就是說,當主機收到一個指明上層協議為 ICMP 的 IP 資料包時,它會分解出該資料包的內容給 ICMP,就像分解資料包的內容給 TCP 和 UDP 一樣。

ICMP 協議和 TCP、UDP 等協議不同,它不用於傳輸資料,只是用來傳送訊息。因為 IP 協議現在有兩類版本:IPv4 和 IPv6 ,所以 ICMP 也有兩個版本:ICMPv4 和 ICMPv6

ICMP 的主要功能

對於 ICMP 的功能,主要分為兩個

  • ICMP 的第一個功能是確認 IP 包是否能夠成功到達目標地址,當兩個裝置通過網際網路相連時,任意一個裝置傳送給另一個裝置的 IP 包如果沒有到達,就會生成 ICMP 資料包傳送給裝置共享。
  • ICMP 的第二個功能是進行網路診斷,經常使用 ICMP 資料包的兩個終端程式是 pingtraceroute,traceroute 程式用於顯示兩臺網際網路裝置之間可能的路徑並測量資料包在 IP 網路上的時延。ping 程式是 traceroute 的簡化版本,我們經常使用 ping 命令來測試兩臺裝置之間是否互聯,ping 通常用來測試兩臺主機之間的連線速度,並準確報告資料包到達目的地並返回後所花費的時間。

現在我們知道了,如果在 IP 通訊過程中由於某個 IP 包由於某種原因未能到達目標主機,那麼這個具體的原因將由 ICMP 進行通知,下面是一個 ICMP 的通知示意圖

上面我們只是畫出了路由器 2 給主機 A 傳送了一個 ICMP 資料包,而沒有畫出具體的通知型別,但實際情況是,上面傳送的是目標不可達型別(Destination unreachable),ICMP 也是具有不同的通知型別的,下面我們彙總了 ICMP 資料包的具體通知型別。

上表顯示的 ICMP 通知型別主要分為兩類:有關 IP 資料包傳遞的 ICMP 報文,這類報文也叫做差錯報文(error message),以及有關資訊採集和配置的 ICMP 報文,這類報文也被稱為查詢 query 或者資訊類報文。

資訊類報文包括回送請求和回送應答(型別 8 和 型別 0 ),路由器公告和路由器請求(型別 9 和 型別 0 )。最常見的差錯報文型別包括目標不可達(型別 3 )、重定向(型別 5)、超時(型別 11)。

ICMP 在 IPv4 和 IPv6 的封裝

我們知道,ICMP 是承載在 IP 內部的,而且 IPv4 和 IPv6 的封裝位置不同:

ICMP 在 IPv4 協議中的封裝

ICMP 在 IPv6 協議中的封裝

上面兩張圖顯示了 ICMPV4 和 ICMPv6 的報文格式。開頭的 4 個位元組在所有的報文中都是一樣的。但是其餘部分在不同的報文中卻不一樣。

ICMP 頭部包含了整個 ICMP 資料段的校驗和,具體格式如下

所有的 ICMP 報文都以 8 位的型別(Type)程式碼(Code) 欄位開始,其後的 16 位校驗和涵蓋了整個報文,ICMPv4 和 ICMPv6 種的型別和程式碼欄位是不同的。

ICMP 的主要訊息

ICMP 目標不可達(型別 3)

我們知道,路由器無法將 IP 資料包傳送給目標地址時,會給傳送端主機返回一個目標不可達(Destination Unreachable Message) 的 ICMP 訊息,並且會在訊息中顯示不可達的具體原因。

實際通訊過程中會顯示各種各樣的不可達資訊,比如錯誤程式碼時 1 表示主機不可達,它指的是路由表中沒有主機的資訊,或者主機沒有連線到網路的意思。一些 ICMP 不可達資訊的具體原因如下

ICMP 重定向訊息(型別 5)

如果路由器發現傳送端主機使用了次優的路徑傳送資料,那麼它會返回一個 ICMP 重定向(ICMP Redirect Message) 的訊息給這個主機。這個 ICMP 重定向訊息包含了最合適的路由資訊和源資料。這種情況會發生在路由器持有更好的路由資訊的情況下。路由器會通過這樣的 ICMP 訊息給傳送端主機一個更合適的傳送路由。

主機 Host 的 IP 地址為 10.0.0.100。主機的路由表中有一個預設路由條目,指向路由器 G1 的 IP 地址 10.0.0.1 作為預設閘道器。路由器 G1 在將資料包轉發到目的網路 X 時,會使用路由器 G2 的 IP 地址 10.0.0.2 作為下一跳。

當主機向目的網路 X 傳送資料包時,會發生以下情況

  1. IP 地址為 10.0.0.1 的閘道器 G1 在其所連線的網路上接收來自 10.0.0.100 的資料包。

  2. 閘道器 G1 檢查其路由表,並在通往資料包目的網路 X 的路由中獲取下一個閘道器 G2 的 IP 地址 10.0.0.2。

  3. 如果 G2 和 IP 資料包的源地址標識的主機位於同一網路中(也就是 Host 主機),那麼 G1 會向主機傳送 ICMP 重定向訊息。ICMP 重定向訊息建議主機直接將傳送到網路 X 的資料包傳送至 G2,因為 Host - G2 這是通往目的地的較短路徑。

  4. 閘道器 G1 將原始資料包轉發到其目的地。

當然,根據主機的配置,Host 主機也可以選擇忽略 G1 給它傳送的 ICMP 重定向訊息。但是,這樣就享受不到 ICMP 重定向帶來的兩大好處,即

  • 優化資料在網路中的轉發路徑;流量更快到達目的地
  • 降低網路資源利用率,例如頻寬和路由器 CPU 負載

如果 Host 主機採用了 ICMP 提供的重定向路徑的話,那麼 Host 就會直接把資料包傳送至網路 X,如下圖所示

在主機為 G2 作為下一跳的網路 X 建立路由快取條目後,這些優勢在網路中可見:

  • 交換機和路由器 G1 之間鏈路的頻寬利用率在兩個方向上都會降低
  • 由於從主機到網路 X 的流量不再流經此節點,因此路由器 G1 的 CPU 使用率降低
  • 主機和網路 X 之間的端到端網路延遲得到改善。

ICMP 重定向示例如下

ICMP 超時訊息(型別 11)

在 IP 資料包中有一個叫做 TTL(Time To Live, 生存週期) ,它的值在每經過路由器一跳之後都會減 1,IP 資料包減為 0 時會被丟棄。此時,IP 路由器會傳送一個 ICMP 超時訊息(ICMP TIme Exceeded Message, 錯誤號 0)傳送給主機,通知該包已經被丟棄。

設定生存週期的主要目的就是為了防止路由器控制遇到問題發生迴圈狀況時,避免 IP 包無休止的在網路上轉發,如下圖所示

這裡給大家推薦一款比較好用的追蹤超時訊息的工具 traceroute,它可以顯示出由執行程式的主機到達特定主機之前需要經過多少路由器。 traceroute 的官網如下 http://www.traceroute.org

ICMP 回送訊息(型別 0 和 型別 8)

ICMP 回送訊息用於判斷相互通訊的主機之間是否連通,也就是判斷所傳送的資料包是否能夠到達目標主機。可以向對端主機傳送回送請求的訊息(ICMP Echo Request Message,型別 8),也可以接收對端主機傳送來的回送訊息(ICMP Echo Reply Message, 型別 0 )。網路上最常用的 ping 命令就是利用這個實現的。

其他 ICMP 訊息

ICMP 原點抑制訊息(型別 4)

在使用低速率網路的情況下,網路通訊可能會遇到網路擁堵的情況下,ICMP 的原點抑制就是為了應對這種情況的。當路由器向低速線路傳送資料時,其傳送佇列的殘存資料包變為 0 從而無法傳送時,可以向 IP 資料包的源地址傳送一個 ICMP 原點抑制(ICMP Source Quench Message) 訊息,收到這個訊息的主機瞭解到線路某處發生了擁堵,從而抑制 IP 資料包的傳送。

不過這個 ICMP 訊息可能會引起不公平的網路通訊,一般不被使用。

ICMP 路由器探索訊息(型別 9、10)

ICMP 路由器探索訊息主要用於路由器發現(Router Discovery, RD),它主要分為兩種,路由器請求(Router Solicitation, 型別 10)路由器響應(Router Advertisement, 型別 9)。主機會在任意路由連線組播的網路上傳送一個 RS 訊息,想要選擇一個路由器進行學習,以此來作為預設路由,而相對應的該路由會傳送一個 RA 訊息來作為預設路由的響應。

ICMP 地址掩碼訊息(型別 17、18)

主要用於主機或者路由器想要了解子網掩碼的情況。可以向那些目標主機或路由器傳送 ICMP 地址掩碼請求訊息(ICMP Address Mask Request, 型別 17)ICMP 地址掩碼應答訊息(ICMP Address Mask Reply, 型別 18) 獲取子網掩碼資訊。

ICMPv6

ICMPv6 的作用

IPv4 中 ICMP 僅僅作為一個輔助作用支援 IPv4。也就是說,在 IPv4 時期,即使沒有 ICMP,也能進行正常的 IP 資料包的傳送和接收,也就是 IP 通訊。但是在 IPv6 中,ICMP 的作用被放大了,如果沒有 ICMP,則不能進行正常的 IP 通訊。

尤其在 IPv6 中,從 IP 定位 MAC 地址的協議從 ARP 轉為 ICMP 的鄰居探索訊息(Neighbor Discovery) 。這種鄰居探索訊息融合了 IPv4 的 ARP、ICMP 重定向以及 ICMP 的路由選擇等功能於一體。甚至還提供了自動設定 IP 的功能。

在 IPv6 中,ICMP 訊息主要分為兩類:一類是錯誤訊息,一類是資訊訊息。0 - 127 屬於錯誤訊息;128 - 255 屬於資訊訊息。

RFC 2463 中描述了以下訊息型別:

ICMPv6 除了包含 ICMPv4 的所有功能外,還有兩個額外的功能。

ICMPv6 鄰居探索

鄰居探索是 ICMPv6 非常重要的功能,主要表示的型別是 133 - 137 之間的訊息叫做鄰居探索訊息。這種鄰居探索訊息對於 IPv6 通訊起到舉足輕重的作用。鄰居請求訊息用於查詢 IPv6 地址於 MAC 地址的對應關係。鄰居請求訊息利用 IPv6 的多播地址實現傳輸。

此外,由於 IPv6 實現了即插即用的功能,所以在沒有 DHCP 伺服器的環境下也能實現 IP 地址的自動獲取。如果是一個沒有路由器的網路,就使用 MAC 地址作為鏈路本地單播地址。如果在一個有路由器的網路環境中,可以從路由器獲得 IPv6 地址的前面部分,後面部分使用 MAC 地址進行設定。此時可以利用路由器請求訊息和路由器公告訊息進行設定。

ICMPv6 的組播收聽發現協議

組播收聽發現協議(MLD,Multicast Listener Discovery)由子網內的組播成員管理。MLD 協議定義了3條ICMPv6 訊息:

  • 組播收聽查詢訊息:組播路由器向子網內的組播收聽者傳送此訊息,以獲取組播收聽者的狀態。
  • 組播收聽者報告訊息:組播收聽者向組播路由器彙報當前狀態,包括離開某個組播組。
  • 組播收聽者。

與 ICMP 有關的攻擊

涉及 ICMP 攻擊主要分為 3 類:泛洪(flood)、炸彈(bomb) 和資訊洩露(information disclsure)

  • 泛洪將會產生大量流量,導致針對一臺或者多臺計算機的有效 Dos 攻擊。
  • 炸彈指的是傳送經過特殊構造的報文,這類報文能夠導致 IP 或者 ICMP 的處理失效或者崩潰。
  • 資訊洩露本身不會造成危害,但是能夠幫助輔助其他攻擊。

針對 TCP 的 ICMP 攻擊已經記錄在了 RFC5927 中。

另外,新增我的微信 becomecxuan,加入每日一題群,每天一道面試題分享,更多內容請參見我的 Github,成為最好的 bestJavaer,已經收錄此篇文章,詳情見原文連結

我自己肝了六本 PDF,微信搜尋「程式設計師cxuan」關注公眾號後,在後臺回覆 cxuan ,領取全部 PDF,這些 PDF 如下

六本 PDF 連結

相關文章