traceroute

Tr a c e r o u t e程序使用I C M P报文和I P首部中的T T L字段(生存周期)。 T T L字段是由发送端初始设置一个 8 bit字段。推荐的初始值由分配数字 R F C指定,当前值为 6 4。较老版本的系统经常初始化为 1 5或3 2。我们从第 7章中的一些 p i n g程序例子中可以看出,发送 I C M P回显应答时经常把T T L设为最大值2 5 5。

每个处理数据报的路由器都需要把 T T L的值减1或减去数据报在路由器中停留的秒数。由于大多数的路由器转发数据报的时延都小于 1秒钟,因此T T L最终成为一个跳站的计数器,所经过的每个路由器都将其值减 1。 RFC 1009 [Braden and Postel 1987]指出,如果路由器转发数据报的时延超过1秒,那么它将把T T L值减去所消耗的时间(秒数)。但很少有路由器这么实现。新的路由器需求文档RFC [Almquist 1993]为此指定它为可选功能,允许把T T L看成一个跳站计数器。

traceroute发送一份 T T L字段为1的I P数据报给目的主机。处理这份数据报的第一个路由器将 T T L值减1,丢弃该数据报,并发回一份超时I C M P报文。这样就得到了该路径中的第一个路由器的地址。然后 Tr a c e r o u t e程序发送一份T T L值为2的数据报,这样我们就可以得到第二个路由器的地址。继续这个过程直至该数据报到达目的主机。但是目的主机哪怕接收到 T T L值为1的I P数据报,也不会丢弃该数据报并产生一份超时I C M P报文,这是因为数据报已经到达其最终目的地。那么我们该如何判断是否已经
到达目的主机了呢?
Tr a c e r o u t e程序发送一份 U D P数据报给目的主机,但它选择一个不可能的值作为 U D P端口号(大于 30 000),使目的主机的任何一个应用程序都不可能使用该端口。因为,当该数据报到达时,将使目的主机的 U D P模块产生一份“端口不可达”错误的 I C M P报文。

下图是ping外网时,traceroute的输出结果。当发送的包没有应答是就显示“*”。所以最终,当TTL是30的时候,还是没有应答就终止了。

 

抓包可以知道,每个TTL值发送都发送三次,也就是说连续三个的TTL值是相同的。上图中每次一个包没有应答,就显示一个“*",每个TTL对应3个。如下图可以看出,选择的端口号也是一个比较大的值。

其中的一份icmp应答,是有其中的一个路由器返回的,记录了其IP地址。

posted @ 2015-12-03 22:10  SuperTao1024  阅读(317)  评论(0编辑  收藏  举报