I CMP協定


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 設定的問題了﹐也可能是網路的連線問題。檢查的步驟也有很多種﹐下面是方法之一﹕

  1. ping對方的router﹐如果ping得上﹐那可能是對方機器和其相連網路的問題了﹔
  2. 如果ping不到對方的router﹐那麼可以ping自己的router。如果ping得上﹐那麼好可能是router和router之間的問題了﹔
  3. 如果自己的router也ping不到﹐那麼可能是自己的機器和router之間的問題﹐我們可以ping一下自己的IP地址。如果自己的IP可以ping得到﹐那麼﹐好可能是連線的問題﹐我們可以檢查一下網線﹐hub﹐等設備﹐看看有沒有損毀的狀況。
  4. 同時﹐我們也可以ping一下網路上面其它的機器﹐也可以用其它機器ping一下router﹐來判別一下問題來自自己機器﹐還是網路﹐還是router﹐等等。
  5. 如果自己的IP都ping不到﹐那麼可能是網路卡壞掉了或沒有正確設定﹐可以看看設備資源有沒有衝突﹐也可以看看設備有沒有被系統啟動。
  6. 如果看來都沒問題﹐那麼可以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 協定﹐對我們了解和測試網路情況非常有幫助。

 

 


www.study-area.org © 2001 Netman 網中人
Last Updated: December 30, 2000