TTL(time to live): 目的是防止数据报在选路时无休止的在网络中流动。
当路由器收到一份IP数据报,如果其TTL字段是0或1,则路由器不转发该数据报(接收到这种数据的主机可以将他交给应用程序,因为不需要转发数据报),相反,路由器将丢弃该数据报,并给信源机发一份ICMP“超时”信息。Traceroute程序的关键在于这份ICMP信息的IP报文的信源地址是该路由器的IP地址。
Traceroute的操作过程:
1) 发送一份TTL字段为1的数据报(UDP数据报,选择一个不可能的端口号)给目的主机。处理这份数据报的第一个路由器将TTL值减一,丢弃该数据报,并发回一份超时ICMP报文。这样就得到了该路径的第一个路由器的IP地址。
2) 发送一份TTL字段为2的数据报给目的主机。。。。。得到该路径的第二个路由器的IP地址。
3) 继续这个过程。。。。。。。。。直到该数据报到达目的主机。但是,目的主机哪怕接到TTL值为1的IP数据报,也不会丢弃该数据报并产生一份超时ICMP报文,因为数据报已经到达其最终目的地了。那么我们如何判断是否已经达到目的主机了呢?
4) Traceroute程序发送UDP数据报给目的主机,但是它选择一个不可能的值作为UDP端口号,使目的主机的任何一个应用程序都不可能使用该端口。因为该数据报到达时,将使主机的UDP模块产生一份“端口不可达”错误的ICMP报文。这样,traceroute 程序所要做的就是区分接收到的ICMP报文是超时还是端口不可达,以判断什么时候结束。
实现效果:
对于每个TTL,traceroute程序发送3份数据报。每接收到一份ICMP报文,就计算并打印出往返时间。如果在5秒钟内仍未收到3份数据报的任何一份响应,则打印一个星号,并发送下一份数据报.
注意事项:
1) 不能保证现在的路由也是将来的路由(甚至连续的两份IP数据报都可能采用不同的路由)
2) 不能保证ICMP报文的路由与traceroute程序发送的UDP数据报采用同一路由。所以打印出来的往返时间可能并不能真正体现数据报发出和返回的时间差。
3) 返回的ICMP报文中的信息源IP地址是UDP数据报到达的路由器接口的IP地址,这与IP记录路由选项不同,记录的IP地址指的是发送接口的地址(转发出去的那个接口的地址)
声明:文章内容来自《TCP/IP详解》第一卷,部分内容经过本人整理,仅作学习笔记之用。