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