nettools · 多目标 ICMP Ping 工具(IPv4 / IPv6)
Usage Guide — 涵盖原理、安装、命令行参数、CIDR 批量探测及典型使用场景。
← 返回首页最新发布 mping / mping6 是百度系统部物理网络黑盒监控团队开发的多目标 ICMP Ping 工具。支持 CIDR 展开批量探测、DNS 解析、高速率发送、硬件时间戳,适合大规模网络质量巡检和故障排查。mping 用于 IPv4,mping6 用于 IPv6。
核心特性:
--max-targets 控制上限。SO_TIMESTAMPING 硬件时间戳(Linux),精度达纳秒级。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 伪首部)。
sudo 运行。macOS 和 Linux 均支持,但硬件时间戳(SO_TIMESTAMPING)仅 Linux 内核支持。
mping / mping6 适用于以下网络质量巡检场景:
nettools 工具集内的工具各有侧重:
| 特性 | mping / mping6 | bitflip | lidar |
|---|---|---|---|
| 探测协议 | ICMP Echo | UDP | TCP SYN |
| 是否需要服务端 | 不需要 | 需要 | 不需要 |
| 探测内容 | 延迟 + 丢包 | 丢包 + bitflip | 可达性 |
| 多目标支持 | CIDR + DNS + 多 IP | 多 IP | 多 IP |
| 硬件时间戳 | 支持 | 支持 | 不支持 |
| 适用场景 | 批量 ICMP 巡检 | UDP 深度检测 | TCP 端口可达性 |
# 克隆仓库
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 / Linux | macOS 通过 raw socket 发送/接收,Linux 支持 SO_TIMESTAMPING 硬件时间戳 |
| 网络连通 | 需要能向目标 IP 发送 ICMP 报文 |
sudo 运行。原始套接字(SOCK_RAW)构造 ICMP 报文需要 root 权限。硬件时间戳(--hwts)仅 Linux 支持,macOS 自动回退到软件时间戳。
# 探测单个 IPv4 目标(默认 100 pps)
sudo ./mping -T 10.0.0.2
# 逗号分隔多个 IP
sudo ./mping -T 10.0.0.2,10.0.0.3,10.0.0.4
# 探测整个 /24 网段(自动排除网络地址和广播地址)
sudo ./mping -T 10.0.1.0/24
# 探测 IPv6 /120 子网
sudo ./mping6 -T fd00::0:0/120
# 自动解析 DNS(mping 取 A 记录,mping6 取 AAAA 记录)
sudo ./mping -T www.example.com
# 1000 pps,持续 30 秒
sudo ./mping -T 10.0.0.2 -r 1000 -d 30s
# 探测 IPv6 地址
sudo ./mping6 -T fd00::2
# 链路本地地址需指定接口
sudo ./mping6 -T fe80::1 -I eth0
| 参数 | 短选项 | 默认值 | 说明 |
|---|---|---|---|
--targets | -T | — | 目标 IPv4 地址/CIDR/主机名,逗号分隔(必填) |
--local-addr | -l | 自动检测 | 本地 IPv4 地址 |
--interface | -I | 自动检测 | 出接口名称 |
--tos | -z | 0 | IP TOS/DSCP 值 |
--ttl | 64 | IP TTL | |
--count | -c | 0 | 每个目标最大发包数(0 = 无限) |
--duration | -d | 0 | 最大发送时长(0 = 无限) |
--delay | 3s | 统计处理延迟(等待在途报文) | |
--timeout | -t | 1s | Socket 读超时 |
--rate | -r | 100 | 每秒每目标发包数(pps) |
--size | -s | 64 | ICMP 载荷大小(字节,最小 8) |
--verbose | false | 打印逐包 ICMP 回复详情 | |
--hwts | true | 启用硬件时间戳(默认开启) | |
--max-targets | 65536 | CIDR/DNS 展开后最大目标数 | |
--version | -V | 打印版本信息 |
| 参数 | 短选项 | 默认值 | 说明 |
|---|---|---|---|
--targets | -T | — | 目标 IPv6 地址/CIDR/主机名,逗号分隔(必填) |
--local-addr | -l | 自动检测 | 本地 IPv6 地址 |
--interface | -I | 自动检测 | 出接口名称 |
--tc | 0 | IPv6 Traffic Class | |
--hlim | 64 | IPv6 Hop Limit | |
--count | -c | 0 | 每个目标最大发包数(0 = 无限) |
--duration | -d | 0 | 最大发送时长(0 = 无限) |
--delay | 3s | 统计处理延迟 | |
--timeout | -t | 1s | Socket 读超时 |
--rate | -r | 100 | 每秒每目标发包数(pps) |
--size | -s | 64 | ICMPv6 载荷大小(字节,最小 8) |
--verbose | false | 打印逐包 ICMPv6 回复详情 | |
--hwts | true | 启用硬件时间戳 | |
--max-targets | 65536 | CIDR/DNS 展开后最大目标数 | |
--version | -V | 打印版本信息 |
sudo ./mping 10.0.0.2 10.0.0.3 等价于 sudo ./mping -T 10.0.0.2,10.0.0.3。CIDR 展开和 DNS 解析也同时生效。
[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% | 存在丢包 |
delay(默认 3 秒)后出现。这是为了等待在途报文返回,确保统计的准确性。
# 探测 /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
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
# 探测 /120 子网(最多 256 个地址)
sudo ./mping6 -T fd00::0:0/120
# 探测链路本地地址(需指定接口)
sudo ./mping6 -T fe80::1 -I eth0
# 打印逐包 ICMP 回复详情
sudo ./mping -T 10.0.0.2 --verbose
系统 ping 只支持单目标。mping 支持多目标并行探测、CIDR 网段展开、DNS 解析,并且默认启用硬件时间戳,适合大规模批量巡检。
mping 使用 raw socket(SOCK_RAW)构造 ICMP Echo Request 报文,这需要 root 权限。内核对普通用户的 raw socket 访问有限制。
使用 --max-targets 限制最大目标数(默认 65536)。超过限制时,mping 会截断并打印警告。IPv6 的 CIDR 展开还额外限制 /112–/128 前缀范围,防止意外展开超大网段。
硬件时间戳(SO_TIMESTAMPING)由网卡在报文收发时打上时间戳,精度可达纳秒级,不受内核处理延迟影响。仅 Linux 支持,macOS 自动回退到软件时间戳。
按 Ctrl+C 发送 SIGINT 信号。mping 会等待 delay 时间让在途报文返回后退出。如果指定了 -c 或 -d,到达限制后也会自动停止。
默认 100 pps 适合一般巡检。高速率(500–5000 pps)适合压力测试或高精度丢包检测。注意过高速率可能触发 ICMP 限速。
链路本地地址(fe80::)需要指定接口 zone。通过 -I eth0 指定出接口,mping6 会自动处理 zone 后缀。