ICMP協議是Internet控制報文協議,通常被認為是IP層的組成部分。它傳遞差錯報文以及其它需要注意的信息。ICMP協議通常被IP層或更高層協議使用。
Ping命令是ICMP協議的一個使用范例。Ping命令主要是用於測試一台主機和另外一台主機之間的網絡連通性。主要的過程就是Ping程序通過發送回顯請求報文,然後接收遠程主機的回顯應答報文,通過分析回顯應答報文就可知道兩台主機的網絡連通性。
ICMP數據報首部如下
| 類型(0或8) | 代碼(0) | 校驗和 |
| 標識符 | 序號 |
| 選項數據 |
實現ping命令主要就是自己構造ICMP回顯請求報文,通過套接字發送到目的主機,然後接收目的主機的ICMP回顯應答報文,通過解析回顯應答報文就知道是否可以到達遠程主機了!
下面來說一下分析一下ICMP報文首部各個字段的具體含義,只有知道了具體的含義才能知道怎麼來構造自己的ICMP報文:
ICMP回顯請求報文和回顯應答報文都屬於查詢類報文的一種。類型字段指名了該報文是回顯請求報文還是回顯應答報文:0代表回顯應答報文,8代表回顯請求報文;代碼字段在這兩種報文的情況下都是0;校驗和是重點,應該無效的報文是不能利用的,所以,通過校驗和我們可以獲取有效報文再進行報文分析;標識符字段一般的做法都是設置為進程的ID號,這樣簡潔明了,而且使得我們可以在一台主機上運行多個ping命令實例,不會發生沖突。序號字段從0開始,每發送一次新的會顯請求就會增加1.數據選項我們只需注意,回顯請求報文和回顯應答報文該字段設置成一樣即可。
下面看看ICMP在linux下有關數據結構的標示方式:定義可查看
http://freebsd.active-venture.com/FreeBSD-srctree/newsrc/netinet/ip_icmp.h.html
首先看看回顯請求和回顯應答的命令定義: