xdays

Ping命令的工作过程及单向Ping通的原因

June 06, 2010

当网络出现问题时,我们最常用的测试工具就是“Ping”命令了。但有时候我们会碰到单方向 Ping 通的现象,例如通过 HUB 或一根交叉线连接的在同一个 局域网内的电脑 A、 B,在检查它们之间的网络连通性时,发现从主机 A Ping 主机 B 正常而从主机 B Ping 主机 A 时,出现“超时无应答”错误。为什么呢?
要知道这其中的奥秘,我们有必要来看看 Ping 命令的工作过程到底是怎么样的。

原理部分:

假定主机 A 的 IP 地址是 192.168.1.1,主机 B 的 IP 地址是 192.168.1.2,都在同一子网内,则当你在主机 A 上运行“Ping 192.168.1.2”后,都发生了些什么呢?

首先,Ping 命令会构建一个固定格式的 ICMP 请求数据包,然后由 ICMP 协议将这个数据包连同地址“192.168.1.2”一起交给 IP 层协议(和 ICMP 一样,实际上是一组后台运行的进程),IP 层协议将以地址“192.168.1.2”作为目的地址,本机 IP 地址作为源地址,加上一些其他的控制 信息,构建一个 IP 数据包,并在一个映射表中查找出 IP 地址 192.168.1.2 所对应的物理地址(也叫 MAC 地址,熟悉网卡配置的朋友不会陌生,这是 数据链路层协议构建数据链路层的传输单元——帧所必需的),一并交给数据链路层。后者构建一个数据帧,目的地址是 IP 层传过来的物理地址,源地址则是本机 的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。

主机 B 收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合,则接收;否则丢弃。接收后检查该数据帧,将 IP 数据包从帧中提取出来,交 给本机的 IP 层协议。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议,后者处理后,马上构建一个 ICMP 应答包,发送给主机 A,其过程和主机 A 发送 ICMP 请求包到主机 B 一模一样。

单向 Ping 通问题:

从 Ping 的工作过程,我们可以知道,主机 A 收到了主机 B 的一个应答包,说明两台主机之间的去、回通路均正常。也就是说,无论从主机 A 到主机 B,还是从主机 B 到主机 A,都是正常的。那么,是什么原因引起只能单方向 Ping 通的呢?

一、安装了个人防火墙

在共享上网的机器中,出于安全考虑,大部分作为服务器的主机都安装了个人防火墙软件,而其他作为客户机的机器则一般不安装。几乎所有的个人防火墙软件,默 认情况下是不允许其他机器 Ping 本机的。一般的做法是将来自外部的 ICMP 请求报文滤掉,但它却对本机出去的 ICMP 请求报文,以及来自外部的 ICMP 应答报文不加任何限制。这样,从本机 Ping 其他机器时,如果网络正常,就没有问题。但如果从其他机器 Ping 这台机器,即使网络一切正常,也会出现“超 时无应答”的错误。

大部分的单方向 Ping 通现象源于此。解决的办法也很简单,根据你自己所用的不同类型的防火墙,调整相应的设置即可。

二、错误设置 IP 地址

正常情况下,一台主机应该有一个网卡,一个 IP 地址,或多个网卡,多个 IP 地址(这些地址一定要处于不同的 IP 子网)。但对于在公共场所使用的电脑,特别 是网吧,人多手杂,其中不泛有“探索者”。曾有一次两台电脑也出现了这种单方向 Ping 通的情况,经过仔细检查,发现其中一台电脑的“拨号网络适配器 ”(相当于一块软网卡)的 TCP/IP 设置中,设置了一个与网卡 IP 地址处于同一子网的 IP 地址,这样,在 IP 层协议看来,这台主机就有两个不同的接口处 于同一网段内。当从这台主机 Ping 其他的机器时,会存在这样的问题:

(1)主机不知道将数据包发到哪个网络接口,因为有两个网络接口都连接在同一网段;

(2)主机不知道用哪个地址作为数据包的源地址。因此,从这台主机去 Ping 其他机器,IP 层协议会无法处理,超时后,Ping 就会给出一个“超时无应答”的错误信息提示。但从其他主机 Ping 这台主机时,请求包从特定的网卡来,ICMP 只须简单地将目的、源地址互换,并更改一些 标志即可,ICMP 应答包能顺利发出,其他主机也就能成功 Ping 通这台机器了。