mping / mping6 使用指南

nettools · 多目标 ICMP Ping 工具(IPv4 / IPv6)

Usage Guide — 涵盖原理、安装、命令行参数、CIDR 批量探测及典型使用场景。

← 返回首页

目录

1. 概述

最新发布 mping / mping6 是百度系统部物理网络黑盒监控团队开发的多目标 ICMP Ping 工具。支持 CIDR 展开批量探测、DNS 解析、高速率发送、硬件时间戳,适合大规模网络质量巡检和故障排查。mping 用于 IPv4,mping6 用于 IPv6。

核心特性:

多目标批量探测

  • CIDR 网段自动展开
  • DNS 主机名解析
  • 逗号分隔多 IP
  • --max-targets 防止过载

硬件时间戳

  • 默认启用 SO_TIMESTAMPING
  • 纳秒级延迟精度
  • Linux 内核支持
  • macOS 回退到软件时间戳

IPv4 + IPv6 双栈

  • mping — ICMP Echo (IPv4)
  • mping6 — ICMPv6 Echo (IPv6)
  • 统一参数和输出格式
  • 独立二进制,按需使用

2. 工作原理

mping 使用原始套接字(raw socket)构造 ICMP Echo Request 报文,发送到目标 IP,并接收 ICMP Echo Reply。与系统自带的 ping 不同,mping 通过 goscapy 库直接构造报文,支持自定义 TOS、TTL 和载荷大小。

# ICMP Echo 流程
mping                          Target
  |-- Echo Request (seq=N) ---->|    # 发送 ICMP Echo Request
  |<-- Echo Reply (seq=N) ------|    # 收到 Echo Reply → 计算延迟

# 超时
mping                          Target
  |-- Echo Request (seq=N) ---->|    # 发送 ICMP Echo Request
  |   (无响应)                  |    # 超时 → 计为丢包

mping6 使用 ICMPv6 Echo Request / Reply,通过原始 IPv6 套接字发送报文。内核自动计算 ICMPv6 校验和(包含 IPv6 伪首部)。

Note:mping 使用 raw socket 构造 ICMP 报文,需要 sudo 运行。macOS 和 Linux 均支持,但硬件时间戳(SO_TIMESTAMPING)仅 Linux 内核支持。

3. 使用场景

mping / mping6 适用于以下网络质量巡检场景:

机房批量连通性检查

  • CIDR 网段一次性探测整网段
  • 快速定位不可达主机
  • 新机房上线前批量验证

网络质量持续监测

  • 高频探测(100+ pps)暴露间歇丢包
  • 纳秒级延迟分布统计
  • 配合脚本输出做告警

故障排查

  • 多目标同时 ping,对比延迟差异
  • verbose 模式打印逐包详情
  • 指定 TOS/TTL 模拟业务流量

网络割接验证

  • 割接前基线采集
  • 割接后对比延迟和丢包
  • 固定发包数(-n)控制测试时长

DNS 解析探测

  • 直接传主机名,自动解析 IP
  • mping 只取 A 记录,mping6 只取 AAAA
  • 适合域名可达性验证

IPv6 网络验证

  • mping6 支持 IPv6 CIDR 展开和 zone
  • 链路本地地址自动加 zone 后缀
  • IPv6 网络质量基线采集

4. 与 bitflip / lidar 的区别

nettools 工具集内的工具各有侧重:

特性mping / mping6bitfliplidar
探测协议ICMP EchoUDPTCP SYN
是否需要服务端不需要需要不需要
探测内容延迟 + 丢包丢包 + bitflip可达性
多目标支持CIDR + DNS + 多 IP多 IP多 IP
硬件时间戳支持支持不支持
适用场景批量 ICMP 巡检UDP 深度检测TCP 端口可达性
Tip:需要 ICMP 层面的延迟和丢包检测,使用 mping;需要 UDP 层面的 bitflip 检测,使用 bitflip;只需确认 TCP 端口是否可达,使用 lidar。

5. 安装

从源码编译

# 克隆仓库
git clone https://github.com/baidu/nettools.git
cd nettools

# 编译全部工具
make compile

# 或单独编译
go build -o mping ./cmd/mping/
go build -o mping6 ./cmd/mping6/

运行要求

要求说明
root 权限需要 sudo 运行,因为 raw socket 构造 ICMP 报文需要特权
macOS / LinuxmacOS 通过 raw socket 发送/接收,Linux 支持 SO_TIMESTAMPING 硬件时间戳
网络连通需要能向目标 IP 发送 ICMP 报文
Note:mping 必须使用 sudo 运行。原始套接字(SOCK_RAW)构造 ICMP 报文需要 root 权限。硬件时间戳(--hwts)仅 Linux 支持,macOS 自动回退到软件时间戳。

6. 快速开始

1. 单目标 ping

# 探测单个 IPv4 目标(默认 100 pps)
sudo ./mping -T 10.0.0.2

2. 多目标探测

# 逗号分隔多个 IP
sudo ./mping -T 10.0.0.2,10.0.0.3,10.0.0.4

3. CIDR 网段探测

# 探测整个 /24 网段(自动排除网络地址和广播地址)
sudo ./mping -T 10.0.1.0/24

# 探测 IPv6 /120 子网
sudo ./mping6 -T fd00::0:0/120

4. DNS 主机名探测

# 自动解析 DNS(mping 取 A 记录,mping6 取 AAAA 记录)
sudo ./mping -T www.example.com

5. 高速率 + 限时探测

# 1000 pps,持续 30 秒
sudo ./mping -T 10.0.0.2 -r 1000 -d 30s

6. IPv6 探测

# 探测 IPv6 地址
sudo ./mping6 -T fd00::2

# 链路本地地址需指定接口
sudo ./mping6 -T fe80::1 -I eth0

