目錄
ICMP協議
ICMP報文格式
ICMP回顯請求/應答報文
ICMP差錯報文
ICMP 宿主機不可達差錯報文
ICMP 重定向差錯報文
ICMP TTL超時差錯報文
ICMP協議
ICMP協議的作用
ICMP(Internet Control massage protocol)因特網控制協議,主要用來在網絡設備間傳遞各種差錯、控制和查詢等消息(在收集網絡信息、診斷、排查故障等方面具有重要的作用)
ICMP是網絡層協議,協議號為1
為什么需要ICMP差錯報文
IP協議的缺點
1、IP協議沒有差錯報文或差錯糾正機制
2、IP協議缺少一種為主機和管理查詢的基址
所以ICMP協議就是為了補充IP協議的這兩個缺點而設計的,配合IP協議使用
ICMP報文格式
通過Type和Code定義ICMP的報文類型
ICMP報文主要分為查詢報文和差錯報文兩大類
查詢報文:主要用于在主機和路由器之間傳輸控制信息,也用來探測網絡連通性和路徑等信息
差錯報文:用于報告數據傳輸過程中的錯誤
Type | Code | 描述 |
|
0 | 0 | 回顯應答(ping應答) | 查詢報文 |
8 | 請求回顯(ping請求) | ||
9 | 路由器通告 | ||
10 | 路由器請求 | ||
13 | 時間戳請求(目前已不使用) | ||
14 | 時間戳應答(目前已不使用) | ||
15 | 信息請求(目前已不使用) | ||
16 | 信息應答(目前已不使用) | ||
17 | 地址掩碼請求 | ||
18 | 地址掩碼應答 | ||
3(目的不可達報文) | 0 | 網絡不可達 | 差錯報文 |
1 | 主機不可達 | ||
2 | 協議不可達 | ||
3 | 端口不可達 | ||
6 | 目的網絡不認識 | ||
7 | 目的主機不認識 | ||
9 | 目的網絡被強制禁止 | ||
10 | 目的主機被強制隔離 | ||
11 | 由于TOS,網絡不可達 | ||
12 | 由于TOS,主機不可達 | ||
13 | 由于過濾,通信被強制禁止 | ||
4(源抑制報文) | 0 | 源端被關閉 | |
5(ICMP重定向報文) | 0 | 對網絡重定向 | |
1 | 對主機重定向 | ||
2 | 對服務類型和網絡重定向 | ||
3 | 對服務類型和主機重定向 | ||
11(TTL為0報文) | 0 | 傳輸期間生存時間為0 | |
1 | 在數據報組裝期間生存時間為0 | ||
12(報文格式問題) | 0 | 壞的IP首部 | |
1 | 缺少必須的選項 |
ICMP回顯請求/應答報文
作用
通過ping工具發送ICMP回顯請求消息探測網絡的連通性(對端回應ICMP回顯應答請求)
通過tracert工具發送ICMP回顯請求來探測去往某目的網路的路徑信息(修改ICMP回顯請請求的TTL的值,通過對端回應的Type為11的ICMP差錯報文來得到路徑信息)
報文格式
Type
8為請求
0為應答
Identifier
標識符,標識ICMP該回顯應答對應的是哪個回顯請求(通過該字段使得請求和應答一一對應)
BE和LE是通過不同的編碼格式得到的值,解碼后的信息都是一樣的
可以理解為BE是針對于windows系統的編碼格式,LE是針對于Linux系統的編碼格式
Sequence Number
序列號,發送報文的序列號,每次發送序列號就+1
Data
可選,包含要發送的數據(回顯應答通常返回與回顯請求所收到的數據相同)
ICMP差錯報文
ICMP差錯報文都有一個的字段(IP頭部+原始數據包的前64 bits)
該字段的內容包含出錯數據包的IP頭部以及出錯數據包的前64位數據(端口號、序列號、其它協議報文頭部等)
該字段的作用就是將產生該錯誤的報文附帶在差錯報文中,當管理員看到差錯報文時知道是什么原因產生的錯誤,有利于排查錯誤
以下情況不會產生ICMP差錯報文
1、對于攜帶ICMP差錯報文的數據包,不會在產生ICMP差錯報文
2、對于分片的數據包,如果不是第一個分片,則不會產生ICMP差錯報文
3、對于具有組播地址的數據報文,不會產生ICMP差錯報文
4、對于具有特殊地址的數據報文(如127.0.0.0和0.0.0.0),不會產生ICMP差錯報文
ICMP 宿主機不可達差錯報文
一般是本地沒有去往報文目的IP地址的路由,就會向報文的源IP地址回應ICMP差錯報文(宿主機不可達)
網絡不可達差錯報文(當路由器上沒有去往目的網段的路由時就會發送網絡不可達差錯報文)
從數據包中可以看出來
- 當ICMP Echo Request報文到達192.168.10.254這臺設備時
- 這臺設備(10.254)發現自己沒有去往該報文目的地址100.0.0.1的路由
- 此時這臺設備(10.254)就發送ICMP差錯報文-網絡不可達消息給ICMP Echo Request報文的源IP地址(10.129)
端口不可達IP報文(一般在tracert跟蹤路由場景下會出現此差錯報文)
Tracert主要是用來跟蹤路徑,在跟蹤路徑的過程中如果某個路由器或目標主機上的應用程序沒有在相應的端口上監聽,此時收到ICMP回顯請求時會回應端口不可達的ICMP差錯報文、或者當網絡管理員阻止了ICMP回顯請求時也會發送端口不可達的ICMP差錯報文(端口不可達信息不止因為Tracert產生,還會因為其它操作產生,只是Tracert是比較常見的)
從數據包中可以看出來
- 當172.22.105.211訪問172.22.105.254的137端口時
- 這臺設備(105.254)發現自己并沒有開啟該端口的監聽(或者拒絕接收ICMP回顯請求)
- 此時這臺設備(105.254)就發送ICMP差錯報文-端口不可達消息給172.22.105.211
ICMP 重定向差錯報文
產生重定向報文的場景
1、從一個接口接收到的報文再從同一個接口發出去,一般就會產生ICMP重定向(不一定是環路)
2、當設備從某個接口收到發往遠程網絡的數據時,發現源IP地址與下一跳屬于同一網段時也會產生ICMP重定向
ICMP重定向報文的作用
當主機收到ICMP重定向差錯報文后,會將自己去往目的IP地址(該目的IP地址為ICMP差錯報文中攜帶的IP頭部的目的IP地址)的網關設置為該地址
即ICMP重定向報文會通知該主機修改自身的路由表(將去往目的IP地址的下一跳修改為ICMP重定向報文攜帶的最佳下一跳的IP地址)
報文格式
從數據包中可以看出來
- 當192.168.10.129這臺設備去訪問192.168.10.1時,將此數據包發給了192.168.10.254
- 此時192.168.10.254發現自身去往192.168.10.1的下一跳接口為自己接收此報文的入接口,并且也發現源IP10.129與目的IP10.1為同一網段
- 此時10.254這臺設備就認為10.129可以直接去往10.1
- 于是10.254就向10.129發送ICMP重定向報文(Gateway字段設置為10.1),讓10.129訪問10.1可以直接將報文交給10.1,不需要再交給自己
ICMP TTL超時差錯報文
當IP數據包在傳輸過程,在還沒有到達目的IP地址的時候IP層的TTL變為0(路由器收到時為1的報文就會認為TTL超時),此時該路由器就會發送ICMP差錯超時報文(Tracert就是通過差錯報文來跟蹤路徑的)
報文格式
從數據包中可以看出來
- 當172.22.105.211這臺設備去訪問1.1.1.1,封裝數據包
- 當172.22.105.254收到該數據包是發現該報文的TTL為1,但是本設備又不是報文的目的地址
- 于是105.254就向105.211發送ICMP TTL超時報文,讓其增加TTL值