ICMP協議 詳解!

ICMP 經常被認為是 IP 層的一個組成部分,它傳遞差錯報文以及其他需要注意的資訊。ICMP 報文通常被 IP 層或更高層協議使用。ICMP 報文是在 IP 資料包內部傳輸的。

AD:【51CTO技術沙龍】春節獻禮:移動APP創新之美_UI設計

ICMP 協議基礎詳解

ICMP 經常被認為是 IP 層的一個組成部分,它傳遞差錯報文以及其他需要注意的資訊。ICMP 報文通常被 IP 層或更高層協議(TCP 或 UDP)使用。ICMP 報文是在 IP 資料包內部傳輸的。IP 協議是不可靠協議,不能保證 IP 資料包能夠成功的到達目的主機,無法進行差錯控制,而 ICMP 協議能夠協助 IP 協議完成這些功能。下面是 ICMP 報文的資料結構:

型別:一個 8 位型別欄位,表示 ICMP 資料包型別;

程式碼:一個 8 位程式碼域,表示指定型別中的一個功能,如果一個型別中只有一種功能,程式碼域置為 0;

檢驗和:資料包中 ICMP 部分上的一個 16 位檢驗和;

ICMP 報文型別

ICMP 報文大致可分為兩類:差錯報文、查詢報文。具體訊息型別如下表所示:

ICMP 差錯報文

當傳送一份差錯報文時,報文始終包含 IP 的首部和產生 ICMP 差錯報文的 IP 資料包的前 8 位位元組。這樣,接收 ICMP 差錯報文的模組就會把它與某個特定的協議(根據 IP 資料包首部中的協議欄位來判斷)和使用者程序(根據包含在 IP 資料包前 8 個位元組中的 TCP 或 UDP 報文首部中的 TCP 或 UDP 埠號來判斷)聯絡起來。

下面各種情況不會導致產生 ICMP 差錯報文:

ICMP 報文差錯(ICMP查詢報文可能會產生ICMP差錯報文);

目的地址是廣播地址或多播地址的 IP 資料包;

作為鏈路層廣播的資料包;

不是 IP 分片的第一片;

源地址不是單個主機的資料包,也就是說,源地址不可能是零地址、環回地址、廣播地址或多播地址;

以下針對 ICMP 差錯報文的型別進行分析:

1、ICMP 目標不可達訊息:IP 路由器無法將 IP 資料包傳送給目的地址時,會給傳送端主機返回一個目標不可達 ICMP 訊息,並在這個訊息中顯示不可達的具體原因。

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

3、ICMP 超時訊息:IP 資料包中有一個欄位 TTL(Time to live,生存週期),它的值隨著每經過一個路由器就會減 1,直到減到 0 時該 IP 資料包被丟棄。此時,IP 路由器將傳送一個 ICMP 超時訊息給傳送端主機,並通知該包已被丟棄。

4、源抑制訊息:當 TCP/IP 主機傳送資料到另一主機時,如果速度達到路由器或者鏈路的飽和狀態,路由器發出一個 ICMP 源抑制訊息。

ICMP 查詢報文

—-ICMP 回送訊息:用於進行通訊的主機或路由之間,判斷髮送資料包是否成功到達對端的訊息。可以向對端主機傳送回送請求訊息,也可以接收對端主機回來的回送應答訊息。

—-ICMP 地址掩碼訊息:主要用於主機或路由想要了解子網掩碼的情況。可以向那些主機或路由器傳送 ICMP 地址掩碼請求訊息,然後通過接收 ICMP 地址掩碼應答訊息獲取子網掩碼資訊。

—-ICMP 時間戳訊息:可以向那些主機或路由器傳送 ICMP 時間戳請求訊息,然後通過接收 ICMP 時間戳應答訊息獲取時間資訊。

Ping 程式

Ping 程式利用 ICMP 回顯請求報文和回顯應答報文(而不用經過傳輸層)來測試目標主機是否可達。它是一個檢查系統連線性的基本診斷工具。

ICMP 回顯請求和 ICMP 回顯應答報文是配合工作的。當源主機向目標主機傳送了 ICMP 回顯請求資料包後,它期待著目標主機的回答。目標主機在收到一個 ICMP 回顯請求資料包後,它會交換源、目的主機的地址,然後將收到的 ICMP 回顯請求資料包中的資料部分原封不動地封裝在自己的 ICMP 回顯應答資料包中,然後發回給傳送 ICMP 回顯請求的一方。如果校驗正確,傳送者便認為目標主機的回顯服務正常,也即物理連線暢通。

例如:在終端上 Ping 下谷歌的地址,神奇的發現谷歌地址既然不用翻牆都能上了,而且丟包率 0%。

  1. $ ping www.google.com   
  2. PING www.google.com (173.194.127.148) 56(84) bytes of data.   
  3. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=1 ttl=48 time=11.0 ms   
  4. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=2 ttl=48 time=10.8 ms   
  5. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=3 ttl=48 time=11.1 ms   
  6. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=4 ttl=48 time=10.8 ms   
  7. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=5 ttl=48 time=11.1 ms   
  8. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=6 ttl=48 time=11.0 ms   
  9. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=7 ttl=48 time=10.5 ms   
  10. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=8 ttl=48 time=9.96 ms   
  11. 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=9 ttl=48 time=10.9 ms   
  12. ^C   
  13. — www.google.com ping statistics —   
  14. 9 packets transmitted, 9 received, 0% packet loss, time 8009ms   
  15. rtt min/avg/max/mdev = 9.963/10.830/11.123/0.368 ms   

Traceroute 程式

Traceroute 程式主要用來偵測源主機到目的主機之間所經過的路由的情況。

Traceroute 使用 ICMP 報文和 IP 首部中的 TTL 欄位,它充分利用了 ICMP 超時訊息。其原理很簡單,開始時傳送一個 TTL 欄位為 1 的 UDP 資料包,而後每次收到 ICMP 超時蕭後,按順序再傳送一個 TTL 欄位加 1 的 UDP 資料包,以確定路徑中的每個路由器,而每個路由器在丟棄 UDP 資料包時都會返回一個 ICMP 超時報文,而最終到達目的主機後,由於 ICM P選擇了一個不可能的值作為 UDP 埠(大於30000)。這樣目的主機就會傳送一個埠不可達的 ICMP 差錯報文。