您的位置:首页 > 理论基础 > 计算机网络

《TCP/IP详解 卷一:协议》读书笔记--Traceroute程序

2015-10-05 15:46 633 查看
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数据报所必须采用的确切路由。如果一个路由器发现源路由所指定的下一个路由器不在其直接连接的网络上,那么它就返回一个“源站路由失败”的ICMP差错报文。
宽松的源站选路。发送端指明一个数据报经过的IP地址清单,但是数据报在清单上指明的任意两个地址之间可以通过其他路由器。



这个格式与记录路由选项格式基本一致。不同之处是,对于源站选路,我们必须在发送IP数据报前填充IP地址清单;而对于记录路由选项,我们需要为IP地址清单分配并清空一些空间,并让路由器填充该清单中的各项。同时,对于源站选路,只要为所需要的IP地址数分配空间并进行初始化,通常其数量小于9。而对于记录路由选项来说,必须尽可能地分配空间,以达到9个地址。

对于宽松的源站选路来说,code字段的值是0x83;而对于严格的源站选路,其值为0x89。

其运行过程:

发送主机从应用程序接收源站路由清单,将第一个表项去掉(它是数据报的最终目的地址),将所有剩余的项左移1个位置,并将原来的目的地址作为清单的最后一项。指针仍然指向清单的第1项(即,指针的值为4)。
每个处理数据报的路由器检查其是否Wie数据报的最终地址。如果不是,则正常转发数据报(在这种情况下,必须字母宽松源站选路,否则不能接受到数据报)。
如果该路由器是最终目的,且指针不大于路径的长度,那么(1)有ptr所指定的清单中的下一个地址就是数据报的最终目的地址;(2)由外出接口相对应的IP地址取代刚才使用的源地址;(3)指针加4

习题:

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息