7. 命令行参数详解

mping 参数

参数短选项默认值说明
--targets-T目标 IPv4 地址/CIDR/主机名,逗号分隔(必填)
--local-addr-l自动检测本地 IPv4 地址
--interface-I自动检测出接口名称
--tos-z0IP TOS/DSCP 值
--ttl64IP TTL
--count-c0每个目标最大发包数(0 = 无限)
--duration-d0最大发送时长(0 = 无限)
--delay3s统计处理延迟(等待在途报文)
--timeout-t1sSocket 读超时
--rate-r100每秒每目标发包数(pps)
--size-s64ICMP 载荷大小(字节,最小 8)
--verbosefalse打印逐包 ICMP 回复详情
--hwtstrue启用硬件时间戳(默认开启)
--max-targets65536CIDR/DNS 展开后最大目标数
--version-V打印版本信息

mping6 参数

参数短选项默认值说明
--targets-T目标 IPv6 地址/CIDR/主机名,逗号分隔(必填)
--local-addr-l自动检测本地 IPv6 地址
--interface-I自动检测出接口名称
--tc0IPv6 Traffic Class
--hlim64IPv6 Hop Limit
--count-c0每个目标最大发包数(0 = 无限)
--duration-d0最大发送时长(0 = 无限)
--delay3s统计处理延迟
--timeout-t1sSocket 读超时
--rate-r100每秒每目标发包数(pps)
--size-s64ICMPv6 载荷大小(字节,最小 8)
--verbosefalse打印逐包 ICMPv6 回复详情
--hwtstrue启用硬件时间戳
--max-targets65536CIDR/DNS 展开后最大目标数
--version-V打印版本信息
Tip:mping 支持位置参数作为目标,例如 sudo ./mping 10.0.0.2 10.0.0.3 等价于 sudo ./mping -T 10.0.0.2,10.0.0.3。CIDR 展开和 DNS 解析也同时生效。

8. 输出解读

启动日志

[INFO] configured peer 10.0.0.2, seq 1234567890
[INFO] configured peer 10.0.0.3, seq 9876543210
[INFO] client TOS: 0, span: 1s

启动时打印每个目标的配置信息、初始序列号和全局参数。

统计报告

[WARN] 21:37:14, [10.0.0.1 -> 10.0.0.2], sent: 100, received: 98, loss: 2.00%, avg: 0.35ms, min: 0.21ms, max: 1.02ms
[INFO] 21:37:15, [10.0.0.1 -> 10.0.0.2], sent: 100, received: 100, loss: 0.00%, avg: 0.33ms, min: 0.20ms, max: 0.45ms
字段说明
sent该时间窗口内发送的探测包总数
received收到 Echo Reply 的数量
loss丢包率(%)
avg平均往返延迟
min最小往返延迟
max最大往返延迟

日志级别

级别条件含义
[INFO]loss = 0%全部收到回复,网络正常
[WARN]loss > 0%存在丢包
Note:首次统计报告会在启动 delay(默认 3 秒)后出现。这是为了等待在途报文返回,确保统计的准确性。

9. 使用示例

机房内批量连通性检查

# 探测 /24 网段所有主机
sudo ./mping -T 10.0.1.0/24 -r 50 -d 60s

多网段 + 主机名混合探测

# 同时探测网段、单 IP 和域名
sudo ./mping -T 10.0.1.0/24,10.0.2.100,www.example.com

高速率压力测试

# 1000 pps 持续 5 分钟
sudo ./mping -T 10.0.0.2 -r 1000 -d 5m -s 128

指定 TOS 和 TTL

# 模拟业务流量的 TOS 和 TTL
sudo ./mping -T 10.0.0.2 -z 184 --ttl 32

固定发包数

# 每个目标发 1000 个包后停止
sudo ./mping -T 10.0.0.2,10.0.0.3 -c 1000

IPv6 CIDR 探测

# 探测 /120 子网(最多 256 个地址)
sudo ./mping6 -T fd00::0:0/120

# 探测链路本地地址(需指定接口)
sudo ./mping6 -T fe80::1 -I eth0

Verbose 模式

# 打印逐包 ICMP 回复详情
sudo ./mping -T 10.0.0.2 --verbose

10. FAQ

Q: mping 和系统 ping 有什么区别?

系统 ping 只支持单目标。mping 支持多目标并行探测、CIDR 网段展开、DNS 解析,并且默认启用硬件时间戳,适合大规模批量巡检。

Q: 为什么必须 sudo 运行?

mping 使用 raw socket(SOCK_RAW)构造 ICMP Echo Request 报文,这需要 root 权限。内核对普通用户的 raw socket 访问有限制。

Q: CIDR 展开后目标太多怎么办?

使用 --max-targets 限制最大目标数(默认 65536)。超过限制时,mping 会截断并打印警告。IPv6 的 CIDR 展开还额外限制 /112–/128 前缀范围,防止意外展开超大网段。

Q: 硬件时间戳是什么?

硬件时间戳(SO_TIMESTAMPING)由网卡在报文收发时打上时间戳,精度可达纳秒级,不受内核处理延迟影响。仅 Linux 支持,macOS 自动回退到软件时间戳。

Q: 如何停止 mping?

Ctrl+C 发送 SIGINT 信号。mping 会等待 delay 时间让在途报文返回后退出。如果指定了 -c-d,到达限制后也会自动停止。

Q: --rate 应该设多少?

默认 100 pps 适合一般巡检。高速率(500–5000 pps)适合压力测试或高精度丢包检测。注意过高速率可能触发 ICMP 限速。

Q: mping6 的 zone 参数怎么用?

链路本地地址(fe80::)需要指定接口 zone。通过 -I eth0 指定出接口,mping6 会自动处理 zone 后缀。