我们现在可以猜想一下Tr a c e r o u te程序的操作过程。它发送一份T T L字段为1的IP数据报给目的主机。处理这份数据报的第一个路由器将T T L值减1,丢弃该数据报,并发回一份超时I C MP报文。这样就得到了该路径中的第一个路由器的地址。然后Tr a c e r o u t e程序发送一份T T L值为2的数据报,这样我们就可以得到第二个路由器的地址。继续这个过程直至该数据报到达目的主机。但是目的主机哪怕接收到T T L值为1的IP数据报,也不会丢弃该数据报并产生一份超时I C MP报文,这是因为数据报已经到达其最终目的地。那么我们该如何判断是否已经到达目的主机了呢?Tr a c e r o u t e程序发送一份U DP数据报给目的主机,但它选择一个不可能的值作为U D P端口号(大于30000),使目的主机的任何一个应用程序都不可能使用该端口。因为,当该数据报到达时,将使目的主机的U DP模块产生一份“端口不可达”错误(见6 . 5节)的I C M P报文。这样,Tr a c e r o u te程序所要做的就是区分接收 到的I C MP报文是超时还是端口不可达,以判断什么时候结束。
traceroute工作原理(互联网)
Traceroute程序的设计是利用ICMP及IPheader的TTL(Time ToLive)栏位(field)。首先,traceroute送出一个TTL是1的IPdatagram(其实,每次送出的为3个40字节的包,包括源地址,目的地址和包发出的时间标签)到目的地,当路径上的第一个路由器(router)收到这个datagram时,它将TTL减1。此时,TTL变为0了,所以该路由器会将此datagram丢掉,并送回一个「ICMP time exceeded」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),traceroute收到这个消息后,便知道这个路由器存在于这个路径上,接着traceroute 再送出另一个TTL是2 的datagram,发现第2 个路由器......traceroute 每次将送出的datagram的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个datagram 抵达目的地。当datagram到达目的地后,该主机并不会送回ICMP timeexceeded消息,因为它已是目的地了,那么traceroute如何得知目的地到达了呢?
Traceroute在送出UDPdatagrams到目的地时,它所选择送达的port number是一个一般应用程序都不会用的号码(30000 以上),所以当此UDP datagram到达目的地后该主机会送回一个「ICMP port unreachable」的消息,而当traceroute收到这个消息时,便知道目的地已经到达了。所以traceroute 在Server端也是没有所谓的Daemon 程式。
Traceroute提取发ICMPTTL到期消息设备的IP地址并作域名解析。每次 ,Traceroute都打印出一系列数据,包括所经过的路由设备的域名及IP地址,三个包每次来回所花时间。
Traceroute有一个固定的时间等待响应(ICMP TTL到期消息)。如果这个时间过了,它将打印出一系列的*号表明:在这个路径上,这个设备不能在给定的时间内发出ICMP ,TTL到期消息的响应。然后,Traceroute给TTL记数器加1,继续进行。