traceroute命令

traceroute命令

  traceroute是Trace Route的缩写,即追踪路由。
  traceroute命令用来标识一个数据包从源到目标经过的路径(经过的路由)。traceroute命令在检测网络问题上是一个很重要的工具,因为它可以定位网络连接问题。traceroute命令最重要的应用场景是,当数据包在网络上传播过程中丢失时,用来确定是哪个节点宕机了。也可以用traceroute命令来分析数据包在哪个节点上传播速度慢,进而进行分析和优化。
  traceroute命令的工作原理:traceroute命令通过发送递增的TTL来检测数据包流经的路由。TTL是Time To Live的缩写。TTL是IP头部的一个域,此域用来避免数据包处于一个无限循环的传递过程。当一个路由器转发一个数据包前,会将数据包中的TTL减一。当一个数据包的TTL为0时,此数据包就会被丢弃。traceroute命令首先会发送一个TTL为1的数据包,此数据包到达第一个路由器时,路由器会对TTL减一,发现TTL为0,就会给源主机返回一个数据包表示数据包未达到目标,这样traceroute命令就探测到了第一个路由器。然后traceroute会发送一个TTL为2的数据包,以探测第二路由器。以此类推,就可以探测出数据包经过的所有路由器。当数据包最终达到目标主机时,因为指定的端口号很大,所以目标主机会返回一个端口失败的数据包,traceroute命令接收到此数据包就知道数据包已经到达目标主机了,探测可以结束了。
  traceroute命令的对象可以是IP地址,也可以是主机名/域名。例如:

[root@localhost ~]# traceroute www.fmttr.com
traceroute to www.fmttr.com (39.105.39.75), 30 hops max, 60 byte packets
1 * * *
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
7 * * *
8 * * *
9 * * *
10 * * *
11 * * *
12 * * *
13 * * *
14 * * *
15 * * *
16 * * *
17 * * *
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
[root@localhost ~]#

  上述traceroute命令输出都是星号,没有达到我们希望跟踪数据包的目的,原因是traceroute命令默认使用UDP协议来探测包,而很多路由器都禁用了traceroute命令的UDP包,即不会处理traceroute命令发送的UDP包,导致无法探测出路径中的路由器。可以使用选项-I来强制traceroute命令使用ICMP协议,例如:

[root@localhost ~]# traceroute -I www.fmttr.com
traceroute to www.fmttr.com (39.105.39.75), 30 hops max, 60 byte packets
1 10.148.16.1 (10.148.16.1) 84.705 ms 84.702 ms *
2 * * *
3 * * *
4 * * *
5 221.183.47.149 (221.183.47.149) 2.832 ms 2.895 ms 3.076 ms
6 221.183.37.157 (221.183.37.157) 23.787 ms 22.011 ms 29.544 ms
7 * * *
8 39.156.0.53 (39.156.0.53) 21.122 ms * *
9 39.156.1.221 (39.156.1.221) 53.703 ms 53.698 ms 53.696 ms
10 123.56.34.14 (123.56.34.14) 26.309 ms 26.314 ms 26.299 ms
11 116.251.104.186 (116.251.104.186) 26.265 ms 26.210 ms 26.257 ms
12 * * *
13 * * *
14 39.105.39.75 (39.105.39.75) 23.841 ms 23.805 ms 23.795 ms
[root@localhost ~]#

  从上面可以看出,数据包从localhost到目标主机www.fmttr.com经过13个路由,有些路由无法探测出其IP地址。