原文地址:https://www.wolfcstech.com/2017/04/13/Traceroute原理/
traceroute,现代 Linux 系统上的 tracepath,还有Windows 系统上的 tracert,均是用于同一目的的网络调试工具。它们用于显示数据包在IP网络中经过的路由器的IP地址。
原理
这些程序是利用IP数据包的存活时间(TTL)值来实现其功能的。当一台计算机发送IP数据包时,会为数据包设置存活时间(TTL)值。每当数据包经过一个路由器,其存活时间值就会减 1。当存活时间减到 0 时,路由器将不再转发数据包,而是发送一个 ICMP TTL 数据包给最初发出数据包的计算机。
Traceroute 程序首先向目标主机发出 TTL 为 1 的数据包,发送数据包的计算机与目标主机之间的路径中的第一个路由器,在转发数据包时将数据包的 TTL 减 1,它发现 TTL 被减为了 0,于是向最初发出数据包的计算机发送一个 ICMP TTL 数据包,Traceroute 程序以此获得了与目标主机之间的路径上的第一个路由器的IP地址。后面 traceroute 程序依次向目标主机发送 TTL 为 2、3、4 . . . 的数据包,逐个探测出来与目标主机之间的路径上每一个路由器的 IP 地址。
实现
默认条件下,traceroute 首先发出 TTL = 1 的UDP 数据包,第一个路由器将 TTL 减 1 得 0 后就不再继续转发此数据包,而是返回一个 ICMP 超时报文,traceroute 从超时报文中即可提取出数据包所经过的第一个网关的 IP 地址。然后又发送了一个 TTL = 2 的 UDP 数据包,由此可获得第二个网关的 IP 地址。依次递增 TTL 便获得了沿途所有网关的 IP 地址。
需要注意的是,并不是所有网关都会如实返回 ICMP 超时报文。处于安全性考虑,大多数防火墙以及启用了防火墙功能的路由器缺省配置为不返回各种 ICMP 报文,其余路由器或交换机也可能被管理员主动修改配置变为不返回 ICMP 报文。因此 Traceroute 程序不一定能拿到所有的沿途网关地址。所以,当某个 TTL 值的数据包得不到响应时,并不能停止这一追踪过程,程序仍然会把 TTL 递增而发出下一个数据包。这个过程将一直持续到数据包发送到目标主机,或者达到默认或用参数指定的追踪限制(maximum_hops)才结束追踪。
依据上述原理,利用了 UDP 数据包的 Traceroute 程序在数据包到达真正的目的主机时,就可能因为该主机没有提供 UDP 服务而简单将数据包抛弃,并不返回任何信息。为了解决这个问题,Traceroute 故意使用了一个大于 30000 的端口号,因 UDP 协议规定端口号必须小于 30000 ,所以目标主机收到数据包后唯一能做的事就是返回一个 “端口不可达” 的 ICMP 报文,于是主叫方就将端口不可达报文当作跟踪结束的标志。
Wireshark 抓包分析
我们通过 Wireshark 抓包来看一下这个过程。我们追踪从我们的 PC 机到 www.163.com
之间的网络路径。打开 Wireshark,以如图所示的选项开始抓包:
然后我们在命令行执行 traceroute
程序:
$ traceroute www.163.com
traceroute to www.163.com (183.131.124.101), 30 hops max, 60 byte packets
1 10.240.252.1 (10.240.252.1) 0.441 ms 0.530 ms 0.712 ms
2 10.247.0.1 (10.247.0.1) 0.459 ms 0.549 ms 0.739 ms
3 10.0.10.15 (10.0.10.15) 0.479 ms 0.481 ms 0.471 ms
4 * * *
5 10.163.4.53 (10.163.4.53) 1.092 ms 10.163.4.57 (10.163.4.57) 1.008 ms 10.163.4.53 (10.163.4.53) 1.005 ms
6 115.238.118.185 (115.238.118.185) 1.006 ms 115.238.118.177 (115.238.118.177) 1.112 ms 1.502 ms
7 115.238.120.85 (115.238.120.85) 1.769 ms 115.238.120.89 (115.238.120.89) 1.480 ms 115.238.120.85 (115.238.120.85) 1.918 ms
8 220.191.200.145 (220.191.200.145) 9.229 ms 220.191.200.101 (220.191.200.101) 9.074 ms 220.191.200.93 (220.191.200.93) 1.563 ms
9 61.175.73.130 (61.175.73.130) 7.294 ms * 61.175.73.146 (61.175.73.146) 7.810 ms
10 60.191.177.122 (60.191.177.122) 26.955 ms 115.231.144.94 (115.231.144.94) 25.918 ms 26.634 ms
11 * * *
12 183.131.124.101 (183.131.124.101) 8.381 ms 7.120 ms 8.036 ms
这个过程中我们总共抓到了 67 个数据包。