使用Ping命令,有时会出现一个奇怪的现象。Ping是Windows自带的运行于命令行程序,它是TCP/IP环境下用于检测网络连接性、可到达性和名称解析的疑难问题的主要命令。Ping最主要的用处就是检测目标主机是不是可连通,其实质就是发送一个ICMP回显请求报文给目的主机,并等待回显的ICMP应答,然后打印出回显的报文。关于Ping命令的应用不用本文详细讨论,在此指出一个不为人注意的细节,提醒大家要特别注意。
在Windows2000/XP命令提示符状态输入ping 127.0.0.1回车,会出现回显信息表示ping通了。有趣的是如果你输入ping 127.0..1回车(注意不是127.0.0.1,中间少输入一个0),同样可以Ping通!Windows会自动在IP地址中填充上一个“0”,组成127.0.0.1,如图所示(图1)。
在Windows98/Me下执行这个命令也是同样结果!换个方式,在命令行下输入命令:ping 127..0.1,同样可以Ping通,系统还是会自动补充上一个“0”,变为完整的形式。之所以会这样,是因为在使用Ping命令Ping某个IP地址时,可以省略IP地址中的空值即为“0”的部分,而使用“..”这种格式可以在其中自动加入空值,于是我们就可以省略其中的“0”了。
如果我们在命令行下分别输入Ping 202.108.36.172(这是网易的IP地址)和Ping 202.108.036.172,其回显的结果会不会是一样的呢?开始我以为是一样的,然而命令执行后的结果大大出乎我的意料——与我想像的完全不一样。在输入Ping 202.108.36.172回车后显示的结果一切正常,和我们预想的完全一样。而Ping 202.108.036.172时在命令提示符窗口中显示的竟然是在Ping另外一个IP地址:202.108.30.172(图2)!
更有趣地是,如果你输入Ping 202.108.044.172回车,此时在命令提示符窗口中显示的是我们在Ping地址202.108.36.172(图3)!
这是不是也很出乎预料?除了Windows系统以外,在FreeBSD上测试的结果也是一样的。
为什么会这样呢?这是因为系统将上述IP地址中的“036”当成八进制而非十进制数字了,八进制数值“036”转换为十进制正好是“30”(你可以用Windows自带的计算器来验算),所以系统才会以为我们要Ping的是202.108.30.172。在IP地址的十进制数字前面加上0就表示这是八进制数,如果加上0x则表示这是十六进制数值。我们可以验证一下,在命令提示符下输入Ping 0x7f.0.0.1,回车之后你会发现我们Ping的是127.0.0.1。因为0x7f正是十进制数值127的十六进制表示方式。再试试输入Ping 0x7f.0..1,猜猜看会怎么样?没错,这样输入Ping的还是127.0.0.1这个IP地址。
注意,在使用Ping命令Ping某IP地址时,在IP地址的四部分中只能有一部分可以采用八进制或十六进制才输入,其余部分必须还得是十进制数值,否则会出错。比方说,你要是将IP地址202.108.36.172转为八进制0312.0154.044.0254,然后去Ping,系统会报告错误(图4),同样的,如果将点分十进制IP地址的各个部分全部转为十六进制,然后去Ping系统也会报告出错,无法Ping通。所以还是老老实实采用十进制的IP地址去Ping的好。
以后大家在使用Ping命令时就要特别注意了,多一个“0”和少一个“0”有时是不一样的。