Linux系统之ping 命令详解
·
ping 命令详解
一、命令概述
ping 是 Linux/Unix 系统中最常用的网络连通性测试工具,通过发送 ICMP ECHO_REQUEST 数据包到目标主机,监听其返回的 ICMP ECHO_RESPONSE 数据包,判断主机是否可达、网络延迟及丢包率。核心用途包括:
- 验证主机/网关的存活状态;
- 排查网络故障(如链路中断、高延迟、丢包);
- 测试网络性能(往返时间 RTT、数据包丢失率)。
支持 IPv4 和 IPv6(通过 -4/-6 强制指定),且 ping6 已合并到 ping 中(创建 ping6 符号链接即可复用 IPv6 功能)。
二、命令语法
ping [-aAbBdDfhLnOqrRUvV46]
[-c count] [-F flowlabel] [-i interval] [-I interface] [-l preload] [-m mark]
[-M pmtudisc_option] [-N nodeinfo_option] [-w deadline] [-W timeout]
[-p pattern] [-Q tos] [-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
[hop ...] destination
destination:必填,目标主机(可填域名、IPv4 地址、IPv6 地址;IPv6 链路本地地址需加%接口名,如fe80::1%eth0);- 选项规则:短选项可合并(如
-av),部分选项需带参数(如-c 5)。
三、选项详解
按功能分类整理所有选项,标注核心作用、参数说明及使用场景:
3.1 协议与地址控制
| 选项 | 功能描述 | 示例 |
|---|---|---|
-4 |
仅使用 IPv4 协议(默认优先 IPv4,无 IPv4 时尝试 IPv6)。 | ping -4 www.baidu.com(强制 IPv4 ping 百度) |
-6 |
仅使用 IPv6 协议。 | ping -6 ipv6.baidu.com(IPv6 ping 百度) |
-B |
禁止修改探测包的源地址(固定为命令启动时选择的源地址)。 | ping -B -I eth0 www.baidu.com(固定从 eth0 的地址发送包) |
-I interface |
指定发送包的源接口/源地址: - 若为接口名(如 eth0):绑定该接口发送;- 若为 IP 地址:绑定该地址为源地址。 (IPv6 链路本地地址必须指定此选项或用 %接口名) |
ping -I eth1 192.168.1.1(从 eth1 接口 ping 网关) |
-r |
绕过系统路由表,直接发送到直连网络的主机(非直连主机返回错误)。 | ping -r -I eth0 192.168.1.100(直连主机直接通信,不查路由) |
3.2 数据包发送控制
| 选项 | 功能描述 | 注意事项/示例 |
|---|---|---|
-c count |
发送 count 个 ECHO_REQUEST 包后停止(默认持续发送,需 Ctrl+C 中断)。 |
ping -c 5 www.baidu.com(发送 5 个包后退出) |
-i interval |
发送两个包之间的间隔时间(单位:秒,默认 1 秒)。 | - 普通用户最小间隔 0.2 秒,root 无限制; - 示例: ping -i 0.5 -c 10 192.168.1.1(每 0.5 秒发 1 个,共 10 个) |
-l preload |
预先发送 preload 个包,不等待回复(“批量发送”)。 |
- 普通用户最大 preload=3,root 无限制; - 示例: ping -l 10 -c 10 192.168.1.1(先发 10 个包,再等回复) |
-f |
洪水 ping(快速发送包,用于压力测试): - 发送包时打印 .,收到回复时打印退格;- 未指定 -i 时,间隔设为 0(最快速度)。 |
- 仅 root 可用(普通用户间隔最低 0.2 秒); - 示例: sudo ping -f 192.168.1.1(洪水 ping 网关) |
-w deadline |
总超时时间(单位:秒),无论发送/接收多少包,到时间后强制退出。 | ping -w 10 -c 20 www.baidu.com(10 秒内最多发 20 个包,到时间即停) |
-W timeout |
单个包的等待回复超时时间(单位:秒),超时未收到回复则视为丢包。 | ping -W 2 -c 5 192.168.1.1(每个包等待 2 秒,共 5 个) |
-s packetsize |
指定 ICMP 数据包中数据部分的大小(单位:字节,默认 56 字节)。 | - 总 ICMP 包大小 = 数据大小 + 8 字节 ICMP 头(默认 64 字节); - 示例: ping -s 100 -c 3 192.168.1.1(数据 100 字节,总包 108 字节) |
-p pattern |
自定义数据包的填充内容(16 字节以内,用十六进制表示),用于测试数据依赖问题。 | ping -p ff -c 3 192.168.1.1(填充全 1 数据,排查链路数据兼容性) |
3.3 网络参数与策略
| 选项 | 功能描述 | 示例 |
|---|---|---|
-t ttl |
设置 IP 包的 TTL(生存时间)(跳数限制,每经过一个路由器减 1,为 0 时丢弃)。 | ping -t 10 www.baidu.com(TTL 设为 10,最多经过 10 个路由器) |
-M pmtudisc_option |
配置 路径 MTU 发现(PMTU) 策略(避免数据包分片): - do:禁止分片(包超 MTU 则丢包);- want:开启 PMTU 发现,本地可分片;- dont:不设置 DF(不分片)标志。 |
ping -M do -s 1500 192.168.1.1(禁止分片,测试 MTU 是否为 1500) |
-Q tos |
设置 ICMP 包的 TOS(服务类型) 字段(十进制/十六进制,对应 DiffServ 或优先级)。 | ping -Q 0x10 -c 3 www.baidu.com(设置 TOS 为 16,高优先级) |
-m mark |
给发送的包添加 标记(mark),用于内核策略路由(如基于标记选择出口)。 | sudo ping -m 100 192.168.2.1(包标记 100,配合路由规则使用) |
-F flowlabel |
IPv6 特有,设置 20 位 流标签(十六进制): - 0:内核随机分配; - 非 0:使用指定值。 |
ping -6 -F 1a2b 240c::6666(IPv6 包流标签设为 0x1a2b) |
-R |
启用 路由记录(在 ECHO_REQUEST 中添加 RECORD_ROUTE 选项,显示包经过的路由器)。 | ping -R -c 1 www.baidu.com(显示 ping 百度的路由路径) |
-L |
禁止多播包的回环(仅当目标为多播地址时生效)。 | ping -L -c 3 224.0.0.1(多播 ping 时不接收自身发送的包) |
3.4 输出与显示控制
| 选项 | 功能描述 | 示例 |
|---|---|---|
-a |
声音提示(收到回复时发出蜂鸣声)。 | ping -a -c 5 192.168.1.1(收到回复时响铃) |
-A |
自适应 ping(根据往返时间调整发送间隔,确保网络中不超过 1 个未回复包)。 | ping -A www.baidu.com(高延迟网络中自动降低发送频率) |
-D |
每个输出行前添加 时间戳(Unix 时间 + 微秒,如 1716000000.123456)。 |
ping -D -c 3 www.baidu.com(带时间戳记录 ping 结果,便于日志分析) |
-n |
仅显示数字地址(不解析域名,加快输出)。 | ping -n www.baidu.com(输出 180.101.49.12 而非域名) |
-q |
安静模式(仅显示启动和结束时的摘要信息,不显示单个包的结果)。 | ping -q -c 5 www.baidu.com(仅输出总丢包率、平均 RTT 等摘要) |
-v |
详细模式(输出额外信息,如 ICMP 头细节、路由记录)。 | ping -v -R -c 1 192.168.1.1(显示路由记录的详细过程) |
-O |
发送下一个包前,报告未回复的包数量(配合 -D 便于日志排查丢包)。 |
ping -O -D -c 10 192.168.1.1(记录未回复包,定位丢包时间点) |
-U |
显示 完整的端到端延迟(旧行为,默认显示网络往返时间,可能因 DNS 等差异不同)。 | ping -U www.baidu.com(兼容旧版本的延迟计算方式) |
3.5 IPv6 特有功能(-N)
仅 IPv6 可用,发送 ICMPv6 节点信息查询(RFC4620)(需 CAP_NET_RAW 权限,通常需 root),替代默认的 ECHO_REQUEST:
| 子选项 | 功能描述 | 示例 |
|---|---|---|
-N help |
显示节点信息查询的帮助。 | ping -6 -N help |
-N name |
查询目标节点的主机名。 | ping -6 -N name 240c::6666(查询 IPv6 主机的域名) |
-N ipv6 |
查询目标节点的IPv6 地址(可加子选项如 ipv6-global/ipv6-linklocal)。 |
ping -6 -N ipv6-global 240c::6666(查询目标的全局 IPv6 地址) |
-N ipv4 |
查询目标节点的IPv4 地址。 | ping -6 -N ipv4 240c::6666(查询 IPv6 主机的 IPv4 地址) |
3.6 帮助与版本
| 选项 | 功能描述 | 示例 |
|---|---|---|
-h |
显示帮助信息(选项列表及简要说明)。 | ping -h |
-V |
显示版本信息并退出。 | ping -V |
四、关键技术细节
4.1 ICMP 数据包结构
- 默认大小:数据部分 56 字节 + ICMP 头 8 字节 = 64 字节(不含 IP 头,IP 头默认 20 字节);
- 时间戳:若数据部分 ≥
struct timeval大小(通常 8 字节),会在数据开头嵌入发送时间戳,用于计算 RTT。
4.2 TTL(生存时间)解析
TTL 表示数据包最多经过的路由器数量(每跳减 1),可通过 ping 结果推断目标主机的操作系统:
- Linux/Unix:默认 TTL=64 或 255;
- Windows:默认 TTL=128;
- 示例:
ping www.baidu.com返回 TTL=54 → 说明经过 64-54=10 个路由器。
4.3 重复与损坏数据包
- 重复包:通常由链路层重传导致,低频率可能正常,高频率需排查链路故障;
- 损坏包:表明链路或主机硬件故障(如网卡、交换机问题),需紧急处理。
五、退出状态
ping 的退出码可用于脚本判断主机是否可达:
0:至少收到 1 个 ECHO_RESPONSE 包(主机可达);1:未收到任何回复(主机不可达、超时,或-w/-c组合时未达预期包数);2:命令语法错误或网络错误(如接口不存在、权限不足)。
六、常用示例
示例 1:基础连通性测试(发送 5 个包)
ping -c 5 www.baidu.com
输出包含每个包的 RTT、TTL,及最终的丢包率、平均 RTT 统计。
示例 2:测试 IPv6 连通性
ping -6 -c 3 ipv6.baidu.com
或通过符号链接:ping6 -c 3 ipv6.baidu.com。
示例 3:洪水 ping(压力测试,仅 root)
sudo ping -f -c 1000 192.168.1.1
快速发送 1000 个包,测试网关的抗压力能力。
示例 4:带时间戳的日志记录
ping -D -w 30 www.baidu.com > ping.log 2>&1
将 30 秒内的 ping 结果(含时间戳)保存到日志,用于后续分析延迟波动。
示例 5:测试路径 MTU(禁止分片)
ping -M do -s 1472 192.168.1.1
- 若成功:说明 MTU ≥ 1472+28(IP 头 20 + ICMP 头 8)= 1500 字节(标准以太网 MTU);
- 若失败(
Fragmentation needed):需减小-s值,直到找到最大不分片大小。
七、注意事项
-
权限限制:
-f、-i <0.2、-l >3、-N需 root 权限;- 普通用户无法修改 TOS(
-Q)或添加包标记(-m)。
-
网络负载:
- 洪水 ping(
-f)会占用大量带宽,禁止在公网或生产环境使用; - 频繁 ping 可能被目标主机防火墙拦截(需确保 ICMP 协议未被禁用)。
- 洪水 ping(
-
IPv6 链路本地地址:
必须指定接口,如ping -6 fe80::1%eth0(%eth0不可省略)。
八、相关参考
- 查看路由:
netstat -rn或ip route,配合-r选项排查路由问题; - 接口信息:
ifconfig或ip addr,确认-I选项指定的接口存在; - ICMP 协议:RFC 792(IPv4)、RFC 4443(IPv6)。
更多推荐



所有评论(0)