一个 IP 包需要经过一系列路由的转发,才能到达目的地。下图是一个典型的例子,一个从主机 ant 出发,去往主机 apple 的 IP 包,需要经过中间路由 R1 、R2 以及 R3 :
如果我们在主机ant ping apple主机失败,那么可以使用traceroute命令进行排查。
通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路由路径。
traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其ip地址。
它的原理很简单:利用 IP 包 TTL 特性来完成路径探测。
IP 包每经过一跳路由, TTL 减一;当 TTL 减到零,路由器便将它丢弃。这样可避免 IP 包因陷入路由环路而在网络中永远存在。
路由器在将超时包丢弃的同时,负责向源 IP 发送一个 ICMP 报文,报告 传输超时 ( time to live exceeded in transit )错误,ICMP 类型为 11 。
原包进入路由时 TTL 等于 1 ,路由转发前将 TTL 减 1 , TTL 便降为 0 了。因此对路由而言,入站包 TTL 为 1 即视为超时。
注意到,路由还将原 IP 包的头部以及数据的前 8 个字节作为数据附在 ICMP 报文中。发送者只需检查这部分数据,即可获悉超时包的上下文信息。
这样一来,ant 发一个 TTL=1 的 IP 包给 apple ,然后等待第一跳路由的超时差错,不就探测到第一跳路由了吗?
以此类推,ant 发 TTL=2 的 IP 包可以探测到第二跳路由,最终探测到 apple 本身。
问题来了,当 traceroute 收到路由发来的 ICMP 超时差错后,如何判读该路由是第几跳呢?问题答案就藏在 ICMP 差错报文中附带的原包头部中。
traceroute 发出的探测包,可以是一个 ICMP 回显请求,也可以是一个 UDP 请求。它默认使用兼容性更好的 UDP ,因为不少系统和网络都封杀了 ICMP 回显相关报文。
UDP 我们在后续章节才学习,因此这里先以 ICMP 为例进行讲解,但思路都是相通的。与 ping 命令类似,traceroute 通过 ICMP 报文中的 序号 字段来匹配探测包。
实际上,traceroute 默认会连续发 3 个 TTL=1 的探测包( ICMP 回显请求),再连续发 3 个 TTL=2 的探测包,以此类推。发包的同时,它在内存中建立一张从序号到 TTL 的映射表:
序号 | TTL |
---|---|
1 | 1 |
2 | 1 |
3 | 1 |
4 | 2 |
5 | 2 |
6 | 2 |
… | … |
探测包 TTL 耗尽后,路由将它丢弃,并向发送者报告 ICMP 超时差错。traceroute 收到超时差错后,取出原探测包的头部信息。然后根据序号查出该包发出去时的 TTL ,也就知道该差错是第几跳路由发出的。
下图是一个简单的例子:
[yiibai@localhost ~]$ traceroute www.yiibai.com traceroute to www.yiibai.com (112.124.103.85), 30 hops max, 60 byte packets 1 112.66.64.1 (112.66.64.1) 3.789 ms 5.548 ms 2.798 ms 2 218.77.139.177 (218.77.139.177) 6.378 ms 4.787 ms 4.786 ms 3 218.77.137.73 (218.77.137.73) 30.638 ms 29.539 ms 31.520 ms 4 202.97.85.94 (202.97.85.94) 46.474 ms * * 5 * * * 6 * 115.236.101.209 (115.236.101.209) 48.751 ms 115.236.101.217 (115.236.101.217) 47.206 ms 7 42.120.247.73 (42.120.247.73) 47.765 ms 42.120.247.109 (42.120.247.109) 47.337 ms 47.383 ms 8 106.11.144.18 (106.11.144.18) 46.717 ms 106.11.37.9 (106.11.37.9) 47.143 ms 106.11.144.30 (106.11.144.30) 54.233 ms 9 * * * 10 112.124.103.85 (112.124.103.85) 45.906 ms 45.463 ms 46.325 ms [yiibai@localhost ~]$
说明:
每一行都是一个记录,每个纪录就是一跳 ,每跳表示一个网关,看到每行有三个时间,单位是 ms,表示探测数据包向每个网关发送三个数据包后,网关响应后返回的时间。
如果使用 traceroute -q 4 www.yiibai.com
,表示向每个网关发送4个数据包。
有时我们traceroute
一台主机时,会看到有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。
有时在某一网关处延时比较长,有可能是某台网关比较阻塞,也可能是物理设备本身的原因。当然如果某台DNS出现问题时,不能解析主机名、域名时,也会 有延时长的现象;您可以加-n
参数来避免DNS解析,以IP格式输出数据。
2、其他实例
traceroute -m 10 www.baidu.com # 跳数设置 traceroute -n www.baidu.com # 显示IP地址,不查主机名 traceroute -p 6888 www.baidu.com # 探测包使用的基本UDP端口设置6888 traceroute -q 4 www.baidu.com # 把探测包的个数设置为值4 traceroute -r www.baidu.com # 绕过正常的路由表,直接发送到网络相连的主机 traceroute -w 3 www.baidu.com # 把对外发探测包的等待响应时间设置为3秒
ref:
traceroute 命令,Linux traceroute 命令详解:显示数据包到主机间的路径 - Linux 命令搜索引擎
traceroute命令原理 | 小菜学编程
Linux命令:traceroute命令(路由跟踪)_吾尝终日而思矣,不如须臾之所学也-CSDN博客_traceroute
每天一个linux命令(55):traceroute命令 - peida - 博客园
traceroute命令 -Linux命令大全教程™