linux mtr命令

简介:mtr(My TraceRoute)是一个结合了traceroute和ping功能的网络诊断工具。它可以实时显示数据包在到达目标主机过程中经过的所有路由节点,并提供延迟、丢包率等统计信息。
mtr的主要特点
  • 实时监控:持续发送数据包并实时更新统计信息
  • 结合功能:融合了ping和traceroute的功能
  • 详细统计:显示每个节点的延迟、丢包率等
  • 交互式界面:支持命令行交互操作
  • 数据可视化:直观显示网络路径和质量
  • 多种模式:支持报告模式、交互模式
  • 协议支持:支持ICMP、TCP、UDP等协议
  • IPv6支持:完全支持IPv6网络诊断
  • 数据导出:支持CSV、XML、JSON等格式导出
  • 跨平台:支持Linux、macOS、Windows等系统

语法格式

mtr [选项] 主机名或IP地址

常用选项

选项 说明
-4 只使用IPv4
-6 只使用IPv6
-u 使用UDP数据包(默认ICMP)
-T 使用TCP数据包(SYN包)
-P 端口 设置TCP/UDP端口号
-i 秒数 设置发送数据包的间隔时间(默认1秒)
-c 次数 设置发送数据包的数量后退出
-s 大小 设置数据包大小(字节)
-r 报告模式(输出统计报告后退出)
-w 宽报告模式(显示主机名)
-C 显示ASN(自治系统号)信息
-l 使用原始IP格式输出
-z 显示统计信息
-b 同时显示IP和主机名
-n 不进行DNS解析(显示IP地址)
-a IP地址 设置源IP地址
-f TTL 设置起始TTL值(默认1)
-m TTL 设置最大TTL值(默认30)
-o 字段 指定输出字段(LRSD BAWV等)
-h 显示帮助信息
-v 显示版本信息

输出字段说明

mtr输出字段详解
字段 说明 正常范围
Loss% 丢包率百分比 0-1%(优秀)
1-5%(良好)
>5%(需关注)
Snt 已发送的数据包数量 -
Last 最近一个数据包的延迟(ms) <50ms(优秀)
50-100ms(良好)
>100ms(一般)
Avg 平均延迟(ms) <50ms(优秀)
50-100ms(良好)
>100ms(一般)
Best 最佳延迟(ms) 越低越好
Wrst 最差延迟(ms) 波动越小越好
StDev 延迟标准差(ms) <10ms(稳定)
10-30ms(一般)
>30ms(不稳定)

使用示例

示例1:基本使用 - 交互式模式
# 交互式模式(默认)
mtr google.com

# 指定使用IPv4
mtr -4 8.8.8.8

# 指定使用IPv6
mtr -6 google.com
mtr交互式界面

图:mtr交互式界面示例

示例2:报告模式
# 发送10个数据包后生成报告
mtr -r -c 10 google.com

# 宽报告模式(显示主机名)
mtr -w -c 10 google.com

# 报告模式,不进行DNS解析
mtr -r -n -c 10 8.8.8.8

# 报告模式,显示ASN信息
mtr -r -C -c 10 google.com
# 报告模式输出示例:
Start: 2024-03-15T10:30:00+0800
HOST: localhost                   Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- 192.168.1.1               0.0%    10    2.1   2.3   1.9   3.2   0.4
  2.|-- 10.0.0.1                  0.0%    10    5.6   6.2   5.1   8.9   1.2
  3.|-- 203.0.113.1               0.0%    10   12.3  13.1  11.8  15.6   1.1
  4.|-- 72.14.238.1               0.0%    10   25.6  26.3  24.9  28.7   1.3
  5.|-- 216.239.48.1              0.0%    10   30.1  31.2  29.8  33.5   1.2
  6.|-- google.com                0.0%    10   32.5  33.1  31.9  35.6   1.1
示例3:调整数据包参数
# 使用TCP SYN包(模拟HTTP连接)
mtr -T google.com

# 使用TCP并指定端口443(HTTPS)
mtr -T -P 443 google.com

# 使用UDP数据包
mtr -u 8.8.8.8

# 调整数据包大小(默认60字节)
mtr -s 100 google.com

# 调整发送间隔(默认1秒)
mtr -i 2 google.com

# 调整起始TTL和最大TTL
mtr -f 3 -m 20 google.com
示例4:输出格式控制
# 不进行DNS解析(只显示IP)
mtr -n google.com

# 同时显示IP和主机名
mtr -b google.com

