traceroute使用以及实现原理
traceroute 命令是诊断网络问题时常用的工具,它可以定位从源主机到目标主机之间经过了哪些路由器,以及达到各个路由器所用的耗时
traceroute 用途
我们知道,两台主机之间的通信,往往需要经过很多中间节点(如下图所示)
v2-8854b209358e8b3cca6316f975eb32db_r.jpg
当源主机 A 向目标主机 B 发送消息,发现消息无法送达。此时,可能是中间节点发生了问题,比如说路由器 02 因负载过高产生了丢包
此时,可以通过 traceroute 进行初步检测,定位网络包是在哪个节点丢失的,之后才可以进行针对性的处理
入门例子
假设想要知道,当我们访问 iqiyi.com 时,经过多少中间节点,那么可以使用如下命令:
下面为输出结果
traceroute: Warning: www.iqiyi.com has multiple addresses; using 220.181.184.211
traceroute to ipv6-static.dns.iqiyi.com (220.181.184.211), 64 hops max, 52 byte packets
1 10.81.71.238 (10.81.71.238) 17.692 ms 15.428 ms 13.868 ms
2 * * *
3 * * *
4 218.30.104.81 (218.30.104.81) 16.006 ms
218.30.104.17 (218.30.104.17) 26.800 ms 13.931 ms
5 * * *
6 * * *
7 220.181.184.211 (220.181.184.211) 18.317 ms 18.816 ms 15.585 ms
首先,从上面的输出内容中可以知道 iqiyi.com 域名对应多个 IP 地址,这里采用了 220.181.184.211 ,对应的主机名是 ipv6-static.dns.iqiyi.com
从当前主机到目标主机,最多经过 64 跳(64 hops max),每次检测发送的包大小为 52 字节(52 byte packets)
traceroute: Warning: www.iqiyi.com has multiple addresses; using 220.181.184.211
traceroute to ipv6-static.dns.iqiyi.com (220.181.184.211), 64 hops max, 52 byte packets
接下来的输出比较有规律。每一行包含三部分:序号 + 主机/IP + 耗时
行首是序号,表示经过的第 N 个节点。序号后面是节点的主机名 + IP 地址。最后是到达当前节点所耗费的时间
1 10.81.71.238 (10.81.71.238) 17.692 ms 15.428 ms 13.868 ms
2 * * *
3 * * *
4 218.30.104.81 (218.30.104.81) 16.006 ms
218.30.104.17 (218.30.104.17) 26.800 ms 13.931 ms
5 * * *
6 * * *
7 220.181.184.211 (220.181.184.211) 18.317 ms 18.816 ms 15.585 ms
*注意:每次检测都同时发送 3 个数据包,因此打印出来三个时间。此外,如果某一个数据报超时没有返回,则时间显示为 *,此时需要特别注意,因为有可能出问题了
以第一跳为例,IP 地址是 10.81.71.238,检测到数据包到达路由器的时间分别是:17.692 ms 15.428 ms 13.868 ms
第2,3.....N 跳类似,最后一跳为目标主机
7 220.181.184.211 (220.181.184.211) 18.317 ms 18.816 ms 15.585 ms
实现原理简析
主机之间通信,网络层 IP 数据包的首部中,有个 TTL(Time To Live)字段。TTL 的作用是,设置 IP 数据报被丢弃前,最多能够经过的节点数
每经过一个中间节点,再向下一个节点转发数据前,都会将 TTL 减 1。如果 TTL 不为 0,则将数据报转发到下一个节点;否则,丢弃数据报,并返回错误
假设 TTL 设置为 N,当前转发至第 M 个节点:
- 第 1 个节点:将 TTL 设置为 N - 1。如果 TTL != 0,则将数据报传递给第 2 个节点;否则丢弃数据,并向源主机报错
- 第 2 个节点:将 TTL 设置为 N - 2。如果 TTL != 0,则将数据报传递给第 3 个节点;否则丢弃数据,并向源主机报错
- 。。。。。。
- 第 M 个节点:将 TTL 设置为 N - M。如果 TTL != 0,则将数据报传递给第 M + 1 个节点;否则丢弃数据,并向源主机报错
如果源主机收到出错的回报,则知道数据报已经到达哪一个节点。此时,记录下该节点的 IP,以及数据报往返的耗时
到这里,可以引出 traceroute 的基本实现原理:
从源主机向目标主机发送 IP 数据报,并按顺序将 TTL 设置为从 1 开始递增的数字(假设为 N),导致第 N 个节点(中间节点 or 目标主机)丢弃数据报并返回出错信息。源主机根据接收到的错误信息,确定到达目标主机路径上的所有节点 IP,以及对应的耗时时间
来看个简单的图例。假设源主机 A 到目标主机 B 之间有 2 个中间节点,也就是说,A 到 B 一共需要经过 3 跳。
v2-06e0b498f1aab9d80c6ec65ced30fc3a_r.jpg