ICMP協(xié)議的定義
在網(wǎng)絡(luò)層,ICMP協(xié)議有著很重要的作用。它可以算是一位檢查者,幫助我們檢查在消息中的一些傳遞問題。那么接下來我們就來規(guī)范一下這個(gè)協(xié)議的定義。互聯(lián)網(wǎng)控制消息協(xié)議(Internet Control Message Protocol 或簡寫 ICMP)的目的是用于在 TCP/IP 網(wǎng)絡(luò)中發(fā)送控制消息,提供可能發(fā)生在通信環(huán)境中的各種問題反饋,通過這些信息,令管理者可以對所發(fā)生的問題作出診斷,然后采取適當(dāng)?shù)拇胧┤ソ鉀Q它。
ICMP依靠IP來完成它的任務(wù),它是IP的主要部分。它與傳輸協(xié)議,如TCP和UDP顯著不同:它一般不用于在兩點(diǎn)間傳輸數(shù)據(jù)。它通常不由網(wǎng)絡(luò)程序直接使用,除了ping和traceroute這兩個(gè)特別的例子。
IPv4的ICMP也叫ICMPv4。IPv6的也有一個(gè)相似的協(xié)議,叫ICMPv6。
ICMP消息是在IP層,通常是從一個(gè)普通的產(chǎn)生了ICMP響應(yīng)的IP數(shù)據(jù)報(bào)中生成的。IP把適當(dāng)?shù)腎CMP消息用一個(gè)新的檔頭(header)封裝起來(以把ICMP消息送回原來的發(fā)送者),然后把產(chǎn)生的數(shù)據(jù)報(bào)用常規(guī)的方式傳送回去。
例如,每臺轉(zhuǎn)發(fā)IP數(shù)據(jù)報(bào)的機(jī)器(例如途中的路由器)都要把IP報(bào)頭中的TTL(time to live)減1,如果TTL減為了0,一個(gè)ICMP超時(shí)消息就會被發(fā)送到數(shù)據(jù)報(bào)的源發(fā)送者。
每個(gè)ICMP消息都是直接封裝在一個(gè)IP數(shù)據(jù)報(bào)中的,因此,和UDP一樣,ICMP是不可靠的。
雖然ICMP協(xié)議是包含在IP數(shù)據(jù)報(bào)中的,但是對ICMP消息通常會特殊處理,會和一般IP數(shù)據(jù)報(bào)的處理不同,而不是作為IP的一個(gè)子協(xié)議來處理。在很多時(shí)候,需要去查看ICMP消息的內(nèi)容,然后發(fā)送適當(dāng)?shù)腻e誤消息到那個(gè)原來產(chǎn)生IP數(shù)據(jù)包的程序,即那個(gè)被提示一個(gè)ICMP消息的程序。
很多常用的工具是基于ICMP消息的。traceroute是通過發(fā)送包含有特殊的TTL的包,然后查找ICMP協(xié)議超時(shí)消息和目標(biāo)不可達(dá)消息來實(shí)現(xiàn)的。和traceroute相關(guān)的ping則是用ICMP的"Echo request"和"Echo reply"消息來實(shí)現(xiàn)的。
ICMP部分的結(jié)構(gòu)
報(bào)頭
ICMP報(bào)頭從IP報(bào)頭的第160位開始(除非使用了IP報(bào)頭的可選部分)。
Type - ICMP的類型;
Code - 進(jìn)一步劃分ICMP的類型;例如,ICMP的目標(biāo)不可達(dá)類型可以把這個(gè)位設(shè)為1至15等來表示不同的意思。
Checksum - 這個(gè)字段包含有從ICMP報(bào)頭和數(shù)據(jù)部分計(jì)算得來的,用于檢查錯誤的數(shù)據(jù),其中數(shù)據(jù)部分的值視為0。
ID - 這個(gè)字段包含了ID值,在ECHO REPLY類型的消息中要返回這個(gè)字段。
Sequence - 這個(gè)字段包含一個(gè)序號,同樣要在ECHO REPLY類型的消息中要返回這個(gè)字段。
填充數(shù)據(jù)
填充的數(shù)據(jù)緊接在ICMP報(bào)頭的后面(以8位為一組):
Linux的 "ping"工具填充的ICMP除了8個(gè)8位元組的報(bào)頭以外,還另外填充數(shù)據(jù)使得總大小為64字節(jié)。
Windows 的"ping.exe" 填充的ICMP協(xié)議除了8個(gè)8位元組的報(bào)頭以外,還另外填充數(shù)據(jù)使得總大小為40字節(jié)