8.2、Traceroute程序的操作
它发送一份TTL字段位1的IP数据报给目的主机。处理这份数据报的第一个路由器将TTL值减1,丢弃该数据报,并发回一份超时ICMP报文。这样就得到了改路径中第一个路由器的地址。然后Traceroute程序发送一份TTL值为2的数据报,这样我们就可以得到第二个路由器的地址。继续这个过程直至该数据报到达目的主机。但是目的主机哪怕接受到TTL值为1的IP数据报,也不会丢弃该数据报并产生一份超时ICMP报文,这是因为数据报已经到达其最终目的地。
Traceroute程序发送一份UDP数据报给目的主机,但它选择一个不可能的值作为UDP端口号(大于 30000),使目的主机的任何一个应用程序都不可能使用该端口。因此,当该数据报达到时,将使目的主机的UDP模块产生一份“端口不可达”错误的ICMP报文。
8.3、局域网输出
例子:
svr4 % traceroute slip
traceroute to slip (140.252.13.63), 30 hops max, 40 byte packets
1 bsdi (140.252.13.35) 20ms 10ms 10ms
2 slip (140.252.13.65) 120ms 120ms 120ms
输出的第一个无标号行给出了目的主机名和IP地址,指出traceroute程序最大的TTL字段值为30。40字节的数据报包含20字节IP首部、8字节的UDP首部和12字节的用户数据。
输出的后面两行以TTL开始,接下来是主机或路由器以及其IP地址。对于每个TTL值,发送3份数据报。没接收到一份ICMP报文,就计算并打印往返时间。如果在5秒钟内仍未收到3份数据报的任意一份的响应,则打印一个星号,并发送下一份数据报。
我们不可能看到路由器传送一个TTL值为0的数据报,除非发出该数据报的改路由器以及崩溃。
有两种不同的ICMP“超时”报文,它们的ICMP报文中的code字段不同。
我们所讨论的ICMP报文是在TTL值等于0时产生的,其code字段位0。
主机在组装分片可能发生超时,这时,它将发送一份“组装报文超时”的ICMP报文。这种差错报文将code字段置1。
关于traceroute程序有一些必须指出的事项。
首先,并不能保证现在的路由也是将来所要采用的路由,甚至两份连续的IP数据报都可能采用不同的路由。
第二,不能保证ICMP报文的路由与traceroute程序发送的UDP数据报采用同一路由。
第三,返回的ICMP报文中的信源IP地址是UDP数据报到达的路由器接口的IP地址。
最后,在广域网情况下,如果traceroute程序输出是可读的域名形式,而不是IP地址形式,那么会更好理解一些。
8.4、IP源站选路选项
通常IP路由是动态的,即每个路由都有判断数据报下面giant转发到哪个路由器。
源站选项的思想是有发送者指定路由。它们可以采用以下两种形式:
这个格式与记录路由选项格式基本一致。不同之处是,对于源站选路,我们必须在发送IP数据报前填充IP地址清单;而对于记录路由选项,我们需要为IP地址清单分配并清空一些空间,并让路由器填充该清单中的各项。同时,对于源站选路,只要为所需要的IP地址数分配空间并进行初始化,通常其数量小于9。而对于记录路由选项来说,必须尽可能地分配空间,以达到9个地址。
对于宽松的源站选路来说,code字段的值是0x83;而对于严格的源站选路,其值为0x89。
其运行过程:
习题:
1、当IP将接收到的TTL字段减1,发现它为0时,将会发生什么结果?
答:如果一个输入数据报的TTL为0,做减一操作然后测试会将把TTL设置为255,并且让数据报继续传输。尽管一个路由器永远不会收到一个TTL为0的数据报,但这种情况确实会发生。
2、traceroute程序如何计算RTT的?将这种计算RTT的方法与ping相比较。
答:我们注意到traceroute在UDP数据报的数据部分存储了12个字节,其中包含了数据报发生的时间。然而,从图中可以看出ICMP只返回了出错的IP数据报的头8个字节,实际上这是8个字节的UDP首部。因此,ICMP的差错报文没有返回traceroute存储的时间值。traceroute保存了它发送分组的时间,当收到一个ICMP应答时,取出当时的时间,把两个值相减就可以得出RTT。
回忆一下第7章中,ping在输出的ICMP回显请求中存储了时间,这个值被服务器回显了回来。这样即使分组返回时失序,ping也能打印出正确的RTT。