结合了 traceroute 和 ping 功能的强大网络诊断工具。
MTR(My Traceroute)是一个跨平台的命令行网络诊断工具。它的核心优势在于能够持续地向路径上的每个节点发送数据包,并动态地统计出每个节点的响应情况(如丢包率、延迟),而不仅仅是像 traceroute 那样只显示一次性的路径。
这使得它非常适合用于诊断网络间歇性丢包、高延迟或路由环路等问题。
mtr 与其他工具对比:
| 工具 | 实时更新 | 双向诊断 | 丢包统计 | 延迟统计 | 交互式界面 |
|---|---|---|---|---|---|
| ping | ❌ | ❌ | ✔️ | ✔️ | ❌ |
| traceroute | ❌ | ❌ | ❌ | ✔️ | ❌ |
| mtr | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
# Debian/Ubuntu 系统
sudo apt-get install mtr
# CentOS/RHEL 系统
sudo yum install mtr
# Fedora 系统
sudo dnf install mtr
# Arch Linux 系统
sudo pacman -S mtr
mtr [选项] [目标ip/域名]
| 选项 | 全称 | 说明 |
|---|---|---|
-c <次数> |
--report-cycles |
设置发送数据包的次数,然后自动退出并生成报告。在做自动化脚本或需要定量测试时非常有用。 |
-n |
--no-dns |
不进行 DNS 反向解析,直接显示 IP 地址。可以加快输出速度。 |
-r |
--report |
以报告模式运行。通常与 -c 联用,生成一个统计报告,而不是交互式界面。 |
-s <大小> |
--psize |
设置发送的数据包大小(单位:字节)。用于模拟不同大小的数据包。 |
-i <秒> |
--interval |
设置每次发送数据包的间隔时间(默认是1秒)。 |
-4 |
强制使用 IPv4。 | |
-6 |
强制使用 IPv6。 | |
--tcp |
使用 TCP 协议进行探测(默认是 ICMP)。 | |
--udp |
使用 UDP 协议进行探测(默认是 ICMP)。 | |
-p |
--port |
当使用 --tcp 或 --udp 时,指定目标端口。 |
-o <字段> |
--order |
自定义输出字段的顺序。例如 -o "LSDR NBAW V"。 |
mtr google.com
运行后,会进入一个实时更新的交互式界面。按 q 键退出,按 ? 键可以查看帮助。
向 8.8.8.8 发送 10 个数据包,然后生成一个最终报告,不进行 DNS 解析。
mtr -r -c 10 -n 8.8.8.8
输出示例:
Start: 2024-05-20T10:00:00+0800
HOST: localhost Loss% Snt Last Avg Best Wrst StDev
1.|-- 192.168.1.1 0.0% 10 2.1 2.2 1.9 3.0 0.3
2.|-- 10.10.10.1 0.0% 10 10.5 11.2 9.8 15.0 1.5
3.|-- 211.138.125.129 10.0% 10 15.3 16.1 14.5 20.1 1.8
4.|-- 221.183.55.49 0.0% 10 18.2 19.1 17.5 25.0 2.1
5.|-- 8.8.8.8 0.0% 10 20.1 21.0 19.5 28.3 2.5
在交互式界面或报告中,你会看到类似下面的列:
Host: 节点的主机名或 IP 地址。
Loss%: 该节点的丢包率。这是 MTR 最有价值的信息之一。
Snt: 已发送的数据包数量。
Last: 最近一个数据包的延迟(毫秒)。
Avg: 所有数据包的平均延迟。
Best: 所有数据包中的最小延迟。
Wrst: 所有数据包中的最大延迟。
StDev: 延迟的标准差。值越大,说明网络延迟越不稳定。
从这个报告可以清晰地看到,在第 3 跳 211.138.125.129 处出现了 10% 的丢包。
如果看到星号(*)而不是IP地址:
有些网络会过滤 ICMP 包,但允许 TCP 流量。此时可以用 TCP 模式来探测到特定服务(如 Web)的路径。
mtr --tcp -p 80 -n -r -c 10 example.com
发送 5 个大小为 1500 字节的数据包,每 2 秒发送一个。
mtr -r -c 5 -s 1500 -i 2 google.com