簡介
ICMP 是 Internet Control Message Protocol 的簡寫. 它主要用來調試網絡通信環境中存在的問題.
比如,當 IP 數據包總是無法正常的發送到目的地址, 當網關沒有足夠的 buffer 來轉發對應的數據包 等問題.
值得一提的是,它屬於網絡層,不屬於傳輸層. 也就是說它和 IP 協議處於同一層次,而並不是與 TCP/UDP 處於同一層次.
消息格式
ICMP 協議使用 IP 協議頭來傳輸數據. 具體的數據就是 ICMP 規定的一些數據包,我們接下來一一介紹…
因爲 ICMP 格式與 IP 相同,這裏我們簡單介紹以下各個字段. 詳細請參考 協議簇: IPv4 詳解
幾個需要特別注意的字段,及其值:
- Version: 4
- Type of Service: 0
- Protocol: ICMP = 1
接下來,我們來看看常見的 ICMP 報文實例
Destionation Unreachable Message
各字段的意義及其值:
- Type:3
- Code:
0 = net unreachable
1 = host unreachable
2 = protocol unreachable
3 = port unreachable
4 = fragmentation needed and DF set
5 = source route failed - Checksum: 檢查和
- Internet Header + 64 bits of Data Datagram: 該字段存放原始的 ICMP 請求,以便將當前這個 ICMP 報文與請求報文對應起來.
描述
- 當根據網關的漏油表推斷出該網絡地址不可達,網關有可能會返回此ICMP消息。
- 目的端收到 IP 數據包,但是無法正常將該數據包傳送到對應端口(該端口有可能沒有啓用), 目的端有可能會返回此 ICMP 消息
- 當數據包必須被分片才能正常的發送到目的端,當時當前數據包卻設置了 Don’t Fragment 標記,此時網關有可能會返回此 ICMP 消息
實例
筆者在自己機器上使用 ping 192.168.1.44 命令得到了 Destination unreachable 消息的包,這裏我們來分析以下
- 首先注意最上面的 IP 協議數據內容, Protocol 字段值是 1,表明當前數據包是一個 ICMP 消息。 目的地址和源地址相同,說明從我本地的路由表中解析不到 192.168.1.44 這個地址。
- 接下來是一個 ICMP 消息。 該消息作爲 IP 協議的 Data 字段搭載在 IP 協議數據包上.
- ICMP 消息的 type 是 3, 正是 Destionation Unreachable Message
- Code 是 1, 表明主機不可達
- Internet Header + 64 bits of Data Datagram 字段中包含了我們發送的 ICMP 請求的 IP 數據包. 由這個 IP 包的源地址和目的地址得知,我本地是 192.168.1.35, 我 ping 了主機 192.168.1.44. 至於這個 ICMP 請求,我們先不分析,後邊我們專門來分析.
Time Exceeded Message
它的包格式與 Destionation Unreachable Message 相同,這裏不再贅述.
各字段的意義及其值:
- Type:11
- Code:
0 = time to live exceeded in transit
1 = fragment reassembly time exceeded
描述
- IP 協議規定當某個數據包在傳輸過程中 TimeToLive 字段的值減少到 0, 那個這個數據包應該被丟棄. 於此同時,丟棄數據包的網關有可能會給源主機發送此 ICMP 消息來通知該數據包被丟棄.
- 當目的端收到分片的數據包後,但是由於部分分片丟失而無法在指定時間內完成數據包重組,那麼該數據包會被丟棄, 丟棄數據包的網關有可能會給源主機發送此 ICMP 消息來通知該數據包被丟棄.
實例
筆者使用 ping -i 2 baidu.com 命令抓取到了此類型的 ICMP 數據包,這裏我們省略掉於前文重複的部分,直接貼出 ICMP 包相關的信息
- 這裏注意,IP 頭中 Time to live 字段的值是 1,而不是 0. 猜測是因爲在處理該數據包的中間節點發現它並不是該數據包的目的地址,而此時 time to live 已經是 1,自己處理完之後再將該值減少 1 之後,該數據包的 time to live 就是 0,因此,該節點給我們發送了 time exceeded message.
Parameter Problem Message
各字段的意義及其值:
- Type:12
- Code:
0 = pointer indicates the error - Pointer: 當 code == 0, 這個字段指明出錯的字節位置.
描述
當網關或者目標主機無法根據 IP 頭正確的解析此數據包時,就會丟棄該數據包併發送此 ICMP 報文.
這個問題的可能原因是 錯誤的使用 Option.
Source Quench Message
它的包格式與 Destionation Unreachable Message 相同,這裏不再贅述.
各字段的意義及其值:
- Type:4
- Code: 0
描述
當網管或者目標主機沒有足夠的 buffer 來處理對應的數據包時,就會丟棄數據包併發送此 ICMP 報文
Redirect Message
各字段的意義及其值:
- Type:5
- Code:
0 = Redirect datagrams for the Network
1 = Redirect datagrams for the Host
2 = Redirect datagrams for the Type of Service and Network
3 = Redirect datagrams for the Type of Service and Host - Gateway Internet Address: 該字段指明發送給當前目的主機的數據包都應該被髮送給 Gateway Internet Address 所指定的網關
描述
這種 ICMP 消息在如下情況下會被髮送:
假定網關 G1 從一個相連的主機或網關收到一個數據包,G1 檢查自己的路由表找到該數據包應該被轉發給網關 G2,再由 G2 繼續轉發,直到該數據包到達主機 X. 但是如果 G2 和 該數據包的源地址處於同一個網絡,那麼此時 G1 會發送此 ICMP 消息來建議源主機將發送給 X 的數據包都直接發送給 G2,這樣路由長度最短,數據發送速度更快.
Echo or Echo Reply Message
各字段的意義及其值:
- Type:
8 = Echo Message
0 = Echo Reply Message - Code: 0
- Identifier 和 sequence number: 當 code = 0 時, 使用 Identifier 和 sequence number 來幫助將 Echo Message 和 Echo Reply Mesage 對應起來
描述
正如我們前面已經看到,我們在收到一個 ICMP 響應時,響應的 ICMP 數據包中都會包含對應 Echo Message.
實例
下面展示一個 Echo Message 的結構
下面時對應的 Echo Reply Message 的結構
值得注意的時: Echo Message 和 Echo Reply Message 中的 identifier 和 sequence number 字段時相同的. 這樣我們就得知 這兩個數據包時互相對應關係.
而我們收到了 Echo Reply Message,也就證明我們到對應的目的主機的鏈路是工作的.
Timestamp or Timestamp Reply Message
各字段的意義及其值:
- Type:
13 = Timestamp Message
14 = Timestamp Reply Message - Code: 0
- Identifier 和 sequence number: 同 Echo Message 和 Echo Reply Message.
- Originate Timestamp:發送方發送最後一次修改這個數據包的 timestamp
- Receive Timestamp: 接收方接收這個數據包的 timestamp
- Transmit Timestamp: 接收方最後一次修改這個數據包的 timestamp
Information Request or Information Reply Message
各字段的意義及其值:
- Type:
15 = Information Request Message
16 = Information Reply Message - Code: 0
- Identifier 和 sequence number: 同 Echo Message 和 Echo Reply Message.
描述
這個數據包發送時不填寫目的地址字段,接收方在 reply message 中填寫自己的地址信息.
使用這個數據包可以用來發現當前網絡中所有的主機地址信息.
END!