在主机svr4上运行ping程序到主机slip。一个中间路由器(bsdi)将处理这个数据报。下面是svr4的输出结果:分组所经过的四站如图7-4所示(每个方向各有两站),每一站都把自己的IP地址加入RR清单。
图7-4带有记录路由选项的ping程序
路由器bsdi在不同方向上分别加入了不同的IP地址。它始终是把出口的IP地址加入清单。我们还可以看到,当ICMP回显应答到达原始系统(svr4)时,它把自己的入口IP地址也加入清单中。
还可以通过运行带有-v选项的tcpdump命令来查看主机sun上进行的分组交换(参见IP选项)。输出如图7-5所示。
图7-5记录路由选项的tcpdump输出
输出中optlen=40表示在IP首部中有40个字节的选项空间(IP首部长度必须为4字节的整数倍)。RR{39}的意思是记录路由选项已被设置,它的长度字段是39。然后是9个IP地址,符号“#”用来标记RR选项中的ptr字段所指向的IP地址。由于我们是在主机sun上观察这些分组(参见图7-4),因此所能看到ICMP回显请求中的IP地址清单是空的,而ICMP回显应答中有3
个IP地址。我们省略了tcpdump输出中的其他行,因为它们与图7-5基本一致。
位于路由信息末尾的标记EOL表示IP选项“endoflist(清单结束)”的值。EOL选项的值可以为0。这时表示39个字节的RR数据位于IP首部中的40字节空间中。由于在数据报发送之前空间选项被设置为0,因此跟在39个字节的RR数据之后的0字符就被解释为EOL。这正是我们所希望的结果。假如在IP首部中的选项字段中有多个选项,在开始下一个选项之前必须填入空白字符,另外还可以用另一个值为1的非凡字符NOP(“noOperation”)。
在图7-5中,SVR4把回显请求中的TTL字段设为32,BSD/386设为255(它打印出的值为254是因为路由器bsdi已经将其减去1)。新的系统都把ICMP报文中的TTL设为最大值(255)。
在作者使用的三个TCP/IP系统中,BSD/386和SVR4都支持记录路由选项。这就是说,当转发数据报时,它们都能正确地更新RR清单,而且能正确地把接收到的ICMP回显请求中的RR清单复制到出口ICMP回显应答中。虽然SunOS4.1.3在转发一个数据报时能正确更新RR清单,但是不能复制RR清单。Solaris2.x对这个问题已作了修改。