traceroute,现代Linux系统称为tracepath,Windows系统称为tracert,是一种计算机网络工具。它可显示数据包在IP网络经过的路由器的IP地址。我们可以用这个命令来查看数据包途径的网络节点和ISP,从而排除一部分网络问题。
本文基于Linux环境
1 原理
程序是利用增加存活时间(TTL)值来实现其功能的。每当数据包经过一个路由器,其存活时间就会减1。当其存活时间是0时,主机便取消数据包,并发送一个ICMP TTL数据包给原数据包的发出者。程序发出的首3个数据包TTL值是1,之后3个是2,如此类推,它便得到一连串数据包路径。注意IP不保证每个数据包走的路径都一样。
实现:
主叫方首先发出 TTL=1 的数据包,第一个路由器将 TTL 减1得0后就不再继续转发此数据包,而是返回一个 ICMP 逾时报文,主叫方从逾时报文中即可提取出数据包所经过的第一个网关地址。然后又发出一个 TTL=2 的 ICMP 数据包,可获得第二个网关地址,依次递增 TTL 便获取了沿途所有网关地址。
需要注意的是,并不是所有网关都会如实返回 ICMP 超时报文。出于安全性考虑,大多数防火墙以及启用了防火墙功能的路由器缺省配置为不返回各种 ICMP 报文,其余路由器或交换机也可被管理员主动修改配置变为不返回 ICMP 报文。因此 Traceroute 程序不一定能拿全所有的沿途网关地址。所以,当某个 TTL 值的数据包得不到响应时,并不能停止这一追踪过程,程序仍然会把 TTL 递增而发出下一个数据包。一直达到默认或用参数指定的追踪限制(maximum_hops)才结束追踪。
2 命令
traceroute [参数][ 主机]
-m
Max_ttl 设置用于输出探测信息包的最大存活时间(最大的跳跃数)。缺省值为 30 个跳跃(TCP 连接也使用相同的缺省值)。
-n
以数字方式而不以符号加数字的方式显示跳跃地址。该标志为在路径上找到的每个网关保存名称服务器的“地址到姓名”查询。
-p
Port 设置用于探测的基本 UDP 端口号。缺省值为 33434。traceroute 命令取决于目标主机的开放式 UDP 端口范围,base 至 base + nhops - 1。如果 UDP 端口不可用,那么该选项可以用于选择一个未曾使用的端口范围。
-q
Nqueries 指定 traceroute 命令在每个 Max_ttl 设定值处发出的探测数目。缺省值为三次探测。
-r
忽略正常的路由表,并直接发送探测信息包至已链接网络上的主机。如果指定的主机不在直接连接的网络上,那么返回一个错误。该选项可以用于通过 routed 守护程序路由表中未注册的接口向本地主机发出 ping命令。
-s SRC_Addr
以数字格式将下一 IP 地址用作输出探测信息包的源地址。在具有不止一个 IP 地址的主机上,可以使用 -s 标志强制将源地址转变成与发送探测包的接口的 IP 地址不同的地址。如果下一个 IP 地址不是机器接口地址之一,那么返回一个错误且不发送任何内容。
-t
TypeOfService 将探测信息包中的 TypeOfService 变量设置为 0 至 255 范围内的一个十进制整数。缺省值为 0。该标志可用于调查不同的服务类型是否产生了不同的路径。有关更多信息,请参阅Performance Tools Guide and Reference中的 TCP/IP 协议。有用的数值为 -t 16(低延迟)和 -t 8(高吞吐量)。
-v
接收除 TIME_EXCEEDED 和 PORT_UNREACHABLE 以外的信息包(详细输出)。
-w
WaitTime 设置等待探测响应的时间(以秒为单位)。 缺省值为 3 秒。
关于更多参数可以man traceroute 查看
通过使用 -q 标志,可以增加发送的探测数目。如果探测的回答来自不同的网关,那么命令会显示各个响应系统的地址。如果在 3 秒的超时时间间隔中没有来自探测的应答,那么会针对该探测显示出 *(星号)。
3 举例
上面是traceroute的原理 下面直接使用一个AWS 北加州的网关地址(54.176.64.1)作为说明:
traceroute 54.176.64.1
traceroute to 54.176.64.1 (54.176.64.1), 30 hops max, 60 byte packets
1 _gateway (172.28.31.253) 0.506 ms 0.706 ms 0.935 ms
2 172.28.253.248 (172.28.253.248) 4.188 ms 4.179 ms 4.159 ms
3 * * *
4 xxx.xxx.xxx.xxx 7.633 ms 8.530 ms 8.549 ms
5 202.98.114.89 (202.98.114.89) 27.187 ms 27.182 ms 27.155 ms
6 171.208.203.73 (171.208.203.73) 9.873 ms 171.208.203.77 (171.208.203.77) 7.593 ms 171.208.197.137 (171.208.197.137) 9.369 ms
7 202.97.36.221 (202.97.36.221) 41.338 ms 41.306 ms 41.265 ms
8 202.97.94.150 (202.97.94.150) 37.287 ms 37.283 ms 37.254 ms
9 202.97.38.166 (202.97.38.166) 118.693 ms 202.97.94.98 (202.97.94.98) 49.134 ms 202.97.94.118 (202.97.94.118) 37.517 ms
10 202.97.51.154 (202.97.51.154) 262.064 ms 265.948 ms 202.97.27.242 (202.97.27.242) 188.980 ms
11 202.97.50.78 (202.97.50.78) 202.017 ms 202.010 ms 201.127 ms
12 218.30.53.6 (218.30.53.6) 192.909 ms 191.283 ms 190.876 ms
1. 13 54.240.242.205 (54.240.242.205) 207.128 ms 54.240.242.213 (54.240.242.213) 265.886 ms 54.240.242.211 (54.240.242.211) 195.121 ms
14 54.240.242.107 (54.240.242.107) 204.093 ms 54.240.242.87 (54.240.242.87) 268.111 ms 54.240.242.107 (54.240.242.107) 204.026 ms
15 205.251.229.158 (205.251.229.158) 199.881 ms 72.21.222.17 (72.21.222.17) 267.152 ms 205.251.229.158 (205.251.229.158) 198.199 ms
16 * * *
17 * * *
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 ec2-54-176-64-1.us-west-1.compute.amazonaws.com (54.176.64.1) 192.958 ms 193.747 ms 191.026 ms
对结果进行说明:
traceroute to 54.176.64.1 (54.176.64.1), 30 hops max, 60 byte packets
第一行表示目标地址,最大30 个跳跃(-m设置),数据包大小为60byte。
后续每行的 序号就标识经过了的第几个路由,而每行第二列即为路由的ip地址(域名),第三列(ip地址后有三个时间)单位为三个数据包后,网关响应后返回的时间。
有时我们traceroute 一台主机时,会看到有一些行是以星号表示的(* * *)。如果在 3 秒的超时时间间隔中没有来自探测的应答,那么会针对该探测显示出 *(星号)。出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。
得到这些数据又什么好处呢,比如服务器在美国,我们就可以通过这个命令找到出中国出海线路,如果发现这条线路网络掉包较高可以切云服务器的地点。
这里有ip查询网站感觉查的还比较准:https://tool.lu/ip/
如:
这里有ip查询网站感觉查的还比较准:https://tool.lu/ip/
我们可以得到上结果中大致节点:
5 202.98.114.89 这个成都电信
7 202.97.36.221 广东广州
10 202.97.51.154 上海
12 218.30.53.6 美国
13 54.240.242.205 美国旧金山
得出网络访问的路径是成都-广州-上海-美国-美国旧金山
而有些时段的部分线路是很容易拥堵掉包的比如,成都联通到北京到日本线路。下午掉包率40%多非常恶心。
全球海底光缆图可参考:
https://blog.csdn.net/m0_37263637/article/details/85054485
4 参考链接
http://www.cnblogs.com/peida/archive/2013/03/07/2947326.html
https://zh.wikipedia.org/wiki/Traceroute