• 正文
    • 什么是 ICMP
    • ICMP 的主要消息
    • ICMPv6
    •  
    • 與 ICMP 有關的攻擊
  • 相關推薦
申請入駐 產業(yè)圖譜

ICMP 是個啥破玩意?

2021/02/24
473
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

 

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

原文鏈接見如下:

TCP/IP 基礎知識總結

下面我們就來真正認識一下 ICMP 協(xié)議

什么是 ICMP

ICMP 的全稱是 Internet Control Message Protocol(互聯(lián)網控制協(xié)議),它是一種互聯(lián)網套件,它用于IP 協(xié)議中發(fā)送控制消息。也就是說,ICMP 是依靠 IP 協(xié)議來完成信息發(fā)送的,它是 IP 的主要部分,但是從體系結構上來講,它位于 IP 之上,因為 ICMP 報文是承載在 IP 分組中的,就和 TCP 與 UDP 報文段作為 IP 有效載荷被承載那樣。這也就是說,當主機收到一個指明上層協(xié)議為 ICMP 的 IP 數(shù)據報時,它會分解出該數(shù)據報的內容給 ICMP,就像分解數(shù)據報的內容給 TCP 和 UDP 一樣。

ICMP 協(xié)議和 TCP、UDP 等協(xié)議不同,它不用于傳輸數(shù)據,只是用來發(fā)送消息。因為 IP 協(xié)議現(xiàn)在有兩類版本:IPv4 和 IPv6 ,所以 ICMP 也有兩個版本:ICMPv4 和 ICMPv6。

ICMP 的主要功能

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

  • ICMP 的第一個功能是確認 IP 包是否能夠成功到達目標地址,當兩個設備通過互聯(lián)網相連時,任意一個設備發(fā)送給另一個設備的 IP 包如果沒有到達,就會生成 ICMP 數(shù)據包發(fā)送給設備共享。ICMP 的第二個功能是進行網絡診斷,經常使用 ICMP 數(shù)據包的兩個終端程序是 pingtraceroute,traceroute 程序用于顯示兩臺互聯(lián)網設備之間可能的路徑并測量數(shù)據包在 IP 網絡上的時延。ping 程序是 traceroute 的簡化版本,我們經常使用 ping 命令來測試兩臺設備之間是否互聯(lián),ping 通常用來測試兩臺主機之間的連接速度,并準確報告數(shù)據包到達目的地并返回后所花費的時間。

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

上面我們只是畫出了路由器 2 給主機 A 發(fā)送了一個 ICMP 數(shù)據包,而沒有畫出具體的通知類型,但實際情況是,上面發(fā)送的是目標不可達類型(Destination unreachable),ICMP 也是具有不同的通知類型的,下面我們匯總了 ICMP 數(shù)據包的具體通知類型。

通知類型(十進制數(shù)) 具體內容
0 回送應答(Echo Reply)
3 目標不可達(Destination Unreachable)
4 原點抑制(Source Quench)
5 重定向或改變路由(Redirect)
8 回送請求(Echo Request)
9 路由器公告(Router Advertisement)
10 路由器請求(Router Solicitation)
11 ICMP 超時(Time Exceeded)
17 地址子網請求(Address Mask Request)
18 地址子網應答(Address Mask Reply)

上表顯示的 ICMP 通知類型主要分為兩類:有關 IP 數(shù)據報傳遞的 ICMP 報文,這類報文也叫做差錯報文(error message),以及有關信息采集和配置的 ICMP 報文,這類報文也被稱為查詢 query 或者信息類報文。

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

ICMP 在 IPv4 和 IPv6 的封裝

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

ICMP 在 IPv4 協(xié)議中的封裝

ICMP 在 IPv6 協(xié)議中的封裝

上面兩張圖顯示了 ICMPV4 和 ICMPv6 的報文格式。開頭的 4 個字節(jié)在所有的報文中都是一樣的。但是其余部分在不同的報文中卻不一樣。

ICMP 頭部包含了整個 ICMP 數(shù)據段的校驗和,具體格式如下

所有的 ICMP 報文都以 8 位的類型(Type)代碼(Code) 字段開始,其后的 16 位校驗和涵蓋了整個報文,ICMPv4 和 ICMPv6 種的類型和代碼字段是不同的。

ICMP 的主要消息

ICMP 目標不可達(類型 3)

