概述
Traceroute程序可以让我们看到IP数据报从一台主机传到另一台主机所经过的路由。Traceroute程序还可以让我们使用IP源路由选项。
Traceroute程序的操作
Traceroute程序使用ICMP报文和IP首部中的TTL字段(生存周期)。TTL字段是由发送端初始设置一个 8bit字段。推荐的初始值由分配数字 RFC指定,当前值为 64。较老版本的系统经常初始化为 15或32。我们从第 7章中的一些 ping程序例子中可以看出,发送 ICMP回显应答时经常把TTL设为最大值255。
每个处理数据报的路由器都需要把 TTL的值减1或减去数据报在路由器中停留的秒数。由于大多数的路由器转发数据报的时延都小于 1秒钟,因此TTL最终成为一个跳站的计数器,所经过的每个路由器都将其值减 1。
TTL字段的目的是防止数据报在选路时无休止地在网络中流动。
Traceroute程序发送一份UDP数据报给目的主机,但它选择一个不可能的值作为 UDP端口号(大于 30 000),使目的主机的任何一个应用程序都不可能使用该端口。因为,当该数据报到达时,将使目的主机的 UDP模块产生一份“端口不可达”错误的ICMP报文。这样, Traceroute程序所要做的就是区分接收到的 ICMP报文是超时还是端口不可达,以判断什么时候结束。
IP源站选路选项
源站选路(source routing)的思想是由发送者指定路由。它可以采用以下两种形式:
- 严格的源路由选择。发送端指明 IP数据报所必须采用的确切路由。如果一个路由器发现源路由所指定的下一个路由器不在其直接连接的网络上,那么它就返回一个“源站路由失败”的ICMP差错报文。
- 宽松的源站选路。发送端指明了一个数据报经过的 IP地址清单,但是数据报在清单上指明的任意两个地址之间可以通过其他路由器。
源站路由选项的格式如图:

对于源站选路,我们必须在发送IP数据报前填充IP地址清单;同时,对于源站选路,只要为所需要的IP地址数分配空间并进行初始化,通常其数量小于 9。
对于宽松的源站选路来说, code字段的值是0x83;而对于严格的源站选路,其值为 0x89。
源站路由选项的实际称呼为“源站及记录路由”(对于宽松的源站选路和严格的源站选路,分别用LSRR和SSRR表示),这是因为在数据报沿路由发送过程中,对 IP地址清单进行了更新。下面是其运行过程:
- 发送主机从应用程序接收源站路由清单,将第 1个表项去掉(它是数据报的最终目的地址),将剩余的项移到1个项中,并将原来的目的地址作为清单的最后一项。指针仍然指向清单的第 1项(即,指针的值为4)。
- 每个处理数据报的路由器检查其是否为数据报的最终地址。如果不是,则正常转发数据报(在这种情况下,必须指明宽松源站选路,否则就不能接收到该数据报)。
- 如果该路由器是最终目的,且指针不大于路径的长度,那么( 1)由ptr所指定的清单中的下一个地址就是数据报的最终目的地址;( 2)由外出接口(outgoing interface)相对应的I P地址取代刚才使用的源地址;(3)指针加4。