路由追踪是一个网络诊断工具,一般指的是Traceroute
。通过这个工具,可以轻松的查询数据包从本机到目标远程主机所经过的网络路程的网络诊断工具,对于识别网络瓶颈、定位网络故障点以及测量网络延迟有很大帮助。
其原理如下:
- 本机构造一个数据包,但是把数据包的头部的
ttl
字段设置为1,然后记录从发出数据包到接受数据包的时间,即为本机到该首个网关的延时。 - 之后继续构造数据包,每次构造的数据包都在上一个数据包
ttl
的数值+1,然后继续记录发出数据包到接受数据包的时间,即为该本机到对应网关的延时。直到到达目标主机。 - 抵达目标主机后,会在ICMP回应应答,表明数据包已成功抵达。(这个ICMP协议,就是使用
ping
命令时候的协议。ICMP协议同时也会在如目标主机在网络中不通达的时候返回错误信息,也有拥塞控制的作用)
【话外音-补充】:路由追踪不一定用的是ICMP协议,也可以用常见的TCP或者UDP协议,后文有提到。
在linux上,路由追踪的命令是:traceroute
,而在windows上则是tracert
。,由于我的电脑是macos,所以就以linux的命令为准。
首先,路由追踪的命令是这样的:
traceroute [-adDeFInrSvx] [-A as_server] [-f first_ttl] [-g gateway] [-i iface]
[-M first_ttl] [-m max_ttl] [-p port] [-P proto] [-q nqueries] [-s src_addr]
[-t tos] [-w waittime] [-z pausemsecs] host [packetlen]
我就直接贴出不同参数什么意思了:
-a
或--address-only
:只显示IP地址,不尝试解析主机名。-d
或--datagram-mode
:使用UDP数据报模式进行路由追踪,而不是默认的ICMP模式。-D
或--direct
:直接将数据包发送到目标,不使用任何网关。-e
或--extaddr
:使用外部地址作为源地址(仅在某些系统上可用)。-E
或--use-ethernet-tos
:使用以太网TOS字段而不是IP TOS字段。-F
或--first-hop
:指定第一个跃点的IP地址,用于绕过本地路由器。-i
或--interface
:指定从哪个网络接口发送数据包。-I
或--icmp
:使用ICMP echo请求数据包进行路由追踪。-M
或--mark
:设置数据包的标记字段。-m
或--maxttl
:设置最大TTL值,即路由追踪的最大跃点数。-n
或--numeric
:不解析主机名,只显示数字形式的IP地址。-p
或--port
:指定数据包使用的端口号。-P
或--protocol
:使用指定的协议类型(TCP、UDP等)。-q
或--probe-count
:发送的探测数据包数量。-r
或--random-source
:使用随机源端口。-s
或--source-address
:指定数据包的源IP地址。-t
或--tos
:设置数据包的服务类型(TOS)字段。-v
或--verbose
:增加输出详细程度。-w
或--wait
:设置等待每个回复的超时时间(单位:秒)。-x
或--exclude
:指定要避免的网关或主机列表。-A
或--as-server
:使用指定的AS服务器进行AS号查询。-f
或--first-ttl
:设置初始的TTL值。-g
或--gateway
:指定数据包要通过的特定网关。-z
或--pause
:在每个TTL值之间暂停的时间(单位:毫秒)。
其中,比较重要(至少是我觉得的)参数有这几个:-P
(自定义使用TCP协议还是UDP协议),-p
(指定端口)。其他的,也很重要,但是在mc服务器的连接诊断中用途不是很大。
特别说明一下,如果使用-P
指定协议的情况下,如果直接执行很有可能出现报错:pcap_activate() failed:
,这很有可能(不保证百分百)是由于权限不足,可以切换到root
用户或者以管理员执行。
admin@Mac-mini-2023-xiaozhiyuqwq ~ % traceroute -p 46001 -P tcp mc.yeming0019.top
traceroute: pcap_activate() failed:
admin@Mac-mini-2023-xiaozhiyuqwq ~ % sudo traceroute -p 46001 -P tcp mc.yeming0019.top
Password:
traceroute to f6990b00-4dec-dd0d-dcd6-c9c535805bfd.openfrp.cc (43.248.137.35), 64 hops max, 40 byte packets
我写这篇博客的意义,在于遇到了,沉淀一下,后续遇到可以翻出来。
今天玩服务器,感觉到非常卡,服务器里的延迟高达1599ms,所以打算看一下什么地方出问题了,对症下药。比如说是家里内网环境下的问题,那么最简单的,重启下路由器即可。
那所以我就进行了一下路由诊断:
admin@Mac-mini-2023-xiaozhiyuqwq ~ % traceroute -p 46001 mc.yeming0019.top
traceroute to f6990b00-4dec-dd0d-dcd6-c9c535805bfd.openfrp.cc (43.248.137.35), 64 hops max, 40 byte packets
1 192.168.1.1 (192.168.1.1) 246.102 ms 334.470 ms 381.136 ms
2 * * *
3 * 221.178.147.141 (221.178.147.141) 177.556 ms *
4 205.22.207.183.static.js.chinamobile.com (183.207.22.205) 473.286 ms
49.67.207.183.static.js.chinamobile.com (183.207.67.49) 471.738 ms
209.22.207.183.static.js.chinamobile.com (183.207.22.209) 463.619 ms
5 112.4.15.82 (112.4.15.82) 494.163 ms
130.64.207.183.static.js.chinamobile.com (183.207.64.130) 66.615 ms
112.4.15.82 (112.4.15.82) 10.128 ms
6 * * *
7 * * *
8 * * *
9 * * *
10 * * *
11 * * *
12 * * *
13 43.248.137.35 (43.248.137.35) 2995.878 ms 3693.255 ms 129.829 ms
这里可以看到,从我本机出发到第一个网关(也就是192.168.1.1
)延迟异常的高,平均能到300多ms,这是一个很不正常的数值,那很简单的方法:重启路由器。(应该可以肯定的是路由器的问题,我的本机到路由器之间是物理连接,不会存在无线造成的延迟和丢包)
之后的2、6-12转跳均无数据,这里有可能是直接超时了,因为我发出的命令并没有设置-w
(也就是超时时长),当然不排除是网关设置了不回应ICMP消息。
在第4、5次转跳之间,可以看到配置了多个ip地址,这是运营商的管理范围了,这里应该是冗余,以防止出现某条链路拥塞。
但是在13跳,也就是抵达远程服务器(IP地址43.248.137.35
),中,出现了129.829 ms、2995.878 ms和3693.255 ms,加上之前的多个节点未取得有效数据,基本上可以断定是运营商的网络中出现网络波动导致的,当然我也有可以优化的空间:尤其是抵达内网网关(192.168.1.1
),比如重启路由器。
后续:
4 213.22.207.183.static.js.chinamobile.com (183.207.22.213) 8.814 ms
205.22.207.183.static.js.chinamobile.com (183.207.22.205) 10.747 ms
49.66.207.183.static.js.chinamobile.com (183.207.66.49) 37.253 ms
5 112.4.15.90 (112.4.15.90) 10.027 ms
112.4.25.82 (112.4.25.82) 14.239 ms 10.300 ms
重新进行诊断,发现部分转跳仍然没有数据,那么很有可能是关闭了应答(为了安全),但是可以看到4、5两次的延迟明显减少,也就表示大概率是运营商的线路出现临时性的拥堵。
:-)