我們知道,路由器無法將 IP 數(shù)據報發(fā)送給目標地址時,會給發(fā)送端主機返回一個目標不可達(Destination Unreachable Message) 的 ICMP 消息,并且會在消息中顯示不可達的具體原因。

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

錯誤號 ICMP 不可達消息
0 0 = net unreachable 網絡不可達
1 1 = host unreachable 主機不可達
2 2 = protocol unreachable 協(xié)議不可達
3 3 = port unreachable 端口不可達
4 4 = fragmentation needed and DF set 需要進行分片但設置不分片比特
5 5 = source route failed 源站選路失敗
6 6 = Destination network unknown 目的網絡不認識
7 7 = Destination host unknown 目的主機不認識
8 8 = Source host isolated (obsolete)源主機被隔離(作廢不用)
9 9 = Destination network administratively prohibited 目的網絡被強制禁止
10 10 = Destination host administratively prohibited目的主機被強制禁止
11 11 = Network unreachable for Type Of Service 由于 TOS,網絡不可達
12 12 = Host unreachable for Type Of Service 由于 TOS,主機不可達

 

ICMP 重定向消息(類型 5)

如果路由器發(fā)現(xiàn)發(fā)送端主機使用了次優(yōu)的路徑發(fā)送數(shù)據,那么它會返回一個 ICMP 重定向(ICMP Redirect Message) 的消息給這個主機。這個 ICMP 重定向消息包含了最合適的路由信息和源數(shù)據。這種情況會發(fā)生在路由器持有更好的路由信息的情況下。路由器會通過這樣的 ICMP 消息給發(fā)送端主機一個更合適的發(fā)送路由。

主機 Host 的 IP 地址為 10.0.0.100。主機的路由表中有一個默認路由條目,指向路由器 G1 的 IP 地址 10.0.0.1 作為默認網關。路由器 G1 在將數(shù)據包轉發(fā)到目的網絡 X 時,會使用路由器 G2 的 IP 地址 10.0.0.2 作為下一跳。

當主機向目的網絡 X 發(fā)送數(shù)據包時,會發(fā)生以下情況

IP 地址為 10.0.0.1 的網關 G1 在其所連接的網絡上接收來自 10.0.0.100 的數(shù)據包。

網關 G1 檢查其路由表,并在通往數(shù)據包目的網絡 X 的路由中獲取下一個網關 G2 的 IP 地址 10.0.0.2。

如果 G2 和 IP 數(shù)據包的源地址標識的主機位于同一網絡中(也就是 Host 主機),那么 G1 會向主機發(fā)送 ICMP 重定向消息。ICMP 重定向消息建議主機直接將發(fā)送到網絡 X 的數(shù)據包發(fā)送至 G2,因為 Host - G2 這是通往目的地的較短路徑。

網關 G1 將原始數(shù)據包轉發(fā)到其目的地。

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

  • 優(yōu)化數(shù)據在網絡中的轉發(fā)路徑;流量更快到達目的地降低網絡資源利用率,例如帶寬和路由器 CPU 負載

如果 Host 主機采用了 ICMP 提供的重定向路徑的話,那么 Host 就會直接把數(shù)據包發(fā)送至網絡 X,如下圖所示

在主機為 G2 作為下一跳的網絡 X 創(chuàng)建路由緩存條目后,這些優(yōu)勢在網絡中可見:

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

ICMP 重定向示例如下

 

ICMP 超時消息(類型 11)

在 IP 數(shù)據包中有一個叫做 TTL(Time To Live, 生存周期) ,它的值在每經過路由器一跳之后都會減 1,IP 數(shù)據包減為 0 時會被丟棄。此時,IP 路由器會發(fā)送一個 ICMP 超時消息(ICMP TIme Exceeded Message, 錯誤號 0)發(fā)送給主機,通知該包已經被丟棄。

設置生存周期的主要目的就是為了防止路由器控制遇到問題發(fā)生循環(huán)狀況時,避免 IP 包無休止的在網絡上轉發(fā),如下圖所示

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

 

ICMP 回送消息(類型 0 和 類型 8)

ICMP 回送消息用于判斷相互通信的主機之間是否連通,也就是判斷所發(fā)送的數(shù)據包是否能夠到達目標主機??梢韵驅Χ酥鳈C發(fā)送回送請求的消息(ICMP Echo Request Message,類型 8),也可以接收對端主機發(fā)送來的回送消息(ICMP Echo Reply Message, 類型 0 )。網絡上最常用的 ping 命令就是利用這個實現(xiàn)的。

 

