PING命令在LAN上的输出


在局域网上运行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以下 。



输出的第一行包括目的主机的IP地址 , 尽管指定的是它的名字(svr4) 。这说明名字已经经过解析器被转换成IP地址了 。我们将在第14章介绍解析器和DNS 。现在 , 我们发现 , 假如敲入ping命令 , 几秒钟过后会在第1行打印出IP地址 , DNS就是利用这段时间来确定主机名所对应的IP地址 。

本例中的tcpdump输出如图7-2所示 。从发送回显请求到收到回显应答 , 时间间隔始终为3.7ms 。还可以看到 , 回显请求大约每隔1秒钟发送一次 。通常 , 第1个往返时间值要比其他的大 。这是由于目的端的硬件地址不在ARP高速缓存中
图7-2在LAN上运行ping程序的结果
的缘故 。正如我们在第4章中看到的那样 , 在发送第一个回显请求之前要发送一个ARP请求并接收ARP应答 , 这需要花费几毫秒的时间 。下面的例子说明了这一点:
第1个RTT中多出的3ms很可能就是因为发送ARP请求和接收ARP应答所花费的时间 。

这个例子运行在sun主机上 , 它提供的是具有微秒级分辨率的计时器 , 但是ping程序只能打印出毫秒级的往返时间 。在前面运行于BSD/3860.9.4版上的例子中 , 打印出来的往返时间值为0ms , 这是因为计时器只能提供10ms的误差 。下面的例子是BSD/3861.0版的输出 , 它提供的计时器也具有微秒级的分辨率 , 因此 , ping程序的输出结果也具有较高的分辨率 。

    推荐阅读