Ping程序的目的是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答
一般而言,若不能ping到某台主机,那么就不能telnet或FTP到那台主机。反过来,如果不能Telnet到某台主机,那么通常可以用Ping来确认问题出在哪里
Ping还能测出往返时间。
但是,好多好多年前我们还可以确定,如果不能Ping到某台主机,那么就不能Telnet或FTP到那台主机。只是随着安全意识的增强,出现了提供访问控制清单的路由器和防火墙,那么我们就不能再这么确定或者说断言了。
一台主机的可达性可能不止取决于IP层是否可达,还取决于使用何种协议及端口号。
Ping程序可能不可达,但我们却可能通过某些端口与某台主机连接。
Ping程序
发送回显请求的ping程序为客户,被ping的为服务器。大多TCP/IP实现都在内核中直接支持Ping服务器(这种服务器不是用户进程,就像之前ICMP中的地址掩码查询、时间戳查询等,都是在内核中直接处理的)
回显请求报文和回显应答报文如下:
Unix系统实现的Ping程序是把ICMP中的标识字段设置成发送进程的ID号(pid),这样即使同一台主机上同时运行多个ping程序,ping程序也能识别出返回的信息
序号从0开始,每发送一次新的回显请求就加一
IP记录路由选项
Ping程序为我们提供了查看IP记录路由(RR)选项的机会(大多数ping提供 -R选项)
它使得ping程序在发送出去的IP数据报中设置IP RR 选项(该IP数据报包含ICMP回显请求报文)。这样,每个处理该数据报的路由器都把他的IP地址存放在选项字段中。
当数据报到达目的端时,IP地址清单应该复制到ICMP回显应答中,这样返回途中所经过的路由器地址也被加入到地址清单中。
当ping收到回显应答后,就打印出这份IP地址清单
说到这里,虽然整个过程看似简单明了,但是这其中存在许多未知数。
比如中间路由对RR选项的处理,比如一些系统不支持把ICMP请求报文中的地址清单复制到ICMP应答报文中。
最大的问题在于,IP首部中只有有限的空间存放IP地址。通过我们之前对IP数据报的了解,IP首部中的首部长度字段只有4bit,因此整个IP首部最长只能包含15个32bit长的字(也即60个字节),去除20个IP首部固定字节长度,以及3个字节的RR选项,最后只剩下37个字节存放地址清单,即只能放9个IP了。
RR选项为什么占3个字节呢?
可以看到,code是指明IP选项的类型(对于RR选项,值为7)
len是RR选项总字节长度,这里为39
ptr存放指针,指向存放下一个IP地址的位置
这里还有一个问题,当路由器在清单中记录IP地址时,是记录路由器的出口IP地址呢还是入口地址?
RFC791指定路由器记录出口IP地址
下面给出一个通常的例子:
我们在svr4主机上尝试ping主机slip。
显示数据如下:
显然,每个路由器都把出口地址加入到了IP首部的地址清单中。
我们还可以看到,当ICMP回显应答到达原系统时,他把自己的入口IP也加入到了清单中
虽然sun主机支持RR选项,但并没有将IP地址填入清单中
我们在sun主机上调用tcpdump –v发现:
optlen=40 表示在IP首部中40个字节的选项空间
RR{39} 表示记录路由已被设置,其长度字段是39
然后就是9个ip地址
EOL表示 “end of list“
如果IP选项字段中有多个选项,那么在开始下一个选项之前必须填入空白字符或另外一种值为1 的特殊字符 NOP(”no operation”)
以下再给出一个例子(异常):
我们在slip主机上ping 到aix主机,
显示数据如下:
其中令人疑惑的点在于为什么传出的数据报(ICMP回显请求)直接从netb传到aix,而返回的数据报(ICMP回显应答)却从aix开始经路由器gateway再到netb?
这里就来解答一下:
问题在于aix不知道要把目的地为子网140.252.13的IP数据报发到netb主机上。相反,aix在他的路由表中有一个默认项,它指明在没有明确某个目的主机的路由时,就把所有的数据报发往默认项指定的路由器gateway。因为路由器gateway比子网140.252.1上的所有主机都具备更强的路由选择能力。
不过,这里还有一个问题,为什么gateway不直接发送ICMP报文重定向到aix(以后会讲到),以更新aix的路由表?由于某种原因重定向并没有产生。
但是如果我们使用telnet登录到aix的daytime服务器上,ICMP就会产生重定向,因而它在aix上的路由表也会随之更新。如果此时再用ping,那么就会从netb到aix,并从aix返回到netb而不再经过gateway。
IP时间戳选项
在ICMP报文讨论中涉及过时间戳选项,这里谈一下IP数据报的时间戳选项。
它与记录路由选项类似
前三个字段类型与记录路由一样
接下来是两个字段是4bit值,OF表示溢出字段,FL表示标识字段。时间戳选项操作根据标识字段不同而不同:
如果路由器由于没有空间而不能增加时间戳选项,那么它将增加溢出字段的值。