# 指定输出字段(L=丢包率,R=接收顺序,S=发送数量,D=延迟)
mtr -o "LRSD" google.com

# 使用原始IP格式输出
mtr -l google.com

# CSV格式输出(便于脚本处理)
mtr --csv -c 10 google.com > report.csv

# XML格式输出
mtr --xml -c 10 google.com > report.xml
示例5:高级诊断技巧
# 对比不同协议的表现
mtr -T -c 10 google.com  # TCP
mtr -u -c 10 google.com  # UDP
mtr -c 10 google.com     # ICMP

# 诊断特定端口的连通性
mtr -T -P 443 google.com  # HTTPS端口
mtr -T -P 80 google.com   # HTTP端口
mtr -u -P 53 8.8.8.8     # DNS端口

# 从特定源IP发送(多网卡环境)
mtr -a 192.168.1.100 google.com

# 长时间监控(100个数据包)
mtr -c 100 -i 2 google.com | tee mtr_log.txt

实战应用场景

场景1:服务器网络问题诊断
诊断服务器网络连通性问题:
# 诊断到数据库服务器的连接问题
mtr -T -P 3306 db-server.example.com

# 诊断到Web服务器的连接问题
mtr -T -P 80 web-server.example.com

# 长时间监控网络质量
mtr -c 100 -i 5 target-server.example.com > network_quality.log

# 分析日志,找出问题节点
grep -E " [0-9]+\.[0-9]+%|  [0-9]+ms " network_quality.log
自动化诊断脚本:
#!/bin/bash
# network_diagnosis.sh

TARGETS=("google.com" "8.8.8.8" "github.com")
LOG_FILE="/var/log/network_diagnosis_$(date +%Y%m%d).log"

echo "=== 网络诊断报告 $(date) ===" >> $LOG_FILE

for target in "${TARGETS[@]}"; do
    echo "诊断目标: $target" >> $LOG_FILE
    mtr -r -c 10 "$target" >> $LOG_FILE
    echo "---" >> $LOG_FILE
done

# 检查是否有高丢包率
if grep -q " [5-9][0-9]\.[0-9]+\%\|[1-9][0-9][0-9]\.[0-9]+\%" $LOG_FILE; then
    echo "警告:检测到高丢包率!" >> $LOG_FILE
    mail -s "网络质量警报" admin@example.com < $LOG_FILE
fi
场景2:ISP网络质量监控
监控互联网服务提供商(ISP)的网络质量:
# 监控到多个目标的网络路径
TARGETS=(
    "8.8.8.8"       # Google DNS
    "1.1.1.1"       # Cloudflare DNS
    "github.com"    # GitHub
    "aws.amazon.com" # AWS
)

for target in "${TARGETS[@]}"; do
    echo "测试目标: $target"
    mtr -r -c 20 "$target" | tail -10
    echo ""
done

# 定期监控脚本
#!/bin/bash
while true; do
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    echo "=== $TIMESTAMP ===" >> /var/log/isp_monitor.log
    mtr -r -c 10 8.8.8.8 >> /var/log/isp_monitor.log
    sleep 300  # 每5分钟执行一次
done
场景3:视频会议/游戏延迟优化
# 测试到游戏服务器的延迟
mtr -c 50 -i 0.5 game-server.example.com

# 测试到视频会议服务器的网络质量
mtr -c 30 -i 1 zoom.us

# 重点关注的指标:
# 1. 平均延迟(Avg):影响实时性
# 2. 延迟波动(StDev):影响稳定性
# 3. 丢包率(Loss%):影响音视频质量

# 优化建议脚本:
#!/bin/bash
SERVER="your-game-server.com"
REPORT=$(mtr -r -c 20 "$SERVER")

AVG_LATENCY=$(echo "$REPORT" | tail -1 | awk '{print $7}')
LOSS_PERCENT=$(echo "$REPORT" | tail -1 | awk '{print $3}')
STDEV=$(echo "$REPORT" | tail -1 | awk '{print $9}')

echo "网络质量分析:"
echo "平均延迟: $AVG_LATENCY ms"
echo "丢包率: $LOSS_PERCENT"
echo "延迟波动: $STDEV ms"

if (( $(echo "$LOSS_PERCENT > 1" | bc -l) )); then
    echo "建议:存在丢包问题,请检查网络连接"
elif (( $(echo "$AVG_LATENCY > 100" | bc -l) )); then
    echo "建议:延迟较高,可能影响游戏体验"
