ICMP
因特網控制報文協議
ICMP,即因特網控制報文協議,在主機和路由器之間起到溝通網絡層信息的作用。最典型的用途就是差錯報告,它允許主機或路由器報告查錯情況和提交有關異常情況的報告。例如網絡通不通、主機是否可達、路由是否可用等網絡本身的消息,這些控制消息雖對於數據的傳遞起着重要的作用。ICMP 報文作為 IP 有效載荷承載的,因此雖然 ICMP 被認為是 IP 的一部分,但在體系結構上 ICMP 位於 IP 之上。當主機接收到指明上層協議為 ICMP 的 IP 數據報時,該數據報分解的內容應當交給 ICMP。
ICMP 報文格式
ICMP 報文包括 IP 頭部、ICMP 頭部和 ICMP 報文 3 個部分,這是可以理解的,因為 ICMP 報文作為 IP 有效載荷承載的。
Type:ICMP 的類型,標識生成的錯誤報文;
Code:進一步划分 ICMP 的類型,該字段用來查找產生錯誤的原因;
Checksum:校驗碼,字段包含有從 ICMP 報頭和數據部分計算得來的,用於檢查錯誤的數據;
ID:ID 值,在 Echo Reply 類型的消息中要返回這個字段;
Sequence:這個字段包含一個序號,在 Echo Reply 類型的消息中要返回這個字段。
ICMP 報文類型
ICMP 有 2 類報文:
- 差錯報告報文(5 種)
- 目的不可達:路由器或主機不能交付數據報
- 超時或超期:路由器收到生存時間為 0 的數據報
- 參數有問題:路由器或主機收到數據報中,首部有字段的值不正確
- 重定向:改變主機下一次發生數據報所選的路由
- 源抑制:發送給源主機,令其降低發送數據的速率(現在不用了)
- 網絡探詢報文(2 組)
- 回聲請求與應答:主機或路由器向特定主機發送詢問
- 時間戳請求與應答:請求某台主機或路由器應答當前日期和時間
- 不再使用的報文
- 信息請求與應答
- 子網掩碼請求與應答
- 路由器詢問和通報
常用報文類型如下:
我們留意 3 個報文。首先是回顯應答 (Echo Reply) 報文,我們知道 Ping 程序是會發送一個回顯請求(類型 8 編碼 0)報文給目的主機,目的主機收到之后就發送回顯應答(類型 0 編碼 0)報文進行回顯。
接着是TTL 報文(類型 11 編碼 0),這個是在 Traceroute 程序中,路由器檢查到 Traceroute 發出的 IP 數據報中 TTL 正好過期,因此路由器就需要丟包並且發送該警告報文返回源主機。源主機就可以得到路由器的 IP 地址,以此達到路由追蹤的目的。
還有一個是源抑制報文,這個報文是為了執行擁塞控制,令擁塞的路由器可以通過發送該報文令主機發送速率降低,不過 TCP 在運輸層有自己的擁塞控制手法,因此源抑制報文在實踐中很少使用。
Ping 程序
Ping 程序簡介
Ping 程序允許我們驗證某主機是否存在,通過將數據包發送到目標 IP 地址, 如果目標主機在線則目標主機中的 Ping 程序將會發送響應數據包進行響應,這兩個 Ping 數據包都是 ICMP 數據包。
例如 Ping 一下集美大學官網:
實驗步驟
- 打開 windows 的命令提示符。
2. 啟動 Wireshark 數據包嗅探器,並開始 Wireshark 數據包捕獲。
3. Ping 程序在 c:\windows\system32 目錄中,輸入“ping –n 10 hostname” 或 “c:\windows\system32\ping –n 10 hostname”,其中 hostname 最好是另一個大陸的主機名,參數 -n 10 代表發送 10 個 Ping 消息,然后執行命令。
那就選擇麻省理工學院官網 “www.mit.edu”來測試。
我主機上的 ping 程序發送了10 個查詢包並收到了 9 個響應,有 1 個包丟失,對於每個響應,源計算往返時間(RTT),數據包平均為 200 毫秒。
4. Ping 程序終止時,停止在 Wireshark 中捕獲數據包。
數據包列表顯示 19 個數據包,說明源發送的 10 個 Ping 查詢和源接收的 9 個 Ping 響應。數據包內容區域可以查看此數據包的信息,該數據包中的 IP 數據報的協議號ICMP 的協議號 01,這表示 IP 數據報的有效載荷是 ICMP 數據包。
查看該 ICMP 包的詳情信息,數據包包含校驗和,標識符和序列號,該 ICMP 數據包是類型 8 和代碼 0,也就是“回應請求”數據包。
問題解答
- 源主機的 IP 地址是多少?目標主機的 IP 地址是多少?
源主機:192.168.67.249
目標主機:104.86.239.32
2. 為什么 ICMP 數據包沒有源端口號和目的端口號?
因為 ICMP 報文作為 IP 有效載荷承載的,不需要像 TCP 或 UDP 那樣需要端口號。
3. 查看任意的請求 ICMP 數據包,ICMP 類型和代碼是什么?該 ICMP 數據包還有哪些其他字段?校驗和,序列號和標識符字段有多少字節?
類型 8 和代碼 0,也就是回應請求報文,還有校驗和,序列號和標識符字段,都是 4 字節。
4. 查看任意的響應 ICMP 數據包,ICMP 類型和代碼是什么?該 ICMP 數據包還有哪些其他字段?校驗和,序列號和標識符字段有多少字節?
類型 0 編碼 0 是回顯應答報文,還有校驗和,序列號和標識符字段,都是 4 字節。
Traceroute 命令
Traceroute 簡介
Traceroute 程序可用於確定數據包從源到目的地的路徑,原理是發送 TTL 增加的數據包,當 TTL = 1 的包達到路由器,該路由器會將該包丟棄,並且發送 ICMP 錯誤給請求的機器。
traceroute 通過首先發送一個或多個帶有生存時間 (TTL) 字段設置為 1 的數據報;然后發送一個或多個帶有 TTL 字段設置為 2 的數據報到同一個目的地;然后發送一個或多個帶有 TTL 字段設置為 3 的數據報到同一個目的地,以此類推,直到目的地真正收到此數據報為止。路由器必須將每個接收到的數據報中的 TTL 減 1,如果 TTL 達到 0,路由器會向來源主機發送 ICMP 消息。由於這種行為,TTL 為 1 的數據報將導致距發送方一次跳躍的路由器,將 ICMP TTL 超出的消息發送回發送方主機;以TTL 為 2 發送的數據報將導致距離為兩次跳躍的路由器,將 ICMP 消息發送回發送方主機等等。以這種方式,執行 traceroute 的主機可以通過查看包含ICMP TTL 超出消息的數據報中的來源 IP 地址來獲知其自身與目的地之間的路由器的身份。
實驗步驟
- 打開 windows 的命令提示符。
2. 啟動 Wireshark 數據包嗅探器,並開始 Wireshark 數據包捕獲。
3. tracert 程序在 c:\windows\system32 目錄中,在命令提示符中輸入“tracert hostname” 或 “c:\windows\system32\ tracert hostname”。其中 hostname 是另一個大陸的主機名,訪問法國 INRIA(計算機科學研究所)“www.inria.fr”。
需要等上一段時間。
- tracert 程序終止時,停止在 Wireshark 中捕獲數據包。
對於每個 TTL 值,源程序發送三個探測包。 Traceroute 顯示每個探測包的 RTT,以及返回 ICMP TTL 超出消息的路由器的 IP 地址和名稱。
問題解答
- 您的主機的 IP 地址是多少?目標目標主機的 IP 地址是多少?
源主機:192.168.67.249
目標主機:128.93.162.63
6. 如果 ICMP 發送了 UDP 數據包(如在 Unix / Linux 中),那么探測數據包的 IP 協議號仍然是 01 嗎? 如果沒有,它會是什么?
待解答。
7. 檢查屏幕截圖中的 ICMP 響應數據包。這與本實驗的前半部分中的 ICMP ping 查詢數據包不同嗎?如果不同,請解釋為什么?
不同,這里的 ICMP 報文時 **TTL 報文(類型 11 編碼 0),這個是在 Traceroute 程序中,路由器檢查到 Traceroute 發出的 IP 數據報中 TTL 正好過期,因此路由器就需要丟包並且發送該警告報文返回源主機。這個與 Ping 程序中所要達成的目的不同,Ping 程序是為了請求響應。
8. 檢查屏幕截圖中的 ICMP 錯誤數據包。它具有比 ICMP 響應數據包更多的字段。這個數據包含哪些內容?
比響應數據包多了 ICMP 請求數據包的內容。
9. 檢查源主機收到的最后三個 ICMP 數據包。這些數據包與 ICMP 錯誤數據包有何不同?他們為什么不同?
這個是目的主機返回的回顯應答報文,因為 tracert 程序的原理是發送 TTL 增加的數據包,當 TTL = 1 的包達到路由器,該路由器會將該包丟棄,並且發送 ICMP 錯誤給請求的機器。而最后一組 3 個數據報時可以到達目的主機的,這時由於是被目的主機接收,目的主機不會丟包,而是確確實實收到的這個探測的數據報並進行了響應。
10. 在 tracert 跟蹤測量中,是否有一個連接的延遲比其他連接長得多?是否有連接的延遲明顯長於其他連接?根據路由器名稱,您能猜出這個連接末端的兩個路由器的位置嗎?
在第 8 個節點和第 9 個節點之間時延突增,之后的節點時延都達到了 250+ ms。之后的路由器名都是英文名,且目的地是法國,那應該是連接到了亞洲轉歐洲的分界路由器了。
用 Best trace 做一次路由追蹤,看來確實在這兩個節點出現了從上海到倫敦的大跳躍!
參考資料
《計算機網絡 自頂向下方法》 [美] James F.Kurose,Keith W.Ross 著,陳鳴 譯,機械工業出版社
ICMP
互聯網控制消息協議