TCP/IP详解,卷1:协议--第7章 Ping程序
引言
“p i n g”这个名字源于声纳定位操作。 P i n g程序由Mike Muuss编写,目的是为了测试另一
台主机是否可达。该程序发送一份 I C M P回显请求报文给主机,并等待返回 I C M P回显应答
(图6 - 3列出了所有的I C M P报文类型)。
一般来说,如果不能 P i n g到某台主机,那么就不能 Te l n e t或者F T P到那台主机。反过来,
如果不能Te l n e t到某台主机,那么通常可以用 P i n g程序来确定问题出在哪里。 P i n g程序还能测
出到这台主机的往返时间,以表明该主机离我们有“多远”。
在本章中,我们将使用 P i n g程序作为诊断工具来深入剖析 I C M P。P i n g还给我们提供了检
测I P记录路由和时间戳选项的机会
几年前我们还可以作出这样没有限定的断言,如果不能 P i n g到某台主机,那么就
不能Te l n e t或F T P到那台主机。随着I n t e r n e t安全意识的增强,出现了提供访问控制清单
的路由器和防火墙,那么像这样没有限定的断言就不再成立了。一台主机的可达性可
能不只取决于I P层是否可达,还取决于使用何种协议以及端口号。P i n g程序的运行结果
可能显示某台主机不可达,但我们可以用Te l n e t远程登录到该台主机的2 5号端口(邮件
服务器)
Ping程序
我们称发送回显请求的 p i n g程序为客户,而称被p i n g的主机为服务器。大多数的 T C P / I P
实现都在内核中直接支持 P i n g服务器 — 这种服务器不是一个用户进程(在第 6章中描述的两
种I C M P查询服务,地址掩码和时间戳请求,也都是直接在内核中进行处理的)。
I C M P回显请求和回显应答报文如图7 - 1所示。
对于其他类型的I C M P查询报文,服务器必须响应标识符和序列号字段。另外,客户发送
的选项数据必须回显,假设客户对这些信息都会感兴趣。
U n i x系统在实现p i n g程序时是把I C M P报文中的标识符字段置成发送进程的 I D号。这样
即使在同一台主机上同时运行了多个 p i n g程序实例,p i n g程序也可以识别出返回的信息。
序列号从0开始,每发送一次新的回显请求就加 1。p i n g程序打印出返回的每个分组的序
列号,允许我们查看是否有分组丢失、失序或重复。 I P是一种最好的数据报传递服务,因此
这三个条件都有可能发生。
旧版本的p i n g程序曾经以这种模式运行,即每秒发送一个回显请求,并打印出返回的每
个回显应答。但是,新版本的实现需要加上- s选项才能以这种模式运行。默认情况下,新版
本的p i n g程序只发送一个回显请求。如果收到回显应答,则输出“ host is alive”;否则,在
2 0秒内没有收到应答就输出“no answer(没有回答)”。
IP记录路由选项
p i n g程序为我们提供了查看 I P记录路由(R R)选项的机会。大多数不同版本的 p i n g程
序都提供- R选项,以提供记录路由的功能。它使得 p i n g程序在发送出去的I P数据报中设置I P
R R选项(该I P数据报包含I C M P回显请求报文)。这样,每个处理该数据报的路由器都把它的
I P地址放入选项字段中。当数据报到达目的端时, I P地址清单应该复制到 I C M P回显应答中,
这样返回途中所经过的路由器地址也被加入清单中。当 p i n g程序收到回显应答时,它就打印
出这份I P地址清单。
这个过程听起来简单,但存在一些缺陷。源端主机生成 R R选项,中间路由器对R R选项的
处理,以及把I C M P回显请求中的R R清单复制到I C M P回显应答中,所有这些都是选项功能。
幸运的是,现在的大多数系统都支持这些选项功能,只是有一些系统不把 I C M P请求中的I P清
单复制到I C M P应答中。
但是,最大的问题是 I P首部中只有有限的空间来存放 I P地址。我们从图3 - 1可以看到,I P
首部中的首部长度字段只有 4 bit,因此整个I P首部最长只能包括1 5个32 bit长的字(即6 0个字
节)。由于I P首部固定长度为 2 0字节,R R选项用去3个字节(下面我们再讨论),这样只剩下
3 7个字节( 6 0- 2 0- 3)来存放 I P地址清单,也就是说只能存放 9个I P地址。对于早期的
A R PA N E T来说,9个I P地址似乎是很多了,但是现在看来是非常有限的(在第 8章中,我们将
用Tr a c e r o u t e工具来确定数据报的路由)。除了这些缺点,记录路由选项工作得很好,为详细
查看如何处理I P选项提供了一个机会。
I P数据报中的R R选项的一般格式如图7 - 3所示。
c o d e是一个字节,指明I P选项的类型。对于R R选项来说,它的值为7。l e n是R R选项总字
节长度,在这种情况下为 3 9(尽管可以为R R选项设置比最大长度小的长度,但是 p i n g程序
总是提供3 9字节的选项字段,最多可以记录 9个I P地址。由于I P首部中留给选项的空间有限,
它一般情况都设置成最大长度)。
p t r称作指针字段。它是一个基于 1的指针,指向存放下一个 I P地址的位置。它的最小值为
4,指向存放第一个 I P地址的位置。随着每个 I P地址存入清单,p t r的值分别为8,1 2,1 6,最
大到3 6。当记录下9个I P地址后,p t r的值为4 0,表示清单已满。
当路由器(根据定义应该是多穴的)在清单中记录 I P地址时,它应该记录哪个地址呢?
是入口地址还是出口地址?为此, RFC 791 [Postel 1981a]指定路由器记录出口 I P地址。我们
在后面将看到,当原始主机(运行 p i n g程序的主机)收到带有 R R选项的I C M P回显应答时,
它也要把它的入口I P地址放入清单中
IP时间戳选项
I P时间戳选项与记录路由选项类似。 I P时间戳选项的格式如图7 - 7所示(请与图7 - 3进行比
较)。
时间戳选项的代码为 0 x 4 4。其他两个字段 l e n和p t r与记录路由选项相同:选项的总长度
(一般为3 6或4 0)和指向下一个可用空间的指针( 5,9,1 3等)。
接下来的两个字段是4 bit的值:O F表示溢出字段,F L表示标志字段。时间戳选项的操作
根据标志字段来进行,如图7 - 8所示
如果路由器由于没有空间而不能增加时间戳选项,那么它将增加溢出字段的值
时间戳的取值一般为自U T C午夜开始计的毫秒数,与 I C M P时间戳请求和应答相类似。如
果路由器不使用这种格式,它就可以插入任何它使用的时间表示格式,但是必须打开时间戳
中的高位以表明为非标准值
与我们遇到的记录路由选项所受到的限制相比,时间戳选项遇到情况要更坏一些。如果
我们要同时记录 I P地址和时间戳(标志位为 1),那么就可以同时存入其中的四对值。只记录
时间戳是没有用处的,因为我们没有标明时间戳与路由器之间的对应关系(除非有一个永远
不变的拓扑结构)。标志值取3会更好一些,因为我们可以插入时间戳的路由器。一个更为基
本的问题是,很可能无法控制任何给定路由器上时间戳的正确性。这使得试图用 I P选项来计
算路由器之间的跳站数是徒劳的。我们将看到(第 8章)t r a c e r o u t e程序可以提供一种更好
的方法来计算路由器之间的跳站数。
小结
p i n g程序是对两个T C P / I P系统连通性进行测试的基本工具。它只利用 I C M P回显请求和
回显应答报文,而不用经过传输层( T C P / U D P)。P i n g服务器一般在内核中实现I C M P的功能。
我们分析了在 L A N、WA N以及S L I P链路(拨号和线路)上运行 p i n g程序的输出结果,
并对串行线路上的S L I P链路吞吐量进行了计算。我们还讨论并使用了 p i n g程序的I P记录路由
选项。利用该I P选项,可以看到它是如何频繁使用默认路由的。在第 9章我们将再次回到这个
讨论主题。另外,还讨论了IP 时间戳选项,但它在实际使用时有所限制。