概述
“ping”这个名字源于声纳定位操作。 Ping程序由Mike Muuss编写,目的是为了测试另一台主机是否可达。该程序发送一份 ICMP回显请求报文给主机,并等待返回 ICMP回显应答
Ping程序
我们称发送回显请求的 ping程序为客户,而称被 ping的主机为服务器。大多数的 TCP / IP实现都在内核中直接支持 Ping服务器—这种服务器不是一个用户进程。
ICMP回显请求和回显应答报文如图:

对于其他类型的ICMP查询报文,服务器必须响应标识符和序列号字段。另外,客户发送的选项数据必须回显,假设客户对这些信息都会感兴趣。
Unix系统在实现ping程序时是把 ICMP报文中的标识符字段置成发送进程的 ID号。这样即使在同一台主机上同时运行了多个 ping程序实例,ping程序也可以识别出返回的信息。
ping程序通过在 ICMP报文数据中存放发送请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在 ICMP报文中的时间值,即是往返时间。
IP记录路由选项
ping程序为我们提供了查看 IP记录路由(RR)选项的机会。大多数不同版本的 ping程序都提供- R选项,以提供记录路由的功能。它使得 ping程序在发送出去的 IP数据报中设置IPRR选项(该 IP数据报包含ICMP回显请求报文)。这样,每个处理该数据报的路由器都把它的IP地址放入选项字段中。当数据报到达目的端时, IP地址清单应该复制到 ICMP回显应答中,这样返回途中所经过的路由器地址也被加入清单中。当 ping程序收到回显应答时,它就打印出这份IP地址清单。
IP数据报中的RR选项的一般格式如图:

code是一个字节,指明 IP选项的类型。对于 RR选项来说,它的值为 7。len是RR选项总字节长度,在这种情况下为 39(尽管可以为 RR选项设置比最大长度小的长度,但是 ping程序总是提供39字节的选项字段,最多可以记录 9个IP地址。由于 IP首部中留给选项的空间有限,它一般情况都设置成最大长度)。
ptr称作指针字段。它是一个基于 1的指针,指向存放下一个 IP地址的位置。它的最小值为4,指向存放第一个 IP地址的位置。随着每个 IP地址存入清单, ptr的值分别为 8,12,16,最大到36。当记录下9个IP地址后,ptr的值为40,表示清单已满
IP时间戳选项
IP时间戳选项与记录路由选项类似。 IP时间戳选项的格式如图:

时间戳选项的代码为 0x44。其他两个字段 len和ptr与记录路由选项相同:选项的总长度(一般为36或40)和指向下一个可用空间的指针( 5,9,13等)。
接下来的两个字段是 4bit的值:OF表示溢出字段,FL表示标志字段。时间戳选项的操作根据标志字段来进行,如图

如果路由器由于没有空间而不能增加时间戳选项,那么它将增加溢出字段的值。
时间戳的取值一般为自 UTC午夜开始计的毫秒数,与 ICMP时间戳请求和应答相类似。如果路由器不使用这种格式,它就可以插入任何它使用的时间表示格式,但是必须打开时间戳中的高位以表明为非标准值。