IP基础--6.ICMP协定

/ns/cn/zs/data/20020806030330.htm


    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 协定对我们了解和测试网路情况非常有帮助。