新手需要掌握的ICMP協(xié)議基礎(chǔ)知識
ICMP協(xié)議,是我們對網(wǎng)絡(luò)中的消息加以控制的一類協(xié)議,在很多方面,這個協(xié)議的應(yīng)用都有值得討論的地方。它可以算是一位檢查者,幫助我們檢查在消息中的一些傳遞問題。那么接下來我們就來規(guī)范一下這個協(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顯著不同:它一般不用于在兩點間傳輸數(shù)據(jù)。它通常不由網(wǎng)絡(luò)程序直接使用,除了ping和traceroute這兩個特別的例子。
IPv4的ICMP也叫ICMPv4。IPv6的也有一個相似的協(xié)議,叫ICMPv6。
ICMP消息是在IP層,通常是從一個普通的產(chǎn)生了ICMP響應(yīng)的IP數(shù)據(jù)報中生成的。IP把適當(dāng)?shù)腎CMP消息用一個新的檔頭(header)封裝起來(以把ICMP消息送回原來的發(fā)送者),然后把產(chǎn)生的數(shù)據(jù)報用常規(guī)的方式傳送回去。
例如,每臺轉(zhuǎn)發(fā)IP數(shù)據(jù)報的機器(例如途中的路由器)都要把IP報頭中的TTL(time to live)減1,如果TTL減為了0,一個ICMP超時消息就會被發(fā)送到數(shù)據(jù)報的源發(fā)送者。
每個ICMP消息都是直接封裝在一個IP數(shù)據(jù)報中的,因此,和UDP一樣,ICMP是不可靠的。
雖然ICMP協(xié)議是包含在IP數(shù)據(jù)報中的,但是對ICMP消息通常會特殊處理,會和一般IP數(shù)據(jù)報的處理不同,而不是作為IP的一個子協(xié)議來處理。在很多時候,需要去查看ICMP消息的內(nèi)容,然后發(fā)送適當(dāng)?shù)腻e誤消息到那個原來產(chǎn)生IP數(shù)據(jù)包的程序,即那個被提示一個ICMP消息的程序。
很多常用的工具是基于ICMP消息的。traceroute是通過發(fā)送包含有特殊的TTL的包,然后查找ICMP協(xié)議超時消息和目標不可達消息來實現(xiàn)的。和traceroute相關(guān)的ping則是用ICMP的"Echo request"和"Echo reply"消息來實現(xiàn)的。
ICMP部分的結(jié)構(gòu)
報頭
ICMP報頭從IP報頭的第160位開始(除非使用了IP報頭的可選部分)。
Type - ICMP的類型;
Code - 進一步劃分ICMP的類型;例如,ICMP的目標不可達類型可以把這個位設(shè)為1至15等來表示不同的意思。
Checksum - 這個字段包含有從ICMP報頭和數(shù)據(jù)部分計算得來的,用于檢查錯誤的數(shù)據(jù),其中數(shù)據(jù)部分的值視為0。
ID - 這個字段包含了ID值,在ECHO REPLY類型的消息中要返回這個字段。
Sequence - 這個字段包含一個序號,同樣要在ECHO REPLY類型的消息中要返回這個字段。
填充數(shù)據(jù)
填充的數(shù)據(jù)緊接在ICMP報頭的后面(以8位為一組):
Linux的 "ping"工具填充的ICMP除了8個8位元組的報頭以外,還另外填充數(shù)據(jù)使得總大小為64字節(jié)。
Windows 的"ping.exe" 填充的ICMP協(xié)議除了8個8位元組的報頭以外,還另外填充數(shù)據(jù)使得總大小為40字節(jié)