elif (( $(echo "$STDEV > 30" | bc -l) )); then
    echo "建议:网络不稳定,延迟波动较大"
else
    echo "网络质量良好"
fi
mtr的优势
  • 实时更新,无需等待完成
  • 提供详细的统计信息
  • 结合了ping和traceroute功能
  • 支持多种协议和输出格式
  • 交互式界面便于操作
  • 易于发现网络瓶颈
注意事项
  • 某些网络设备可能过滤ICMP包
  • 需要root权限使用TCP/UDP模式
  • DNS解析可能影响结果准确性
  • 不同协议的结果可能不同
  • 长时间运行可能产生大量流量
  • 某些企业网络可能限制mtr使用
  • 结果可能因网络拥塞而变化
网络问题诊断流程
  1. 发现问题:网络连接慢、丢包、延迟高
  2. 本地测试ping -c 10 目标 确认问题
  3. 路径追踪mtr 目标 查看完整路径
  4. 问题定位:找出具体问题节点(高丢包、高延迟)
  5. 协议测试:使用不同协议(ICMP/TCP/UDP)测试
  6. 长期监控mtr -c 100 -i 2 目标 收集数据
  7. 分析报告:生成报告并分析问题原因
  8. 联系ISP:提供详细报告给网络服务商
自动化诊断报告:
#!/bin/bash
# complete_network_diagnosis.sh

TARGET=$1
REPORT_FILE="/tmp/network_report_$(date +%Y%m%d_%H%M%S).txt"

echo "网络诊断报告" > $REPORT_FILE
echo "目标: $TARGET" >> $REPORT_FILE
echo "时间: $(date)" >> $REPORT_FILE
echo "" >> $REPORT_FILE

echo "1. 基本ping测试:" >> $REPORT_FILE
ping -c 10 "$TARGET" >> $REPORT_FILE 2>&1
echo "" >> $REPORT_FILE

echo "2. ICMP路径分析:" >> $REPORT_FILE
mtr -r -c 10 "$TARGET" >> $REPORT_FILE
echo "" >> $REPORT_FILE

echo "3. TCP路径分析(端口80):" >> $REPORT_FILE
sudo mtr -T -P 80 -r -c 10 "$TARGET" >> $REPORT_FILE
echo "" >> $REPORT_FILE

echo "报告已保存到: $REPORT_FILE"
cat $REPORT_FILE
常见问题解答
Q: 如何安装mtr?
# Ubuntu/Debian
sudo apt install mtr

# RHEL/CentOS
sudo yum install mtr

# Fedora
sudo dnf install mtr

# macOS (Homebrew)
brew install mtr

# 从源码编译
git clone https://github.com/traviscross/mtr.git
cd mtr
./bootstrap.sh
./configure
make
sudo make install
Q: mtr和traceroute有什么区别?

A: 主要区别:

功能 mtr traceroute
工作模式 实时持续更新 单次运行后结束
统计信息 提供详细的延迟、丢包统计 只显示单次延迟
交互性 支持交互式操作 无交互功能
数据包类型 支持ICMP、TCP、UDP 通常只支持一种协议
输出格式 支持多种格式(CSV、XML等) 通常只有文本格式
Q: 为什么某些节点显示"???"?

A: 可能有以下原因:

  • 该节点配置了防火墙,丢弃了探测包
  • 网络设备不支持响应特定类型的探测包
  • 网络拥塞导致超时
  • 设备配置为不显示TTL超时的响应
Q: 如何判断网络问题的责任方?

A: 使用mtr可以帮助定位问题:

  1. 如果问题出现在前几跳,可能是本地网络问题
  2. 如果问题出现在中间节点,可能是ISP网络问题
  3. 如果问题出现在最后几跳,可能是目标服务器问题
  4. 如果全程都有问题,可能是本地网络或ISP问题
# 找出高丢包率的节点
mtr -r -c 20 google.com | awk '$3 > 5 {print "节点", $2, "丢包率:", $3"%"}'
相关工具对比
工具 主要功能 输出形式 最佳用途
mtr 实时路径追踪和统计 交互式/报告 网络质量深度分析
traceroute 显示数据包路径 静态输出 快速路径查看
ping 测试连通性和延迟 统计输出 基本连通性测试
tracepath 类似traceroute,无需root 静态输出 快速路径追踪
tcptraceroute 使用TCP协议追踪 静态输出 绕过ICMP限制
pathping Windows的类似工具 统计输出 Windows网络诊断