Traceroute程序记录路由的原理为:使用ICMP报文和IP首部中的TTL字段(生成周期),TTL字段是由发送端初始设置一个8bit字段。推荐的初始值由分配数字RFC指定,当前值为64。每个处理数据报的路由器都需要把TTL的值减1,当路由器收到一份IP数据报,如果其TTL字段是0或1,则路由器不转发该数据报(接收到这种数据报的目的主机可以将它交给应用程序,这是因为不需要转发该数据报。但是在通常情况下,系统不应该接收TTL字段为0的数据报)。相反,路由器将该数据报丢弃,并给源主机机发一份ICMP“超时”信息,Traceroute程序的关键在于包含这份ICMP信息的IP报文的信源地址是该路由器的IP地址。但是目的主机哪怕接收到TTL值为1的IP数据报,也不会丢弃该数据报并产生一份超时ICMP报文,因为数据报已经到达其最终目的地。为了判断是否已经到达目的主机了。因此,Traceroute程序采用发送一份UDP数据报给目的主机,但它选择一个不可能的值作为UDP端口号。因为,当该数据报到达时,将使目的主机的UDP模块产生一份“端口不可达”错误的ICMP报文。这样,Traceroute程序所要做的就是区分接收到的ICMP报文是超时还是端口不可达,以判断什么时候结束。 如上图所示,输出的第1个无标号行给出了目的主机名和其IP地址,指出traceroute程序最大的TTL字段值为30,60字节的数据报。对于每个TTL值,Traceroute程序会发送3份数据报。每接收到一份ICMP报文,就计算并打印出往返时间。如果在5秒种内仍未收到3份数据报的任意一份的响应,则打印一个星号,并发送下一份数据报。 如上图,ICMP超时报文分为两种情况,这两种情况code字段不同,code为0表示ICMP报文是在TTL减为0时产生的,code为1表示主机在组装分片时超时产生的。 Traceroute程序存在以下不足:
- 不能保证现在的路由也是将来所要采用的路由,甚至两份连续的IP数据报都可能采用不同的路由。如果在运行程序时,路由发生改变,就会观察到这种变化,这是因为对于一个给定的TTL,如果其路由发生变化,traceroute程序将打印出新的IP地址。
- 不能保证ICMP报文的路由与traceroute程序发送的UDP数据报采用同一路由。
- 返回的ICMP报文中的信源IP地址是UDP数据报到达的路由器接口的IP地址。这与IP记录路由选项不同,记录的IP地址指的是发送接口地址。由于每个定义的路由器都有2个或更多的接口,因此,从A主机到B主机上运行traceroute程序和从B主机到A主机上运行traceroute程序所得到的结果可能是不同的。
- 在广域网情况下,如果traceroute程序的输出是可读的域名形式,而不是IP地址形式,那么会更好理解一些。
IP源站选路选项
源站选路的思想是由发送者指定路由。分为两种形式:
- 严格的源路由选择。发送端指明IP数据报所必须采用的确切路由。如果一个路由器发现源路由所指定的下一个路由器不在其直接连接的网络上,那么它就返回一个“源站路由失败”的ICMP差错报文。
- 宽松的源站选路。发送端指明了一个数据报经过的IP地址清单,但是数据报在清单上指明的任意两个地址之间可以通过其他路由器。
Traceroute程序提供了一个查看源站选路的方法,可以在IP选项中指明源站路由,选项的报文格式如上图,对于宽松的源站选路来说,code字段的值是0x83;而对于严格的源站选路,其值为0x89。len和ptr字段与Ping程序中描述的记录路由选项中描述一样。因此,最多只支持9个IP地址,使用traceroute程序的-g选项,可以为宽松的源站选路指明一些中间路由器。采用该选项可以最多指定8个中间路由器(其个数是8而不是9的原因是,所使用的编程接口要求最后的表目是目的主机)。-G选项与前面所描述的-g选项是完全一样的,不过此时是严格的源站选路而不是宽松的源站选路。
|