// ICMP header
typedef struct _tagX_icmphdr
{
unsigned char i_type; //類型
unsigned char i_code; //代碼
unsigned short i_cksum; //檢驗和
unsigned short i_id; //標識符
unsigned short i_seq; //序號
unsigned long i_timestamp; //目前時間 =(unsigned long)::GetTickCount();
}XIcmpHeader;
各種ICMP報文的前32bits都是三個長度固定的欄位:type類型欄位(8位)、code代碼欄位(8位)、checksum校正和欄位(16位)
8bits類型和8bits代碼欄位:一起決定了ICMP報文的類型。常見的有:
類型8、代碼0:回射請求。
類型0、代碼0:回射應答。
類型11、代碼0:逾時。
16bits校正和欄位:包括資料在內的整個ICMP資料包的校正和,其計算方法和IP頭部校正和的計算方法是一樣的。
是一張ICMP回射請求和應答報文頭部格式
對於ICMP回射請求和應答報文來說,接下來是16bits標識符欄位:用於標識本ICMP進程。
最後是16bits序號欄位:用於判斷回射應答資料報。
ICMP報文包含在IP資料報中,屬於IP的一個使用者,IP頭部就在ICMP報文的前面
一個ICMP報文包括IP頭部(20位元組)、ICMP頭部(8位元組)和ICMP報文
IP頭部的Protocol值為1就說明這是一個ICMP報文
ICMP頭部中的類型(Type)域用於說明ICMP報文的作用及格式
此外還有代碼(Code)域用於詳細說明某種ICMP報文的類型
所有資料都在ICMP頭部後面。RFC定義了13種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的報文格式返回,發送方計算這個時間差。一些系統不響應這種報文。
--------------------------------種類-------------------------------------
ICMP報文格式
ICMP雖然是網路層的協議,但要將ICMP報文放入IP中發送。
ICMP報文的公用頭標由1位元組的類型(type)、1位元組的
代碼(code)和2位元組的校正和(checksum)組成。
類型域和代碼域用來標識各種ICMP報文。類型域表示ICMP報文的類型,目前已定義了14
種,從類型值來看ICMP報文可分為二大類。
第1 類是取值為1~127的差錯報文,
第2類是取值128以上的是資訊(informational)報文。
1不能到達信宿(Destination Unreachable)差錯報文
2分組過大(Packet Too Big)差錯報文
3逾時(Time Exceeded)差錯報文
4參數問題(Parameter Problem)差錯報文
128返回請求(Echo Request)報文
129返回應答(Echo Reply)報文
130群組成員查詢(Group Membership Query)
131群組成員報告(Group Membership Report)
132群組成員結束(Group Membership Termination)
133路由器請求(Router Solicitation)
134路由器公告(Router Advertisement)
135鄰機請求(Neighbor Solicitation)
136鄰機公告(Neighbor Advertisement)
137 重新導向(Redirect)