Ping程序
"Ping"这个名字源于声呐定位操作,目的是为了测试一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。
一般来说,如果不能Ping到某台主机,那么就不能Telnet或者FTP到那台主句。反过来,如果不能Telnet到某台主机,那么通常可以用Ping程序来确定问题出在哪里。Ping程序还能测出到这台主机的往返时间,以表明该主机离我们有"多远"。
Ping程序
我们称发送回显请求的ping程序为客户,而称被ping的主机为服务器。大多数TCP/IP实现都在内核中直接支持Ping服务器----这种服务器不是一个用户进程。
ICMP回显请求和回显应答报文如下图。
对于其他类型的ICMP查询报文,服务器必须相应标识符和序列号字段。另外,客户发送的选项数据必须回显,假设客户对这些信息都会感兴趣。
Unix系统在实现ping程序时是把ICMP报文中的标识符字段置成发送进程的ID号。这样即使在同一台主机上同时运行了多个ping程序实例,ping程序也可以识别出返回的信息。
序列号从0开始,美发送一次新的回显请求就加1。ping程序打印出返回的每个分组的序列号,允许我们查看是否有分组丢失、失序或重复。IP是一种最好的数据报传递服务,因此这三个条件都有可能发生。
LAN输出
当返回ICMP回显应答时,要打印出序列号和TTL,并计算往返时间(TTL位于IP首部中的生存时间字段。)
ping程序通过ICMP报文数据中存放发送请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在ICMP报文中的时间值,即是往返时间。
输出的第一行包括目的主机的IP地址,尽管指定的是它的名字(svr4)。这说明名字已经经过解析器被转换成IP地址了。
通常,第一个往返时间值要比其他的大。这是由于目的端的硬件地址不在ARP告诉缓存中的缘故。在发送第一个回显请求之前要发送一个ARP请求并接收ARP应答,这需要花费几毫秒的时间。
WAN输出
在一个广域网上,结果会有不同。在广域网中可能看到重复的分组(即相同序列号的分组被打印两次或更多次),失序的分组(序列号位N+1的分组在序列号位N的分组之前被打印)。
线路SLIP链接
下面我们来估计SLIP链路上的往返时间。首先,默认情况下发送的ICMP报文有56个字节。再加上20个字节的IP首部和8个字节的ICMP首部,IP数据报的总长度为84字节。同时,需要增加两个额外的字节:在数据报的开始和结尾加上END字符。对于1200b/s这个速率来说,由于每个字节含有8bit数据、1bit起始位和1bit结束位,因此传输速率是每秒120个字节,或者说每个字节8.33ms。所以我们估算往返时间
86 x 8.33 x 2 = 1433ms
往返时间大约是1.5秒,但是程序仍然每间隔 1秒钟发送一次ICMP回显请求。这说明在第1个回显应答返回之前(1.480秒时刻)就已经发送了两次回显请求(分别在0秒和1秒时刻)。
拨号SLIP链路
对于拔号SLIP链路来说,情况有些变化,因为在链路的两端增加了调制解调器。用在sun和netb系统之间的调制解调器提供的是V.32调制方式(9600b/s)、V.42错误控制方式(也称作LAP-M)以及V.42bis数据压缩方式。这表明我们针对线路链路参数进行的简单计算不再准确了。
很多因素都有可能影响。调制解调器带来了时延。随着数据的压缩,分组长度可能会减小,但是由于使用了错误控制协议,分组长度又可能会增加。另外,接收端的调制解调器只能在验证了循环检验字符(检验和)后才能释放收到的数据。最后,我们还要处理每一端的计算机异步串行接口,许多操作系统只能在固定的时间间隔内,或者收到若干字符后才去读这些接口。
IP记录路由选项
ping程序为我们提供了查看IP路由选项的机会。它使得ping程序在发送出去的数据报设置IP的RR选项。这样,每个处理该数据报的路由器就把它的IP地址放在选项字段中。当数据报到达目的端时,IP地址清淡应该复制到ICMP回显应大众,这样返回途中所经过的路由器地址也被加入清淡中。当ping程序收到回显应答时,它就打印这份IP地址清单。
这个过程中,有一些缺陷。源端地址生成RR选项,中间路由器对RR选项的处理,以及把ICMP回显请求中的RR清单复制到ICMP回显应答中,所有这些都是选项功能,可能有一些系统不把ICMP请求中的IP清单复制到ICMP应答中。
还有一个最大的问题,IP首部中只有有限的空间存放IP地址。首先IP首部最多包含15个32bit的字(即60个字节)。由于IP首部固定长度为20字节,RR选项用去3个字节,还有37个字节存放IP地址清单,也就是说只能存放9个IP地址。
code是一个字节,指明IP选项的类型。对于RR选项来说,它的值为7。len是RR选项总字节长度,这种情况下为39。
ptr称作指针字段。它是一个基于1的指针,指向存放下一个IP地址的位置。它的最小值是4,指向存放第一个IP地址的位置。随着每个IP地址存入清单,ptr的值分别为8,12,16,最大到36.当记录下9个IP地址后,ptr的值为40,表示清单已满。
当路由器(根据定义应该是多穴的)在清单中记录IP地址时,它应记录哪个地址呢?是入口地址还是出口地址?为此,RFC 791 [Postel 1981a]指定路由器记录出口IP地址。我们在后面将看到,当原始主机(运行ping程序的主机)收到带有RR选项的ICMP回显应答时,它也要把它的入口IP地址放入清单中
通常的例子
我们举一个R选项进行运行的ping程序,在主机svr4上运行ping程序到主机slip一个中间路由器将处理这个数据报。下面是svr4输出的结果:
分组所经过的四站如下图所示,每一站将自己的IP地址加入返回IP数据报的清单中。
路由器bsdi在不同方向上分别加入了不同的IP地址。它始终是把出口的IP地址加入清单。我们还可以看到,当ICMP回显应答到达原始系统(svr4)时,它把自己的入口IP地址也加入清单中。
IP的时间戳选项
IP的时间戳选项和记录路由选型类似。IP时间戳选项的格式如图:
时间戳选项的代码为0x44。其他两个字段len和ptr与记录路由选项相同:选项的总长度(一般为36或40)和执行下一个可用空间的指针。
接下来的两个字段是4bit的值:OF表示溢出字段,FL表示标志字段。
如果路由器没有空间而不能增加时间戳选项,它将增加溢出字段的值。
小结
ping程序是对两个TCP/IP系统连通性进行测试的基本工具。它只利用 ICMP回显请求和回显应答报文,而不用经过传输层(TCP/UDP)。Ping服务器一般在内核中实现ICMP的功能。