Traceroute程序使用ICMP报文和IP首部中的TTL字段(生存周期)来工作。
TTL字段是由发送方初始设置的一个8bit字段。每个处理数据报的路由器都要把TTL的值减去1或者减去数据报在路由器中停留的秒数。由于大多数的路由器转发数据报的时延都小于1秒钟,因此TTL最终成为一个跳站的计数器,所经过的每个路由器都将其值减1。
Traceroute程序是这样获得经过的路由器地址的:
当路由器收到一份IP数据报,如果其TTL值是0或者1,则路由器不转发此数据报,而将此数据报丢弃,并给信源机发送一份ICMP “超时”信息(当数据包目的地址是自己时,将发送ICMP端口不可达报文)。而这份超时信息的信源地址正是该路由器IP地址。
Traceroute程序是这样判断“跟踪”结束的:
Traceroute程序发送给目标主机一份UDP数据报,并且使用一个“不可能”的值做为UDP端口号(通常大于30000),这样目的主机的任何程序都不能回应,最终目的主机将返回一个“端口不可达”的信息给发送者。这时发送者即可判断“跟踪”结束。
实验的网络拓扑及配置如下图示:
R0上,Traceroute 10.0.104.2,在R0-R2间抓包,抓包的结果如下图:
抓包结果详细说明如下:
1、R0(192.168.0.1)发送出UDP数据报,数据报的目的端口为33434;IP数据报的目的地址为R3(10.0.104.2),Time to live(TTL)为1。如下图:
2、 R2路由器接收到此数据包,由于TTL为1,所以R2(接收到此数据包的接口)将向R0返回一个超时的ICMP数据包(Type为11)。如下图:
3、R0收到此ICMP数据包后,R0(192.168.0.1)再次发送出UDP数据报,数据报的目的端口为33435;IP数据报的目的地址为R3(10.0.104.2),Time to live(TTL)为2。如下图:
此时,数据顺利通过R2,TTL将减1,变为TTL=1,然后转发给R1,R1检查TTL为1,R1中接收到此数据包的接口将返回给发送方一个ICMP超时数据包,如下图:
4、R0将再次发送UDP数据报,目的地址还是R3,目的端口为33440,TTL=3,如下图:
此数据包将经过R2-R1的转发,到达R3,由于经过R2、R1时TTL都要减1,所以到达R3时的TTL=1,但R3此时发现数据是发送给自己的,所以此时R3将不返回“超时”ICMP,而是返回端口不可达信息给R0(R3上接收到此数据包的接口回应此数据包)。如下图示:
R0收到端口不可达的报文信息后,将停止发送“跟踪”UDP数据,至此Traceroute程序功能完成