icmp:internet control message protocol.
前言:英特網的網路層有三個主要組成部分:ip協議,路由協議(RIP,OSPF,BGP)以及icmp。
icmp被用來在主機與路由之間交換訊息;最典型的是用來報錯。
icmp資料像tcp或udp資料包一樣在ip資料包裡面作為有效資料轉送。當主機接到一個封裝了icmp報文的ip資料包,通過解多工將icmp資料包從其中剝離出來,這個過程和udp、tcp一致。
icmp前序的資料格式:
- Type - ICMP的類型;
- Code - 進一步劃分ICMP的類型;例如,ICMP的目標不可達類型可以把這個位設為1至15等來表示不同的意思。
- Checksum - 這個欄位包含有從ICMP前序和資料部分計算得來的,用於檢查錯誤的資料,其中此校正碼欄位的值視為0。
- ID - 這個欄位包含了ID值,在ECHO REPLY類型的訊息中要返回這個欄位。
- Sequence - 這個欄位包含一個序號,同樣要在ECHO REPLY類型的訊息中要返回這個欄位.(from:http://zh.wikipedia.org/wiki/ICMP)
icmp協議最常用做兩種服務:ping和traceroute;
ping通常用來檢測主機是否可以和某個其他主機通過ip協議通訊。通過ping 主機地址,可以得到icmp回應報文;
ping還有許多參數可以設定,可以在命令列輸入“ping -h”查看;
traceroute:用來跟蹤從本地主機到目的主機所需要經過的路由。在windows命令列下輸入tracert 目的主機地址即可。蹤跡路由的工作原理是通過向指定的目的主機發送一系列的ttl遞增的ip資料包(封裝的是udp資料包),也就是說:第一個發送的資料包ttl為1,第二個ttl為2,第三個ttl為3...最後一個可以達到主機但ip資料的連接埠號碼不對。由於沒經過一個路由,ip資料包的ttl都會自動-1,到0時就會被丟掉同時會向本地主機發送一個icmp報文(type11
code0),而最後一個由於不能找到對應的連接埠號碼,目的主機會向本地主機返回一個icmp報文(type3code3)。可以發現沒有到達主機和到達主機但沒法找到相應連接埠號碼都會返回一個icmp報文,那本地主機怎樣確定是否已經跟蹤完成了呢(就是說已經查看到所有從本地主機到目的主機的路由)?細心的可以看到而這返回的icmp報文是有區別的,本地主機就是根據返回的報文差別來判斷的從而停止跟蹤。
倒數第二個為什麼會比較特別呢?我現在也沒弄清楚。。。以後找到了再補上,路過的大蝦能補上那就更好了就更好了。
icmp還有很多其他很多有趣的用途,比如hacker...一度流行的死亡之ping,icmp floot等等。