ping程序是用来测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给目的主机,并等待目的主机发送ICMP回显应答给本机。
一般来说,若不能ping到某台主机,那么这台主机不可达,便无法telnet,或者ftp到该主机。如果telnet或ftp不到目的主机,那么往往可以使用ping程序来测试该目的主机的可达性。ping程序还能测出到这台主机的往返时间。
不过随着防火墙的普及,当ping不到一台主机时,却有可能telnet上该主机。这是因为一台主机的可达性可能不只取决于I P层是否可达,还取决于使用何种协议以及端口号。
6.2.ping程序我们称发送回显请求的ping程序为客户,而被ping的主机为服务器。一般ping程序是在内核中实现,而不是一个应用程序。包括ICMP章节提到的地址掩码请求与时间戳请求两种ICMP查询报文,都是在内核实现。
ICMP回显请求与回显应答报文如图6-1.
6-1
对于其他类型的ICMP查询报文,服务器必须响应标识符和序列号字段。另外,客户发送的选项数据必须回显,假设客户对这些信息都会感兴趣。
Unix系统在实现ping程序时是把ICMP报文中的标识符字段置成发送进程的ID号。这样即使在同一台主机上同时运行了多个ping程序实例,ping程序也可以识别出返回的信息。序列号从0开始,每发送一次新的回显请求就加1。ping程序打印出返回的每个分组的序列号,允许我们查看是否有分组丢失、失序或重复。IP是一种最好的数据报传递服务,因此这三个条件都有可能发生。
6.3.LAN输出在局域网上运行ping程序的输出一般格式如图6-2:
6-2
当返回ICMP回显应答时,要打印出序列号和TTL,并计算往返时间(TTL在IP首部)。可以观察,回显应答是按照发送的顺序返回的1,2,3,4,5,6,7,8.
ping程序通过在ICMP报文数据中存放发送请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在ICMP报文中的时间值,即是往返时间。
6.4.WAN输出在广域网上运行ping程序输出格式与局域网上有很大不同,图6-3是在广域网上运行ping程序的结果
6-3
显然,序列号为1、2、3、4、6、1 0、11、1 2和1 3的回显请求或回显应答在某个地方丢失了。并且往返时间变大,这是因为目的主机离我们更“远”了。通过广域网还有可能看到重复的分组(即相同序列号的分组被打印两次或更多次),失序的分组(序列号为N 1的分组在序列号为N的分组之前被打印)。
6.5.IP记录路由选项ping程序为我们提供了查看I P记录路由(RR)选项的机会。大多数不同版本的ping程序都提供-R选项,以提供记录路由的功能。它使得p i n g程序在发送出去的I P数据报中设置I PR R选项(该I P数据报包含I C M P回显请求报文)。这样,每个处理该数据报的路由器都把它的I P地址放入选项字段中。当数据报到达目的端时,I P地址清单应该复制到I C M P回显应答中,这样返回途中所经过的路由器地址也被加入清单中。当p i n g程序收到回显应答时,它就打印出这份IP地址清单。
IP数据报中的RR选项如图6-4所示。
6-4
code是一个字节,指明I P选项的类型。对于R R选项来说,它的值为7。l e n是R R选项总字节长度,在这种情况下为39(尽管可以为RR选项设置比最大长度小的长度,但是ping程序总是提供39字节的选项字段,最多可以记录9个IP地址。由于IP首部中留给选项的空间有限,它一般情况都设置成最大长度)。
IP记录路由选项存在一些缺陷,现在一般情况下已经不再使用,有一个更好的traceroute程序实现了这个功能。
6.6.IP时间戳选项IP时间戳选项与记录路由选项类似。IP时间戳选项的格式如图6-5所示。
6-5
时间戳选项的代码为0x44。其他两个字段len和ptr与记录路由选项相同:选项的总长度(一般为36或40)和指向下一个可用空间的指针(5,9,13等)。接下来的两个字段是4 bit的值:OF表示溢出字段,FL表示标志字段。时间戳选项的操作根据标志字段来进行,如图6-6所示。
6-6
时间戳的取值一般为自UTC午夜开始计的毫秒数,与I C M P时间戳请求和应答相类似。如果路由器不使用这种格式,它就可以插入任何它使用的时间表示格式,但是必须打开时间戳中的高位以表明为非标准值。
与我们遇到的记录路由选项所受到的限制相比,时间戳选项遇到情况要更坏一些。如果我们要同时记录IP地址和时间戳(标志位为1),那么就可以同时存入其中的四对值。只记录时间戳是没有用处的,因为我们没有标明时间戳与路由器之间的对应关系(除非有一个永远不变的拓扑结构)。标志值取3会更好一些,因为我们可以插入时间戳的路由器。一个更为基本的问题是,很可能无法控制任何给定路由器上时间戳的正确性。这使得试图用IP选项来计算路由器之间的跳站数是徒劳的。
同样traceroute程序提供了一种更好方式来记录时间戳。
6.7.小结ping程序是对两个TCP/IP系统连通性进行测试的基本工具。它只利用ICMP回显请求和回显应答报文,而不用经过传输层(TCP/UDP)。Ping服务器一般在内核中实现ICMP的功能。我们分析了在LAN、WAN上运行ping程序的输出结果。我们还讨论并使用了ping程序的IP记录路由选项。利用该IP选项,可以看到它是如何频繁使用默认路由的。
,