第7章Ping程序
7.1 引言
“p ing”这个名字源于声纳定位操作。P ing程序由Mike Muuss编写,目的是为了测试另一台主机是否可达。该程序发送一份I C M P回显请求报文给主机,并等待返回I C M P回显应答(图6 -3列出了所有的I CMP报文类型)。
一般来说,如果不能P ing到某台主机,那么就不能Te lnet或者F TP到那台主机。反过来,如果不能Te lnet到某台主机,那么通常可以用P ing程序来确定问题出在哪里。P ing程序还能测出到这台主机的往返时间,以表明该主机离我们有“多远”。
在本章中,我们将使用P ing程序作为诊断工具来深入剖析I CMP。P ing还给我们提供了检测I P记录路由和时间戳选项的机会。文献[Stevens 1990]的第11章提供了P ing程序的源代码。
几年前我们还可以作出这样没有限定的断言,如果不能P ing到某台主机,那么就不能Te lnet或F TP到那台主机。随着I nternet安全意识的增强,出现了提供访问控制清单的路由器和防火墙,那么像这样没有限定的断言就不再成立了。一台主机的可达性可能不只取决于I P层是否可达,还取决于使用何种协议以及端口号。P ing程序的运行结果可能显示某台主机不可达,但我们可以用Te lnet远程登录到该台主机的2 5号端口(邮件服务器)。
7.2 Ping程序
我们称发送回显请求的p ing程序为客户,而称被p ing的主机为服务器。大多数的T CP/IP实现都在内核中直接支持P ing服务器—这种服务器不是一个用户进程(在第6章中描述的两种I CMP查询服务,地址掩码和时间戳请求,也都是直接在内核中进行处理的)。
I CMP回显请求和回显应答报文如图7 -1所示。
检验和
8字节
标识符
序号
类型(0或8)代码(0)
选项数据
图7-1 ICMP回显请求和回显应答报文格式
对于其他类型的I CMP查询报文,服务器必须响应标识符和序列号字段。另外,客户发送的选项数据必须回显,假设客户对这些信息都会感兴趣。U nix系统在实现p ing程序时是把I CMP报文中的标识符字段置成发送进程的I D号。这样即使在同一台主机上同时运行了多个p ing程序实例,p ing程序也可以识别出返回的信息。
序列号从0开始,每发送一次新的回显请求就加1。p ing程序打印出返回的每个分组的序列号,允许我们查看是否有分组丢失、失序或重复。I P是一种最好的数据报传递服务,因此这三个条件都有可能发生。
旧版本的p ing程序曾经以这种模式运行,即每秒发送一个回显请求,并打印出返回的每个回显应答。但是,新版本的实现需要加上-s选项才能以这种模式运行。默认情况下,新版本的p ing程序只发送一个回显请求。如果收到回显应答,则输出“host is alive”;否则,在2 0秒内没有收到应答就输出“no answer(没有回答)”。7.2.1 LAN输出
在局域网上运行p ing程序的结果输出一般有如下格式:
键入中断键来停止显示
当返回I CMP回显应答时,要打印出序列号和T TL,并计算往返时间(T TL位于I P首部中的生存时间字段。当前的B SD系统中的p i n g程序每次收到回显应答时都打印出收到的T TL
—有些系统并不这样做。我们将在第8章中通过t raceroute程序来介绍T TL的用法)。
从上面的输出中可以看出,回显应答是以发送的次序返回的(0,1,2等)。
p ing程序通过在I CMP报文数据中存放发送请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在I CMP报文中的时间值,即是往返时间。注意,在发送端b sdi上,往返时间的计算结果都为0 ms。这是因为程序使用的计时器分辨率低的原因。B SD/386版本0 .9.4系统只能提供10 ms级的计时器(在附录B中有更详细的介绍)。在后面的章节中,当我们在具有较高分辨率计时器的系统上(S un)查看t cpdump输出时会发现,I CMP回显请求和回显应答的时间差在4 ms以下。
输出的第一行包括目的主机的I P地址,尽管指定的是它的名字(s vr4)。这说明名字已经经过解析器被转换成I P地址了。我们将在第1 4章介绍解析器和D NS。现在,我们发现,如果敲入p ing命令,几秒钟过后会在第1行打印出I P地址,D NS就是利用这段时间来确定主机名所对应的I P地址。
本例中的t cpdump输出如图7 -2所示。
从发送回显请求到收到回显应答,时间间隔始终为3.7 ms。还可以看到,回显请求大约每隔1秒钟发送一次。通常,第1个往返时间值要比其他的大。这是由于目的端的硬件地址不在A RP高速缓存中图7-2 在LAN上运行ping程序的结果
的缘故。正如我们在第4章中看到的那样,在发送第一个回显请求之前要发送一个A RP请求并接收A RP应答,这需要花费几毫秒的时间。下面的例子说明了这一点:
保证ARP高速缓存是空的
键入中断键来停止显示
第1个RT T中多出的3 ms很可能就是因为发送A RP请求和接收A RP应答所花费的时间。这个例子运行在s un主机上,它提供的是具有微秒级分辨率的计时器,但是p ing程序只能打印出毫秒级的往返时间。在前面运行于BSD/386 0.9.4版上的例子中,打印出来的往返时间值为0 ms,这是因为计时器只能提供1 0m s的误差。下面的例子是BSD/386 1.0版的输出,它提供的计时器也具有微秒级的分辨率,因此,p ing程序的输出结果也具有较高的分辨率。
键入中断键来停止显示
7.2.2 WAN输出在一个广域网上,结果会有很大的不同。下面的例子是在某个工作日的下午即I nternet具