在局域网上运行ping程序的结果输出一般有如下格式:
当返回ICMP回显应答时,要打印出序列号和TTL,并计算往返时间(TTL位于ip首部中的生存时间字段。当前的BSD系统中的ping程序每次收到回显应答时都打印出收到的TTL—有些系统并不这样做。我们将在第8章中通过traceroute程序来介绍TTL的用法)。从上面的输出中可以看出,回显应答是以发送的次序返回的(0,1,2等)。ping程序通过在ICMP报文数据中存放发送请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在ICMP报文中的时间值,即是往返时间。注重,在发送端bsdi上,往返时间的计算结果都为0ms。这是因为程序使用的计时器分辨率低的原因。BSD/386版本0.9.4系统只能提供10ms级的计时器)。查看tcpdump输出时会发现,ICMP回显请求和回显应答的时间差在4ms以下。<br>
<br>
输出的第一行包括目的主机的IP地址,尽管指定的是它的名字(svr4)。这说明名字已经经过解析器被转换成IP地址了。我们将在第14章介绍解析器和DNS。现在,我们发现,假如敲入ping命令,几秒钟过后会在第1行打印出IP地址,DNS就是利用这段时间来确定主机名所对应的IP地址。<br>
本例中的tcpdump输出如图7-2所示。从发送回显请求到收到回显应答,时间间隔始终为3.7ms。还可以看到,回显请求大约每隔1秒钟发送一次。通常,第1个往返时间值要比其他的大。这是由于目的端的硬件地址不在ARP高速缓存中
图7-2在LAN上运行ping程序的结果
的缘故。正如我们在第4章中看到的那样,在发送第一个回显请求之前要发送一个ARP请求并接收ARP应答,这需要花费几毫秒的时间。下面的例子说明了这一点:
第1个RTT中多出的3ms很可能就是因为发送ARP请求和接收ARP应答所花费的时间。<br>
这个例子运行在sun主机上,它提供的是具有微秒级分辨率的计时器,但是ping程序只能打印出毫秒级的往返时间。在前面运行于BSD/3860.9.4版上的例子中,打印出来的往返时间值为0ms,这是因为计时器只能提供10ms的误差。下面的例子是BSD/3861.0版的输出,它提供的计时器也具有微秒级的分辨率,因此,ping程序的输出结果也具有较高的分辨率。