1.概述
ICMP是(Internet Control Message Protocol)Internet控制報文協議。它是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制消息。控制消息是指網絡通不通、主機是否可達、路由是否可用等網絡本身的消息。這些控制消息雖然並不傳輸用戶數據,但是對於用戶數據的傳遞起着重要的作用。
ICMP報文是在IP數據報內部被傳輸的。


ICMP報文的格式如圖所示。

- 類型字段:可以有15個不同的值,來描述特定類型的ICMP報文。
- 代碼:進一步描述類型的不同條件
- 檢驗和:ICMP的檢驗和是必需的。
2.ICMP報文的類型
各種類型的ICMP報文如圖所示。

不同類型由報文中的類型字段和代碼字段共同決定。圖中最后兩列表明ICMP報文是一份查詢報文還是一份差錯報文。
以下情況不會導致產生ICMP差錯報文:
- ICMP差錯報文(避免無休止的循環下去,但是ICMP查詢報文有可能產生ICMP差錯報文)
- 目的地址是廣播地址或者多博地址的IP數據報
- 作為鏈路層廣播的數據報
- 不是IP分片的第一片。
- 源地址不是單個主機的數據報。這就是說,源地址不能為零地址,環回地址,廣播地址或者多博地址。
ICMP地址掩碼請求與應答用於無盤系統引導過程中獲取自己的子網掩碼。系統廣播它 ICMP請求報文,或者使用BOOTP協議。ICMP地址掩碼請求和應答報文如圖所示。


ICMP報文中的標識符和序列號字段由發送端任意選擇指定。
4.ICMP時間戳請求與應答
ICMP時間戳請求允許系統向另一個系統查詢當前的時間。返回的建議值是自午夜開始計算的毫秒數,協調的同一時間(UTC)。ICMP時間戳請求和應答報文如圖所示。

請求端填寫發起時間戳,然后發送報文。應答系統收到請求報文時填寫接收時間戳。在發送應答時填寫發送時間戳。
5.ICMP端口不可達差錯
ICMP端口不可達差錯報文,是收到一個UDP數據報而目的端口與某個正在使用的進程不相符,則返回一個ICMP不可達報文。
ICMP報文是主機之間交換的,而不用目的端口號。
ICMP的一個規則是:ICMP差錯報文必須包括生成該差錯報文的數據報IP首部,還必須至少包括跟在該IP首部后面的前8個字節。如圖所示。


6.ICMP主機與網絡不可達差錯
當路由器收到一份IP數據報但又不能轉發時候,就要發送一份ICMP“主機不可達”差錯報文。
7.ICMP重定向差錯
當IP數據報應該被發送到另一個路由器時,收到數據報的路由器就要發送ICMP重定向差錯報文給IP數據報的發送端。
重定向一般用來讓具有很少選路信息的主機逐漸建立更完善的路由表。
ICMP重定向報文的格式如圖所示。


ICMP重定向報文的接收者必須查看三個IP地址
- 導致重定向的IP地址(即ICMP重定向報文的數據位於IP數據報的首部)
- 發送重定向報文的路由器的IP地址(包含重定向信息的IP數據報中的源地址)
- 應該采用的路由器IP地址。


8.ICMP路由器發現報文
主機在引導以后要廣播或多播傳送一份路由請求報文。一台或更多的路由器響應一份路由器通告報文。
ICMP路由器請求報文的格式如圖所示:


ICMP路由器通告報文格式:


主要用來更新路由表。