昨天有位學習網路編程的兄弟對於TCP/IP裡一些協議與概念性的東西很模糊,想讓我給他講解一下ICMP。
這不正有空,於是乎隨手抓了個ICMP的包給他分析了一下:
(前面這些概念性的東西,這是基礎的,必看!)
ICMP報文包含在IP資料報中,屬於IP的一個使用者,IP頭部就在ICMP報文的前面。
所以一個ICMP報文包括IP頭部、ICMP頭部和ICMP報文(見圖表,ICMP報文的結構和幾種常見的ICMP報文格式)
IP頭部的Protocol值為1就說明這是一個ICMP報文,ICMP頭部中的類型(Type)域用於說明ICMP報文的作用及格式,
此外還有一個代碼(Code)域用於詳細說明某種ICMP報文的類型,所有資料都在ICMP頭部後面。
RFC定義了13種ICMP報文格式,具體如下:
(思考:你可以在下面的包裡找找,看看我下面抓的包的類型代碼是多少,假如我PING不通主機會不會有ICMP資料包,為什嗎?)
類型代碼 類型描述
0 響應應答(ECHO-REPLY)
3 不可到達
4 源抑制
5 重新導向
8 響應請求(ECHO-REQUEST)
11 逾時
12 參數失靈
13 時間戳記請求
14 時間戳記應答
15 資訊請求(*已作廢)
16 資訊應答(*已作廢)
17 位址遮罩請求
18 位址遮罩應答
其中代碼為15、16的資訊報文已經作廢。
下面是幾種常見的ICMP報文:
1.響應請求
我們日常使用最多的ping,就是響應請求(Type=8)和應答(Type=0),一台主機向一個節點發送一個Type=8的ICMP
報文,如果途中沒有異常(例如被路由器丟棄、目標不回應ICMP或傳輸失敗),則目標返回Type=0的ICMP報文,
說明這台主機存在,更詳細的tracert通過計算ICMP報文通過的節點來確定主機與目標之間的網路距離。
2.目標不可到達、源抑制和逾時報文
這三種報文的格式是一樣的,目標不可到達報文(Type=3)在路由器或主機不能傳遞資料報時使用
,例如我們要串連對方一個不存在的系統連接埠(連接埠號碼小於1024)時,將返回Type=3、Code=3的ICMP報文,
它要告訴我們:“嘿,別串連了,我不在家的!”,常見的不可到達類型還有網路不可到達(Code=0)、
主機不可到達(Code=1)、協議不可到達(Code=2)等。源抑制則充當一個控制流程量的角色,
它通知主機減少資料報流量,由於ICMP沒有恢複傳輸的報文,所以只要停止該報文,主機就會逐漸恢複傳輸速率。
最後,無串連方式網路的問題就是資料報會丟失,或者長時間在網路遊盪而找不到目標,
或者擁塞導致主機在規定時間內無法重組資料報分段,這時就要觸發ICMP逾時報文的產生。
逾時報文的代碼域有兩種取值:Code=0表示傳輸逾時,Code=1表示重組分段逾時。
3.時間戳記
時間戳記請求報文(Type=13)和時間戳記應答報文(Type=14)用於測試兩台主機之間資料報來回一次的傳輸時間。
傳輸時,主機填充原始時間戳記,接收方收到請求後填充接收時間戳記後以Type=14的報文格式返回,
發送方計算這個時間差。一些系統不響應這種報文。
理論知識講這麼,下面是我在命令列用WildPackets OmniPeek捕獲到的本機資料包:
1、開啟WildPackets OmniPeek,單擊New ,在Filters裡選擇ICMP,然後確定點擊右邊的Start Capture:
2、依次點擊“開始/運行”,輸入cmd開啟命令列:
3、在命令列輸入ping www.qq.com斷行符號即可,當ping通返回一次後立即按ctr + c終止,此時OmniPeek裡就有兩行ICMP包了:
4、回到OmniPeek中,此是有兩行記錄:
5、雙擊開啟第一個資料包,內容如下:
這樣,一個完整ICMP請求的資料包就呈現在我們面前了。
6、下面是從主機返回的資料包,也是抓到的第2個包(可以從Source IP Address與Dest. IP Address區分),
的資料包每項資訊等這些選項我就不解釋了,參照橫面的看看吧:
以上就是ICMP資料包的所有內容,看書的同時最好能實際抓包來看看,這樣學習起來更能加深影像!