traceroute程序使用ICMP报文和IP首部中的TTL字段(生存周期)。TTL字段是由发送端初始设置一个8bit字段。推荐的初始值由分配数字RFC指定,当前值为64。
TTL字段的目的是防止数据报在选路时无休止地在网络中流动。
traceroute程序的关键在于包含这份ICMP信息的IP报文的信源地址是该路由器的IP地址。
IPMP超时报文
traceroute程序将其发送的UDP数据报的源端口号设置为Unix进程号与32768之间的逻辑或值。对于在同一台主机上多次运行traceroute程序的情况,每个进程都查看ICMP返回的UDP首部的源端口号,并且只处理那些对自己发送应答的报文。
- traceroute并不能保证现在的路由也是将来所要采用的路由,甚至两份连续的IP数据报都可能采用不同的路由。如果在运行程序时,路由发生改变,就会观察到这种变化,这是因为对于一个给定的TTL,如果其路由发生变化,traceroute程序将打印出新的IP地址;
- traceroute不能保证ICMP报文的路由与traceroute程序发送的UDP数据报采用同一路由。这表明所打印出来的往返时间可能并不能真正体现数据报发出和返回的时间差;
- 返回的ICMP报文中的信源IP地址是UDP数据报到达的路由器接口的IP地址;与IP记录路由选项不同,记录的IP地址指的是发送接口地址。由于每个定义的路由器都有2个或更多的接口,因此,从A主机到B主机上运行traceroute程序和从B主机到A主机上运行traceroute程序所得到的结果可能是不同的。
- 在广域网情况下,需要路由器或主机的管理呗正确配置“反射域名查看”功能(因为traceroute程序接收到ICMP报文时,获得的唯一信息就是IP地址)
IP源站选路选项
通常IP路由是动态的,即每个路由器都要判断数据报下面该转发到哪个路由器。应用程序对此不进行控制,而且通常也并不关心路由。它采用类似Traceroute程序的工具来发现实际的路由。
源站选路(source routing)是由发送者指定路由
- 严格的源路由选择。发送端指明IP数据报所必须采用的确切路由。如果一个路由器发现源路由所指定的下一个路由器不在其直接连接的网络上,就返回一个“源站路由失败”的ICMP差错报文; - 宽松的源站选路。发送端指明了一个数据报经过的IP地址清单,介是数据报在清单上指明的任意两个地址之间可以通过其他路由器。
IP首部源站路由选项的通用格式
对于宽松的源站选路来说,code字段的值是0x83;对于严格的源站选路,其值为0x89。
源站路由选项的实际称呼为“源站及记录路由”(对于宽松的源站选路和严格的源站选路,分别用LSRR和SSRR表示),这是因为在数据报沿路由发送过程中,对IP地址清单进行了更新。下面是其运行过程:
- 发送主机从应用程序接收源站路由清单,将第1个表项去掉(它是数据报的最终目的地址),将剩余的项移到1个项中,并将原来的目的地址作为清单的最后一项。指针仍然指向清单的第1项。
- 每个处理数据报的路由器检查其是否为数据报的最终地址。如果不是,则正常转发数据报(在这种情况下,必须指明宽松源站选路,否则就不能接收到该数据报)。
- 如果该路由器是最终目的,且指针不大于路径的长度,那么(1)由ptr所指定的清单中的下一个地址就是数据报的最终目的地址;(2)由外出接口(outgoing interface)相对应的IP地址刚才使用的源地址;(3)指针加4。
小结 在一个TCP/IP网络中,traceroute程序是不可缺少的工具。其操作很简单:开始时发送一个TTL字段为1的UDP数据报,然后将TTL字段每次加1,以确定路径中的每个路由器。每个路由器在丢弃UDP数据报时都返回一个ICMP超时报文2,而最终目的的主机则产生一个ICMP端口不可达的报文。