ICMP
Internet Control Message Protocol 這個協定咋聽起來似乎神秘得很﹐但說穿了您可能會笑耶﹕ping 就是一個 ICMP 協定啦~~﹗另外﹐tracert 和 traceroute 也屬於 ICMP的協定。
由於 TCP/IP 是一個開放式的網路環境﹐其動態性極高﹐在任何時候您都不能確定對方是否連上網路﹐或是離開網路了。所以﹐在傳遞資料封包之前﹐要確定對方是存在的﹐以及路由路徑是可靠的﹐就變得非常重要了。ICMP 的目的﹐就是讓我們能夠檢測網路的連線狀況﹐也能確保連線的準確性﹐其功能主要有﹕
- 偵測遠端主機是否存在。
- 建立及維護路由資料。
- 重導資料傳送路徑。
- 資料流量控制。
ICMP在溝通之中使用不同的訊息讓機器來識別﹐請參閱下表﹕
訊息 |
代表意思 |
Echo Request |
請求回應訊息。 |
Echo Reply |
是一個回應信息。 |
Distination Unreachable |
表示目的地不可到達。 |
Source Quench |
當使用ICMP出現問題時﹐用來竭止來源繼續發送訊息。 |
Redirect |
用來重新導向路由路徑。 |
Time Sexeeded for a Datagram |
當資料封包在某些路由現象中逾時﹐可以要求來源忽略該封包。 |
Parameter Problem on a Datagram |
當一個ICMP封包重複著之前的錯誤時﹐會回覆來源主機關於參數錯誤的訊息。 |
Timestamp Request |
要求對方送出時間訊息﹐用以計算路由時間的差異﹐以滿足同步性協定的要求。 |
Timestamp Replay |
此訊息純粹是回應Timestamp Request用的。 |
Information Request |
在RARP協定應用之前﹐此訊息是用來在開機時取得網路信息。 |
Information Reply |
用以回應Infromation Request訊息。 |
Address Mask Request |
這訊息是用來查詢子網路mask設定信息。 |
Address Mask Reply |
回應子網路mask查詢訊息的。 |
在ICMP使用中﹐會以不同的error code來回應各種錯誤信息﹕
訊息 |
代表意思 |
0 |
Network Unreachable |
1 |
Host Unreachable |
2 |
Protocol Unreachable |
3 |
Port Unreachable |
4 |
Fragmentation Needed and DF set |
5 |
Source Route Failed |
6 |
Destination network unknown |
7 |
Destination host unknown |
8 |
Source host isolated |
9 |
Communication with destination network administraively prohibited |
10 |
Communication with destination host administraively prohibited |
11 |
Network unreachable for type of service |
12 |
host unreachable for type of service |
ICMP 是個非常有用的協定﹐尤其是當我們要對網路連接狀況進行判斷的時候。
PING
當我們架設好一個 IP 網路的時候﹐如果要檢查一下網路是否連接成功﹐最常用的一個命令就是 ping 了。ping 就是 ping﹐我也不知道其中文名字叫什麼﹐和為什麼叫 ping﹖﹖反正﹐我們知道怎麼用就行啦。
ping 可以說是一個最常用的網路檢查命令。例如在 Winodws 98 上執行 ping 之後﹐您會看到﹕
Microsoft(R) Windows 98
(C)Copyright Microsoft Corp 1981-1999.
D:\WINDOWS\Desktop>ping www.hinet.net
Pinging w3c1.hinet.net [168.95.1.83] with 32 bytes of data:
Reply from 168.95.1.83: bytes=32 time=183ms TTL=248
Reply from 168.95.1.83: bytes=32 time=147ms TTL=248
Reply from 168.95.1.83: bytes=32 time=145ms TTL=248
Reply from 168.95.1.83: bytes=32 time=139ms TTL=248
信息意思分別為﹕從哪裡得到的回應﹔該次 PING 執行的數據大小﹐round trip 時間(微秒)﹐生存期限(微秒)。
Ping statistics for 168.95.1.83:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
這是告訴您﹕送出多少個封包﹐獲得的回應是多少﹐丟失率是多少。
Approximate round trip times in milli-seconds:
Minimum = 139ms, Maximum = 183ms, Average = 153ms
這是說﹕來回所需時間的最小值﹐最大值﹐平均值。
通常 PING 命令是送出一個 echo_request (type 8) 的 ICMP 封包給目的端﹐如果目
的端願意回答﹐則會回應一個 echo_reply(type 0) 的 ICMP 封包給查詢端﹐以確定連
線的可行性。不過﹐如果 ICMP 封包因為某些原因(如火牆的過濾)不能到達目的端﹐或
是目的端不願回答﹐或是回應給擋下來了﹐PING 就不能順利完成﹐但並非代表連線不
行。
如果運用得當﹐可以幫我們判斷出許多狀況。例如﹐我們要看一下跟遠方的機器是否連接得上﹐先可以 ping 一下對方的機器名稱﹔如果連接不上的話﹐我們可以 ping 對方的 ip﹐如果 ip 可以 ping 得到﹐那麼﹐好可能是 dns 不工作了﹔那麼我們可以檢查本身主機的 dns 伺服器是否指定正確﹐以及dns 伺服器是否設定正確。
如果連 IP 都 ping 不了﹐那麼﹐好可能是 IP 設定的問題了﹐也可能是網路的連線問題。檢查的步驟也有很多種﹐下面是方法之一﹕
- ping對方的router﹐如果ping得上﹐那可能是對方機器和其相連網路的問題了﹔
- 如果ping不到對方的router﹐那麼可以ping自己的router。如果ping得上﹐那麼好可能是router和router之間的問題了﹔
- 如果自己的router也ping不到﹐那麼可能是自己的機器和router之間的問題﹐我們可以ping一下自己的IP地址。如果自己的IP可以ping得到﹐那麼﹐好可能是連線的問題﹐我們可以檢查一下網線﹐hub﹐等設備﹐看看有沒有損毀的狀況。
- 同時﹐我們也可以ping一下網路上面其它的機器﹐也可以用其它機器ping一下router﹐來判別一下問題來自自己機器﹐還是網路﹐還是router﹐等等。
- 如果自己的IP都ping不到﹐那麼可能是網路卡壞掉了或沒有正確設定﹐可以看看設備資源有沒有衝突﹐也可以看看設備有沒有被系統啟動。
- 如果看來都沒問題﹐那麼可以ping一下迴圈地址127.0.0.1﹐如果連這個都ping不了的話﹐這台機器的IP功能根本就沒被啟動﹗那麼﹐您就要先檢查一下網路功能有沒有選擇﹐IP協定有沒有被綁定(bind)﹐等基本網路設定了。
從上面的過程中﹐我們不難看出ping這個命令真是非常有用的。當然﹐上面只是其中一種偵測順序﹐我們也可以掉過來先ping自己的IP﹐然後自己router﹐對方router﹐對方IP、這樣的次序。
TRACEROUTE
另一個 ICMP 程式 traceroute 也是我們通常用到的工具。在 Winodws 98 上面﹐該程式叫做 tracert ﹐執行 tracert 的結果如下﹕
D:\WINDOWS\Desktop>tracert www.hinet.net
Tracing route to w3c1.hinet.net [168.95.1.83]
over a maximum of 30 hops:
1 154 ms 143 ms 136 ms as169035.seed.net.tw [139.175.169.35]
2 137 ms 134 ms 147 ms 139.175.169.1
3 131 ms 136 ms 129 ms R58-33.seed.net.tw [139.175.58.33]
4 137 ms 139 ms 129 ms R58-41.seed.net.tw [139.175.58.41]
5 146 ms 135 ms 137 ms R58-14.seed.net.tw [139.175.58.14]
6 144 ms 145 ms 139 ms 210.65.161.186
7 149 ms 146 ms 138 ms 168.95.2.22
8 145 ms 148 ms 138 ms 168.95.2.49
9 150 ms 146 ms 148 ms w3c1.hinet.net [168.95.1.83]
Trace complete.
最左邊一行分別是跳站(hop)數字﹐然後是三個 round trip time﹐最後是主機的名稱
(如果有的話)和 IP 地址。
通常 traceroute 命令會從 1 開始遞增 TTL 將 ICMP 命令送給每下一跳站﹐當
router 檢測到 TTL 的逾期﹐則會向發送源寄出 TIME_EXCEEDED 的 ICMP 封包﹐而每
一次回應都會送出 3 個 UDP 數據流(datagrams)﹐以讓您獲得更詳細的概念。
透過如此遞進的查詢過程﹐查詢端就可以追蹤到連線所經過的跳站情況﹐這在我們判斷封包的路由路線非常有用。不過﹐要還必須指出的是﹐封包的路由在每次的傳遞過程中都可能不一樣﹔在某些多路由環境中﹐查詢路由和回應路由未必一致。而且﹐在防火牆的保護下﹐有些 ICMP 封包會被攔下來﹐這樣的話﹐traceroute 也就不能完整的顯示出封包的傳遞路徑了。
其實 ICMP 協定還有許多實在上面的例子﹐這裡不一一介紹了。能靈活運用 ICMP 協定﹐對我們了解和測試網路情況非常有幫助。