其他 ICMP 消息

ICMP 原點抑制消息(類型 4)

在使用低速率網絡的情況下,網絡通信可能會遇到網絡擁堵的情況下,ICMP 的原點抑制就是為了應對這種情況的。當路由器向低速線路發(fā)送數(shù)據時,其發(fā)送隊列的殘存數(shù)據報變?yōu)?0 從而無法發(fā)送時,可以向 IP 數(shù)據報的源地址發(fā)送一個 ICMP 原點抑制(ICMP Source Quench Message) 消息,收到這個消息的主機了解到線路某處發(fā)生了擁堵,從而抑制 IP 數(shù)據報的發(fā)送。

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

ICMP 路由器探索消息(類型 9、10)

ICMP 路由器探索消息主要用于路由器發(fā)現(xiàn)(Router Discovery, RD),它主要分為兩種,路由器請求(Router Solicitation, 類型 10)路由器響應(Router Advertisement, 類型 9)。主機會在任意路由連接組播的網絡上發(fā)送一個 RS 消息,想要選擇一個路由器進行學習,以此來作為默認路由,而相對應的該路由會發(fā)送一個 RA 消息來作為默認路由的響應。

 

ICMP 地址掩碼消息(類型 17、18)

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

ICMPv6

ICMPv6 的作用

IPv4 中 ICMP 僅僅作為一個輔助作用支持 IPv4。也就是說,在 IPv4 時期,即使沒有 ICMP,也能進行正常的 IP 數(shù)據包的發(fā)送和接收,也就是 IP 通信。但是在 IPv6 中,ICMP 的作用被放大了,如果沒有 ICMP,則不能進行正常的 IP 通信。

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

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

RFC 2463 中描述了以下消息類型:

類型 描述
1 目標不可達 Destination Unreachable
2 數(shù)據包太大 Packet Too Big
3 超時 Time Exceeded
4 參數(shù)問題 Parameter Problem
128 回送請求消息 Echo Request
129 回送應答消息 Echo Reply
130 多播監(jiān)聽查詢 Multicast Listener Query
131 多播監(jiān)聽報告 Multicast Listener Report
132 多播監(jiān)聽結束 Multicast Listener Done
133 路由器請求消息 Router Solicitation
134 路由器公告消息 Router Advertisement
135 鄰居請求消息 Neighbor Solicitation
136 鄰居宣告消息 Neighbor Advertisement
137 重定向消息 Redirect Message
138 路由器重編號 Router Renumbering
139 信息查詢 ICMP Node Information Query
140 信息應答 ICMP Node Information Response
141 反鄰居探索請求消息 Inverse Neighbor Discovery Solicitation
142 反鄰居探索宣告消息 Inverse Neighbor Discovery Advertisement

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

ICMPv6 鄰居探索

鄰居探索是 ICMPv6 非常重要的功能,主要表示的類型是 133 - 137 之間的消息叫做鄰居探索消息。這種鄰居探索消息對于 IPv6 通信起到舉足輕重的作用。鄰居請求消息用于查詢 IPv6 地址于 MAC 地址的對應關系。鄰居請求消息利用 IPv6 的多播地址實現(xiàn)傳輸。

此外,由于 IPv6 實現(xiàn)了即插即用的功能,所以在沒有 DHCP 服務器的環(huán)境下也能實現(xiàn) IP 地址的自動獲取。如果是一個沒有路由器的網絡,就使用 MAC 地址作為鏈路本地單播地址。如果在一個有路由器的網絡環(huán)境中,可以從路由器獲得 IPv6 地址的前面部分,后面部分使用 MAC 地址進行設置。此時可以利用路由器請求消息和路由器公告消息進行設置。

 

ICMPv6 的組播收聽發(fā)現(xiàn)協(xié)議

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

  • 組播收聽查詢消息:組播路由器向子網內的組播收聽者發(fā)送此消息,以獲取組播收聽者的狀態(tài)。組播收聽者報告消息:組播收聽者向組播路由器匯報當前狀態(tài),包括離開某個組播組。組播收聽者。

 

與 ICMP 有關的攻擊

涉及 ICMP 攻擊主要分為 3 類:泛洪(flood)、炸彈(bomb) 和信息泄露(information disclsure)。

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

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

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

cxuan 寫的文章還不錯。會分享計算機底層、計算機網絡、操作系統(tǒng),Java基礎、框架、源碼等文章。