ICMP 查询报文
----ICMP 回送消息:用于进行通信的主机或路由之间,判断发送数据包是否成功到达对端的消息。可以向对端主机发送回送请求消息,也可以接收对端主机回来的回送应答消息。
----ICMP 地址掩码消息:主要用于主机或路由想要了解子网掩码的情况。可以向那些主机或路由器发送 ICMP 地址掩码请求消息,然后通过接收 ICMP 地址掩码应答消息获取子网掩码信息。
----ICMP 时间戳消息:可以向那些主机或路由器发送 ICMP 时间戳请求消息,然后通过接收 ICMP 时间戳应答消息获取时间信息。
Ping 程序
Ping 程序利用 ICMP 回显请求报文和回显应答报文(而不用经过传输层)来测试目标主机是否可达。它是一个检查系统连接性的基本诊断工具。
ICMP 回显请求和 ICMP 回显应答报文是配合工作的。当源主机向目标主机发送了 ICMP 回显请求数据包后,它期待着目标主机的回答。目标主机在收到一个 ICMP 回显请求数据包后,它会交换源、目的主机的地址,然后将收到的 ICMP 回显请求数据包中的数据部分原封不动地封装在自己的 ICMP 回显应答数据包中,然后发回给发送 ICMP 回显请求的一方。如果校验正确,发送者便认为目标主机的回显服务正常,也即物理连接畅通。
例如:在终端上 Ping 下谷歌的地址,神奇的发现谷歌地址既然不用翻墙都能上了,而且丢包率 0%。
$ ping www.google.com
PING www.google.com (173.194.127.148) 56(84) bytes of data.
64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=1 ttl=48 time=11.0 ms
64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=2 ttl=48 time=10.8 ms
64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=3 ttl=48 time=11.1 ms
64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=4 ttl=48 time=10.8 ms
64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=5 ttl=48 time=11.1 ms
64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=6 ttl=48 time=11.0 ms
64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=7 ttl=48 time=10.5 ms
64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=8 ttl=48 time=9.96 ms
64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=9 ttl=48 time=10.9 ms
^C
--- www.google.com ping statistics ---
9 packets transmitted, 9 received, 0% packet loss, time 8009ms
rtt min/avg/max/mdev = 9.963/10.830/11.123/0.368 ms
Traceroute 程序
Traceroute 程序主要用来侦测源主机到目的主机之间所经过的路由的情况。
Traceroute 使用 ICMP 报文和 IP 首部中的 TTL 字段,它充分利用了 ICMP 超时消息。其原理很简单,开始时发送一个 TTL 字段为 1 的 UDP 数据报,而后每次收到 ICMP 超时萧后,按顺序再发送一个 TTL 字段加 1 的 UDP 数据报,以确定路径中的每个路由器,而每个路由器在丢弃 UDP 数据报时都会返回一个 ICMP 超时报文,而最终到达目的主机后,由于 ICM P选择了一个不可能的值作为 UDP 端口(大于30000)。这样目的主机就会发送一个端口不可达的 ICMP 差错报文。
ICMP协议的运用
1 ICMP地址掩码请求与应答
I C M P地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。系统广播
它的I C M P请求报文(这一过程与无盘系统在引导过程中用R A R P获取I P地址是类似的)。无盘
系统获取子网掩码的另一个方法是B O O T P协议。如图
I C M P报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。
这样,发送端就可以把应答与请求进行匹配。
我们可以写一个简单的程序(取名为i c m p a d d r m a s k),它发送一份I C M P地址掩码请求报
文,然后打印出所有的应答。由于一般是把请求报文发往广播地址,因此这里我们也这样做。
目的地址(1 4 0 。 2 5 2 。 1 3 。 6 3)是子网1 4 0 。 2 5 2 。 1 3 。 32的广播地址。
sun% icmpaddrmask 140.252.13.63
receivedmask = ffffffe0, from 140.252.13.来3自3 本 机
receivedmask = ffffffe0, from 140.252.13.来3自5 b s d i
receivedmask = ffff0000, from 140.252.13.来3自4 s v r 4
在输出中我们首先注意到的是,从s v r 4返回的子网掩码是错的。显然,尽管s v r 4接口
已经设置了正确的子网掩码,但是S V R 4还是返回了一个普通的B类地址掩码,就好像子网并
不存在一样。
svr4% ifconfig emd0
emd0:flags=23《UP,BROADCAST,NOTRAILERS》
inet140.252.13.34 netmask ffffffe0 broadcast 140.252.13.63
S V R 4处理I C M P地址掩码请求过程存在差错。
我们用t c p d u m p命令来查看主机b s d i上的情况,输出如图6 - 5所示。我们用- e选项来查看
硬件地址。
发到广播地址的ICMP地址掩码请求
注意,尽管在线路上什么也看不见,但是发送主机s u n也能接收到I C M P应答(带有上面
“来自本机”的输出行)。这是广播的一般特性:发送主机也能通过某种内部环回机制收到一份广播报文拷贝。由于术语“广播”的定义是指局域网上的所有主机,因此它必须包括发送主机在内。
接下来,b s d i广播应答,而s v r 4却只把应答传给请求主机。通常,应答地址必须是单播地址,除非请求端的源I P地址是0 。 0 。 0 。 0。本例不属于这种情况,因此,把应答发送到广播地址是B S D / 3 8 6的一个内部差错。
R F C规定,除非系统是地址掩码的授权代理,否则它不能发送地址掩码应答(为
了成为授权代理,它必须进行特殊配置,以发送这些应答。参见附录E)。但是,正如
我们从本例中看到的那样,大多数主机在收到请求时都发送一个应答,甚至有一些主
机还发送差错的应答。
评论
查看更多