traceroute是linux/unix系统中用于分析本地到目标网络地址间的路由转发路径的工具,也常用于诊断网络链路不通或异常的发生位置。在windows中也有类似功能的工具,名为tracert。
本文将介绍traceroute的用法并分析其原理。
用法
traceroute的使用方式很简单,只需要提供目标IP作为参数即可。工具也提供一些参数来设置探测的最大跳数、每跳的探测次数等,不过一般较少使用,可以参考--help输出的帮助信息。
上图是在windows下使用tracert追踪baidu.com对应的服务器IP 220.181.38.148所产生的结果。输出的第一行和探测结果无关,只是表示tracert最多探测30跳,如果30跳仍未到达目标则不再探测。
之后每行输出的是路由链路上每一跳的路由节点IP以及到这个节点的时延情况。可以看到第1跳是本地路由器,第2跳是本地运营商接入网关,之后每一跳都是网络转发路径上的一个节点。每增加一跳,时延一般都会增加一点,因为传输路径变长了。最终经过17跳,报文到达目标服务器。
对于这个结果,我们会产生一些疑问:
- 每一跳的IP和时延信息是怎么得到的?
- 为什么每一跳有3个时延信息,有时还会显示2个或者3个IP地址?
- 为什么有些跳数显示的结果是请求超时?为什么有节点请求超时了还能到达后续的节点?
要回答这些问题,就需要分析traceroute的原理。
原理
traceroute的原理其实非常简单,步骤如下:
1. 向目标IP发送3个TTL=n(n起始值为1)的ICMP ping request报文,等待回应
2. 如果收到ICMP ping response报文,则说明路由成功,通过n跳可以到达目标IP,traceroute工作完成。request和response的时间间隔就是时延,由于发送了3个request,因此有3个时延信息。
3. 如果收到ICMP TTL exceeded报文,则说明第n跳路由到达了这个报文的发送节点。IP报文的TTL字段每经过一次路由转发就会减1,当减到0时当前的转发节点就会向报文的源IP发送一个ICMP TTL exceeded报文,因此发送了这个报文的节点就是第n跳的路由节点。由于发送了3个request,因此会返回3个报文和对应的时延信息。由于到目标IP的路由路径不一定是唯一的,因此报文在第n跳时到达的节点不一定是同一个,就有可能会输出多个第n跳节点地址。
4. 如果在request发出3秒(默认超时时间)后仍然没有收到任何回应,则这轮检测超时。但这并不意味着目标IP不可达,而很可能是因为第n跳到达的节点不允许发送TTL exceeded报文。因此traceroute会继续后面的探测过程。
5. 将TTL加1,回到第1步继续探测。
通过上述步骤,traceroute根据发出的ICMP request和收到的响应情况,就可以获得路由路径上所有(允许发送TTL exceeded报文)的路由节点IP和时延了。由于每一跳的探测报文会发送3次,因此会有3个响应时延和3个路由节点IP(可能重合)。由于部分路由节点不允许发送TTL exceeded报文,因此在这些节点上TTL耗尽的探测包不会收到响应,也就无法获得这一跳的节点信息,但这个节点可以继续转发报文,因此路由过程和探测过程都可以继续。