6.4.3 traceroute

在IP包结构中有一个定义数据包生命周期的TTL(Time To Live)字段,该字段用于表明IP数据包的生命值,当IP数据包在网络上传输时,每经过一个路由器该值就减1,当该值减为0时此包就会被路由器丢弃。这种设计可用于避免出现一些由于某种原因始终无法到达目的地的包不断地在互联网上传递(可以形象地称之为“幽灵包”),减少无谓的网络资源耗用。

不过路由器也不是“无声无息”地将TTL值为0的IP包丢弃的,它会同时给发送该IP数据包的主机发送一个ICMP“超时”消息,主机在接收到这个ICMP包后就同时能得到该路由的IP地址。

根据上面两个特点,人们写了一个检测数据包是如何经由路由器的工具——traceroute,我们可以想象一下该工具的工作原理:它先构造出一个TTL值为1的数据包发送给目的主机,这个数据包在经由第一个路由器时,路由器先将TTL值减1变为0,然后将该IP包丢弃,同时给发送一个ICMP消息,这样就得到了经过的第一台路由器的IP地址;然后再构造出一个TTL值为2的数据包,以此类推,就能得到该IP包经历的整条链路的路由器IP。

这里会有一个问题:traceroute如何确认该IP包成功地被目的主机接收了呢?因为目的主机即便收到了TTL值为1的数据包也不会发送ICMP通知给源主机的。这时traceroute所做的工作就是发送一个UDP包给目的主机,同时制定该UDP接收的端口为主机不可能存在的端口,主机在接收到这样的包后,由于端口不可达,则主机会返回一个“端口不可达”的通知,这样就能确认目的主机是否可以接收到数据包。