2013-08-27 15:44:52
第7章 Ping程序
7.1 引言
“ping”这个名字来源于声纳定为操作。Ping程序由Mike Muuss编写,目的是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。
一般来说,如果不能Ping到某台主机,那么就不能Telnet或者FTP到那台主机。反过来,如果不能Telnet到某太主机,那么通常可以用Ping程序来确定问题出在哪里。Ping程序还能测出到这台主机的往返时间,以表明该主机离我们有“多远”。
随着Internet安全意识的增强,出现了提供访问控制清单的路由器和防火墙,那么像上面没有限定的断言就不再成立了。一台主机的可达性可能不只取决于IP层是否可达,还取决于使用何种协议以及端口号。Ping程序的运行结果可能显示某台主机不可达,但我们可以用Telnet远程登录到该主机的25号端口(邮件服务器)。
7.2 Ping程序
我们称发送回显请求的ping程序为客户,而称被ping的主机为服务器。大多数TCP/IP实现都在内核中直接支持Ping服务器——这种服务器不是一个用户进程。
ICMP回显请求和回显应答报文格式如下:
标识符:为发送ping进程的ID号。
序号:从0开始,每发送一次新的回显请求就加1。ping程序打印处返回的每个分组的序号,允许我们查看是否有分组丢失、失序或重复。
7.2.1 LAN输出
上图为在局域网运行ping程序的输出结果。从上面的输出中可以看出,回显应答是以发送的次序返回的(0,1,2等)。
上图中的往返时间(time)都为0ms,这是由于作者主机程序使用的计时器分辨率较低的缘故。当应答返回时,用当前时间减去存放在ICMP报文中的时间值,即是往返时间(这和ICMP时间戳请求-应答的原理基本相同)。
上图是tcpdump的抓包结果。通常,第一个往返时间值要比其他的大,这是因为目的端的硬件地址不再ARP告诉缓存中的缘故。正如第四章所讲的,在发送第一个回显请求之前要发送一个ARP请求并接收ARP应答,这需要花费几毫秒的时间。
7.2.2 WAN输出
这里序号就不像局域网那样连续了,我们发现有52%的丢包率,虽然在广域网上丢包现象很普遍,但是52%的丢包率显然是不正常的。通过广域网我们可能看到重复的分组(序号相同),失序的分组(序列号不是降序排列)。
7.2.3 线路SLIP链接
SLIP是串行线路所以传输速度很慢,我们第2章有学过串行线路吞吐量的计算。图中的输出结果是已经将slip网络的传输速率降到了1200b/s,这样做是为了能够产生一些特殊的结果。而ping程序发送的ICMP报文有56个字节,加上20个字节的IP首部和8个字节的ICMP首部以及2个字节的起始位和结束位,共86字节。所以往返时间大约为1433(86 * 8.33 * 2)ms。
上面的输出可以证实我们的计算,由于程序每个1s发送一个ICMP回显请求,但是要等1.48s才能接受一个应答,因此在第一条应答返回之前已经发出去两条回显请求(0s和1s时)。这就是为什么最后会显示丢失一个分组,实际上并没有丢失,而是在计算丢失率的时候,它正在返回途中。
7.2.4 拨号SLIP链路
在拨号SLIP链路的两端增加了调制解调器,调制解调器会带来包括数据压缩、错误控制等功能。而带来的影响就有:调制解调器本身的时延,随着数据压缩导致分组长度减少,使用错误控制协议分组长度增加,接收端的调制解调只能验证循环检验字符后才能释放数据,处理每端计算机异步串行接口。这种种影响导致RTT(往返时间)从大变小,并最终保持稳定,且其具体值或范围难以提起推算。