文章目录
- 1.命令简介
- 2.命令格式
- 3.选项说明
- 4.常用示例
- 5.traceroute 工作原理
- 参考文献
1.命令简介
traceroute 用于追踪数据包在网络上传输时的全部路径。
通过 traceroute 我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。
traceroute 通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备 traceroute 要测 3 次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其 IP 地址。
2.命令格式
代码语言:javascript复制traceroute [-46dFITUnreAV] [-f first_ttl] [-g gate,...]
[-i device] [-m max_ttl] [-p port] [-s src_addr]
[-q nqueries] [-N squeries] [-t tos]
[-l flow_label] [-w waittimes] [-z sendwait] [-UL] [-D]
[-P proto] [--sport=port] [-M method] [-O mod_options]
[--mtu] [--back]
host [packet_len]
traceroute6 [options]
traceroute6 等价于 traceroute -6。
3.选项说明
代码语言:javascript复制-d, --debug
使用 Socket 层级的排错功能。
-f, --first=<first_ttl>
设置第一个检测数据包的存活数值 TTL 的大小。
-F, --dont-fragment
设置勿离断位。
-g, --gateway=<gateway>
设置来源路由网关,最多可设置 8 个。
-i, --interface=<interface>
使用指定的网络界面送出数据包。
-I, --icmp
使用 ICMP 回应取代 UDP 资料信息。
-m, --max-hops=<max_ttl>
设置检测数据包的最大存活数值 TTL 的大小。
-n
直接使用 IP 地址而非主机名称。
-p, --port=<port>
设置 UDP 传输协议的通信端口。
-r
忽略普通的 Routing Table,直接将数据包送到远端主机上。
-s,--source=<source_addr>
设置本地主机送出数据包的 IP 地址。
-t, --tos=<tos>
设置检测数据包的 TOS 数值。
-v
详细显示指令的执行过程
-w, --wait=max[,here,near]
设置等待远端主机回报的时间。
4.常用示例
(1)追踪本地数据包到百度的传输路径。
代码语言:javascript复制traceroute www.baidu.com
traceroute to www.baidu.com (220.181.38.150), 30 hops max, 60 byte packets
1 11.78.8.225 (11.78.8.225) 2.433 ms 2.634 ms 2.811 ms
2 11.78.56.206 (11.78.56.206) 1.370 ms 11.78.55.202 (11.78.55.202) 4.412 ms 4.513 ms
3 10.162.71.253 (10.162.71.253) 1.478 ms 1.611 ms 10.162.71.173 (10.162.71.173) 4.687 ms
4 10.196.7.57 (10.196.7.57) 0.704 ms 10.196.7.61 (10.196.7.61) 4.564 ms 10.196.7.57 (10.196.7.57) 0.727 ms
5 10.200.17.34 (10.200.17.34) 1.138 ms 10.200.17.22 (10.200.17.22) 0.996 ms 10.200.17.30 (10.200.17.30) 0.918 ms
6 121.59.124.17 (121.59.124.17) 5.637 ms 5.936 ms 121.59.124.5 (121.59.124.5) 6.480 ms
7 69.194.166.13 (69.194.166.13) 10.959 ms 69.194.165.245 (69.194.165.245) 5.319 ms 5.311 ms
8 69.194.186.9 (69.194.186.9) 39.255 ms 39.573 ms 69.194.186.85 (69.194.186.85) 39.522 ms
9 203.22.178.98 (203.22.178.98) 74.293 ms 203.22.178.102 (203.22.178.102) 74.782 ms 203.22.178.98 (203.22.178.98) 75.312 ms
10 59.43.182.189 (59.43.182.189) 77.611 ms 59.43.249.54 (59.43.249.54) 74.102 ms 59.43.249.38 (59.43.249.38) 73.877 ms
11 * * *
12 * * *
13 * * *
...
(2)设置跳数。
代码语言:javascript复制traceroute -m 7 www.baidu.com
traceroute to www.baidu.com (220.181.38.149), 7 hops max, 60 byte packets
1 11.78.8.225 (11.78.8.225) 6.552 ms 6.736 ms 6.917 ms
2 11.78.56.74 (11.78.56.74) 6.177 ms 11.78.56.204 (11.78.56.204) 4.516 ms 11.78.55.204 (11.78.55.204) 14.675 ms
3 10.162.72.21 (10.162.72.21) 5.630 ms 5.541 ms *
4 10.196.7.69 (10.196.7.69) 0.587 ms 10.196.7.61 (10.196.7.61) 6.825 ms 6.858 ms
5 10.200.17.34 (10.200.17.34) 1.160 ms 10.200.17.30 (10.200.17.30) 1.054 ms 10.200.17.22 (10.200.17.22) 1.126 ms
6 121.59.124.5 (121.59.124.5) 6.153 ms 6.077 ms 6.078 ms
7 * * 69.194.166.21 (69.194.166.21) 6.055 ms
(3)显示 IP 地址,不查主机名。
代码语言:javascript复制traceroute -n www.baidu.com
traceroute to www.baidu.com (220.181.38.149), 30 hops max, 60 byte packets
1 11.78.8.225 25.196 ms 25.482 ms 25.652 ms
2 11.78.56.72 23.195 ms 11.78.55.72 4.692 ms 11.78.55.76 4.981 ms
3 * * *
4 10.196.7.65 0.662 ms 10.196.7.69 5.507 ms 10.196.7.61 0.730 ms
5 10.200.17.26 4.861 ms 4.858 ms 0.851 ms
6 121.59.124.5 6.188 ms 121.59.124.17 5.838 ms 121.59.124.5 6.422 ms
7 69.194.165.177 5.373 ms * 69.194.165.209 5.997 ms
8 69.194.186.85 39.251 ms 69.194.165.61 44.690 ms 69.194.166.121 42.017 ms
9 203.22.178.102 76.251 ms 203.22.178.98 74.774 ms 74.547 ms
10 59.43.249.50 75.237 ms 59.43.182.93 76.105 ms 59.43.249.54 73.602 ms
11 * * *
12 * * *
13 * * *
...
(4)设置探测包的个数。
代码语言:javascript复制traceroute -q 4 www.baidu.com
1 11.78.8.225 (11.78.8.225) 66.193 ms 66.368 ms 67.125 ms 67.400 ms
2 11.78.55.78 (11.78.55.78) 4.961 ms 11.78.56.200 (11.78.56.200) 7.657 ms 11.78.55.76 (11.78.55.76) 5.052 ms 11.78.55.204 (11.78.55.204) 6.132 ms
3 10.162.72.21 (10.162.72.21) 4.026 ms * 10.162.71.225 (10.162.71.225) 4.193 ms 10.162.72.21 (10.162.72.21) 3.845 ms
...
(5)设置等待响应时间。
代码语言:javascript复制traceroute -w 3 www.baidu.com
traceroute to www.baidu.com (220.181.38.150), 30 hops max, 60 byte packets
1 11.78.8.225 (11.78.8.225) 3.784 ms 4.114 ms 4.279 ms
2 11.78.56.76 (11.78.56.76) 4.073 ms 11.78.55.72 (11.78.55.72) 103.810 ms 11.78.55.76 (11.78.55.76) 103.894 ms
3 10.162.71.129 (10.162.71.129) 4.708 ms 10.162.71.173 (10.162.71.173) 4.781 ms *
...
(6)绕过正常的路由表,直接发送到网络相连的主机。
代码语言:javascript复制traceroute -r www.baidu.com
traceroute to www.baidu.com (220.181.38.149), 30 hops max, 60 byte packets
connect: Network is unreachable
(7)探测包使用的基本UDP端口设置 10086。
代码语言:javascript复制traceroute -p 10086 www.baidu.com
traceroute to www.baidu.com (220.181.38.149), 30 hops max, 60 byte packets
1 11.78.8.225 (11.78.8.225) 3.447 ms 3.691 ms 3.993 ms
2 11.78.55.202 (11.78.55.202) 4.210 ms 11.78.56.202 (11.78.56.202) 6.387 ms 11.78.56.200 (11.78.56.200) 6.675 ms
3 * * *
4 10.196.7.65 (10.196.7.65) 0.664 ms 10.196.7.57 (10.196.7.57) 0.703 ms 10.196.7.65 (10.196.7.65) 0.658 ms
...
5.traceroute 工作原理
traceroute 最简单的基本用法是:traceroute hostname。
traceroute 的设计是利用 ICMP 及 IP header 的 TTL(Time To Live)栏位(field)。首先,traceroute 送出一个 TTL 是 1 的IP datagram(其实,每次送出的为 3 个 40 字节的包,包括源地址,目的地址和包发出的时间标签)到目的地,当路径上的第一个路由器(router)收到这个 datagram 时,它将 TTL 减 1。此时,TTL 变为 0 了,所以该路由器会将此 datagram 丢掉,并送回一个「ICMP time exceeded」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),traceroute 收到这个消息后,便知道这个路由器存在于这个路径上,接着 traceroute 再送出另一个 TTL 是 2 的datagram,发现第 2 个路由器… traceroute 每次将送出的datagram的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个datagram 抵达目的地。当datagram到达目的地后,该主机并不会送回 ICMP time exceeded 消息,因为它已是目的地了,那么 traceroute 如何得知目的地到达了呢?
traceroute 在送出 UDP datagrams 到目的地时,它所选择送达的 port number 是一个一般应用程序都不会用的号码(30000 以上),所以当此 UDP datagram 到达目的地后该主机会送回一个「ICMP port unreachable」的消息,而当 traceroute 收到这个消息时,便知道目的地已经到达了。所以 traceroute 在 Server 端也是没有所谓的 Daemon 程序。
traceroute 提取发 ICMP TTL 到期消息设备的IP地址并作域名解析。每次 traceroute 都打印出一系列数据,包括所经过的路由设备的域名及 IP 地址,三个包每次来回所花时间。
参考文献
tracetroute(8) - Linux manual page - man7.org