网络丢包排查实战:ping命令从原理到定位丢包链路
网络卡顿这件事大多数人第一反应是带宽不够然后就去升级套餐结果发现该卡还是卡。我做了十多年运维处理过的网络问题没有一千也有八百真正因为带宽跑满导致的卡顿占比其实不到三成。剩下那七成里网络丢包至少占一半。而排查丢包最趁手、最不需要额外安装的工具就是每个系统都自带的ping 命令。这篇文章面向的是刚接触网络排查的运维新人、被网络时通时断折磨的普通用户以及想系统搞明白 ping 到底怎么回事的技术爱好者。我会从丢包的本质讲起把 ping 的工作原理、各种参数用法、带源地址 ping 这种进阶操作以及如何通过 ping 的输出反推问题出在哪一段全部掰开揉碎讲清楚。看完你至少能做到拿到一台机器ping 几下就能判断问题大概在本地、在网关、还是在运营商那一侧。1. 网络丢包到底丢的是什么1.1 从快递丢件理解丢包网络传输数据的方式是把你要发送的内容切成一个个小块每块叫一个数据包Packet。你可以把它想象成寄快递一份完整的文件被拆成几十上百个包裹每个包裹上写着收件地址、发件地址和序号然后各自上路。接收方收到后按序号拼回原样。所谓网络丢包就是这些包裹在运输途中有一部分没能到达目的地。接收方等啊等序号 5 的包裹迟迟不来它不会无限等下去超时之后就告诉发送方5 号我没收到发送方再补发一个。这个补发的过程就是重传。问题就出在这里偶尔丢一两个包重传一下就补上了你几乎无感但如果丢包率上去了重传频繁发生你就会明显感觉到——网页加载转圈、视频卡住、游戏人物瞬移、SSH 打字半天才回显。这就是丢包最直观的表现。1.2 丢包率多少才算有问题很多人不知道丢包率有个可接受范围的概念看到 ping 结果里有丢包就慌。实际上丢包率实际体验是否需要处理0%完美不需要1% 以内基本无感个别重传一般可忽略1% - 5%视频偶有卡顿游戏能感觉到建议排查5% - 10%明显卡顿语音通话断续必须处理10% 以上连接时通时断几乎不可用紧急处理注意这里的百分比是针对持续稳定的丢包而言。如果只是 ping 一百个包丢了一个那属于正常的网络抖动不用大惊小怪。真正要警惕的是那种每 ping 十个包稳定丢一两个的规律性丢包。1.3 丢包发生在哪一段决定了你怎么修这是新手最容易忽略的一点丢包不是一个点的问题而是一段链路的问题。从你的电脑到目标服务器中间要经过你的网卡 → 网线/WiFi → 家用路由器 → 光猫 → 运营商接入设备 → 运营商骨干网 → 目标机房 → 目标服务器。任何一段出问题都会丢包。所以排查丢包的核心思路不是有没有丢包而是从哪一跳开始丢。这也是为什么 ping 命令里那个-t持续 ping和tracert/traceroute路由追踪配合起来用才能定位问题。后面我会专门讲怎么用 ping 分段定位。2. ping 命令的工作原理它凭什么能测通不通2.1 ICMP 协议ping 的底层依赖ping 命令用的不是 TCP 也不是 UDP而是ICMP 协议Internet Control Message Protocol互联网控制消息协议。ICMP 是 IP 层的辅助协议专门用来传递网络层的控制信息比如目标不可达超时需要分片等等。ping 干的事情特别简单它构造一个ICMP Echo Request回显请求包发给目标目标收到后回一个ICMP Echo Reply回显应答包。发送方记录发出时间和收到时间两者相减就是往返时延RTTRound-Trip Time。如果超时没收到应答就记为一次丢包。用生活类比ping 就像你朝山谷喊一嗓子喂——如果对面有人他会回你一声喂——。你听到回声说明路是通的回声来得快说明距离近时延低喊十声只听到八声回声说明有两声丢了。2.2 为什么 ping 通不代表服务一定正常这是运维里一个经典误区必须讲清楚。ping 通只说明网络层IP 层是通的不代表应用层服务是好的。原因有几个目标服务器可能开了防火墙禁 ping 但服务正常。很多云服务器默认就禁 ICMP你 ping 不通但它网站访问得好好的。反过来ping 通了但目标端口没开比如 80 端口没监听你照样访问不了网站。ICMP 的优先级通常很低网络拥塞时 ICMP 包可能被优先丢弃导致 ping 显示丢包但实际 TCP 业务流量是好的。所以正确的判断逻辑是ping 不通 → 网络层可能有问题也可能只是禁 pingping 通但服务异常 → 问题在应用层去查端口和进程。两者是互补的不能互相替代。2.3 一次 ping 的完整生命周期理解了这个流程你就能看懂 ping 输出里的每一个数字本机构造 ICMP Echo Request填上序号seq和发送时间戳。包经过本机路由表决定从哪个网卡、走哪个网关出去。沿途每个路由器根据目的 IP 查路由表逐跳转发。目标主机收到后构造 ICMP Echo Reply 原路返回。本机收到应答用当前时间减去发送时间戳得到 RTT。重复上述过程默认发 4 个包Windows或一直发到手动停止Linux 默认也是持续需 CtrlC。输出里的timexx ms就是 RTTttlxx是生存时间Time To Live每经过一个路由器减 1可以用来粗略推断经过了多少跳也能辅助判断对端操作系统类型。3. ping 命令的完整用法拆解3.1 基础用法与输出解读最基础的用法就是直接跟目标ping www.example.comWindows 下默认发 4 个包就停Linux/macOS 下会一直发需要CtrlC停止。停止后会给出一段统计--- www.example.com ping statistics --- 100 packets transmitted, 98 received, 2% packet loss, time 99123ms rtt min/avg/max/mdev 12.345/15.678/45.678/3.210 ms这段统计信息含金量很高逐项看packets transmitted / received发了多少、收了多少差值就是丢的。packet loss丢包率这是核心指标。rtt min/avg/max/mdev最小、平均、最大、平均偏差。mdev 特别重要它反映时延的抖动程度。mdev 大说明网络不稳定即使平均时延不高体验也会很差。3.2 常用参数速查表不同系统参数略有差异我把最常用的整理成表参数WindowsLinux/macOS作用持续 ping-t默认持续一直 ping 直到手动停止指定次数-n 10-c 10发 10 个包指定包大小-l 1472-s 1472设置数据部分大小指定源地址-S 源IP-I 源IP从指定网卡/IP 发出不分片-f-M do禁止分片用于测 MTU超时时间-w 1000-W 1单包等待毫秒/秒数记录路由-r 9-R记录经过的路由有限制提示Windows 的-l和 Linux 的-s指定的是ICMP 数据部分的大小不含 IP 头和 ICMP 头共 28 字节。所以-l 1472加上 28 字节正好是 1500这是以太网的标准 MTU。3.3 带源地址 ping多网卡环境的必备技能带源地址 ping是热词里高频出现的一个用法也是很多新手卡壳的地方。什么场景需要它当一台机器有多块网卡或多个 IP 时比如一台服务器同时接了内网网卡192.168.1.10和外网网卡公网 IP或者有多个 VLAN 接口。默认情况下系统会根据路由表自动选一个源 IP 发包但有时候自动选的那个不是你想要的导致 ping 不通或结果不准。这时候就要手动指定源地址# Linux 下用 -I 指定源 IP 或网卡名 ping -I 192.168.1.10 10.0.0.5 ping -I eth0 10.0.0.5 # Windows 下用 -S 指定源 IP ping -S 192.168.1.10 10.0.0.5为什么这个操作重要举个例子你有一台双网卡服务器内网网卡通内网外网网卡通外网。你想测试内网连通性但系统默认路由走的是外网网卡结果 ping 内网地址时源 IP 用的是外网地址对端一看源地址不对可能直接不回包你就误判成内网不通。用-I强制指定内网网卡问题立刻现形。注意Linux 的-I后面既可以跟 IP 也可以跟网卡名但跟网卡名时要求该网卡有且仅有一个 IP。如果网卡配了多个 IP建议直接写 IP 更稳妥。4. 用 ping 定位丢包一套可复现的排查链路4.1 第一步先确认是不是本地问题拿到网络卡的反馈别急着 ping 外网。先 ping 本地回环ping 127.0.0.1127.0.0.1 是回环地址包根本不出网卡直接在协议栈内部转一圈。如果连这个都丢包或时延异常那问题在本机协议栈或系统负载跟网络设备无关。这种情况通常是系统 CPU 跑满、驱动异常或者协议栈出 bug重启网络服务或系统往往能解决。接着 ping 本机自己的网卡 IPping 192.168.1.10 # 换成你自己的网卡 IP这一步测的是网卡本身是否正常工作。如果这一步丢包检查网卡驱动、网线接触、网卡是否被禁用。4.2 第二步ping 网关划清内网还是外网的界限网关是内网通往外网的必经之路。先查网关地址# Windows ipconfig # Linux ip route | grep default然后 ping 网关ping 192.168.1.1ping 网关就丢包问题在内网。可能是网线质量差、WiFi 信号弱、路由器负载高、内网有环路或广播风暴。重点查物理链路和路由器。ping 网关正常ping 外网丢包问题在网关之外也就是运营商那一侧或者目标服务器那一侧。继续往下排查。这一步是整个排查的分水岭能帮你省掉大量无用功。我见过太多人一上来就 ping 百度丢包了就骂运营商结果一 ping 网关发现内网就在丢白折腾半天。4.3 第三步ping 公网 IP 与域名区分 DNS 问题外网排查要分两层先 ping 一个公网 IP比如 223.5.5.5 这类公共 DNS 的 IP再 ping 一个域名。ping 223.5.5.5 ping www.example.comping IP 正常ping 域名丢包或失败问题在DNS 解析不是网络链路。检查 DNS 配置、DNS 服务器是否可达。ping IP 也丢包链路确实有问题进入下一步用路由追踪定位。4.4 第四步tracert/traceroute 找出丢包的具体跳数ping 只能告诉你到终点丢包但丢在哪一跳得靠路由追踪# Windows tracert www.example.com # Linux/macOS traceroute www.example.com输出会列出从你到目标经过的每一跳以及每跳的时延。关键看法如果从第 N 跳开始后面所有跳都显示* * *或高丢包而第 N 跳之前都正常那问题就出在第 N 跳附近。但这里有个大坑很多路由器出于安全考虑不响应 ICMP 或限制 ICMP 速率导致 tracert 中间某些跳显示* * *但实际链路是好的。所以不能只看某一跳的星号就下结论要看从哪一跳开始持续丢。如果中间跳有星号但最后一跳正常到达那中间那些星号是路由器不响应导致的假象不用管。4.5 第五步长时间持续 ping 抓规律偶发丢包最难查因为你去 ping 的时候它可能正好不丢。这时候要用持续 ping 加日志记录抓一段时间的数据# Linux 下持续 ping 并带时间戳记录到文件 ping -c 1000 -i 0.2 www.example.com | while read line; do echo $(date %Y-%m-%d %H:%M:%S) $line; done ping_log.txtWindows 下可以用ping -t www.example.com ping_log.txt跑上几小时甚至一天然后分析日志。重点看丢包是否有规律是不是每天固定时段丢可能是运营商高峰拥塞、是不是每隔固定时间丢可能是某设备定时任务、是不是随机丢可能是链路质量差或无线干扰。规律不同处理方向完全不同。5. 那些年我在丢包排查上踩过的坑5.1 把禁 ping当成网络不通这是我早期最常犯的错误。有次客户报障说服务器连不上我 ping 了一下公网 IP不通直接判定网络故障折腾半天联系机房。结果人家一查服务器好好的只是防火墙禁了 ICMP。后来我养成了习惯ping 不通时一定要用 telnet 或 nc 测一下业务端口端口通就说明网络没问题。# 测试 80 端口是否可达 telnet www.example.com 80 # 或者用 nc nc -zv www.example.com 805.2 忽略 mdev只看平均时延新手看 ping 统计只看 avg觉得平均 20ms 挺好。但 mdev 如果到了 15ms说明时延在 5ms 到 35ms 之间剧烈波动这种网络打游戏、开视频会议照样卡。时延抖动jitter对实时业务的影响往往比平均时延更大。所以看统计一定要 min/avg/max/mdev 四个一起看。5.3 用 WiFi 排查却怀疑运营商无线网络天生就比有线容易丢包尤其是 2.4G 频段周围一堆邻居的 WiFi 在抢信道丢包和抖动都很常见。我有次排查了半天运营商线路最后发现是笔记本离路由器太远信号只有两格。排查丢包第一步能用网线就用网线排除无线因素后再谈其他。这个教训值好几杯咖啡。5.4 包大小设置不当导致误判 MTU 问题有些网络路径的 MTU 小于 1500比如 PPPoE 拨号环境常见 1492大包会被分片或丢弃小包却正常。表现就是ping 小包通一传大文件就卡。这时候要用不分片参数测 MTU# Linux逐步减小包大小找到不分片能通过的最大值 ping -M do -s 1472 www.example.com ping -M do -s 1400 www.example.com # Windows ping -f -l 1472 www.example.com如果 1472 不通但 1400 通说明路径 MTU 在 1400 到 1472 之间需要调整本机 MTU 或让网络设备正确处理分片。这个坑很隐蔽因为日常小包 ping 完全正常。6. 让 ping 结果更有价值的几个进阶技巧6.1 用 ping 快速判断对端操作系统前面提到 TTL 每经过一跳减 1。不同系统的初始 TTL 不同Linux 通常是 64Windows 通常是 128一些网络设备是 255。所以看到ttl52可以推断初始是 64经过了约 12 跳对端大概率是 Linux。看到ttl118初始 128经过约 10 跳对端大概率是 Windows。这只是粗略判断但排查时能提供一点线索。6.2 批量 ping 网段快速发现存活主机排查内网时经常需要知道某个网段有哪些机器在线。写个简单循环# Linux 下批量 ping 192.168.1.1 到 192.168.1.254 for i in $(seq 1 254); do ping -c 1 -W 1 192.168.1.$i /dev/null 21 echo 192.168.1.$i is up done这个脚本会逐个 ping 并只输出在线的 IP。虽然效率不如专门的扫描工具但胜在不需要装任何东西任何 Linux 都能跑。Windows 下可以用for /L循环配合 ping 实现类似效果。6.3 结合时间戳分析间歇性丢包前面第五步提到的带时间戳记录是排查间歇性问题的利器。拿到日志后用脚本统计每分钟的丢包数就能看出丢包的时间分布。如果发现丢包集中在每天晚 8 点到 11 点那基本可以确定是运营商高峰拥塞这种情况个人用户能做的有限可以考虑换线路或错峰使用。6.4 ping 的替代与补充工具ping 虽好但有局限。它测的是 ICMP很多网络对 ICMP 有特殊处理。要更贴近真实业务可以配合这些工具mtrLinux把 ping 和 traceroute 合二为一持续追踪每一跳的丢包和时延是排查链路问题的神器。tcping用 TCP 协议测端口连通性和时延能绕过禁 ping 的限制。iperf3测实际带宽和吞吐判断是不是带宽瓶颈而非丢包。这些工具在 ping 定位到大致范围后用来做进一步确认非常有效。但 ping 永远是第一步因为它零依赖、零成本、上手最快。7. 关于 ping 和丢包几个必须澄清的认知7.1 ping 值低不等于网络好ping 值低只说明时延小不代表不丢包也不代表带宽够。一个 ping 值 5ms 但丢包 10% 的网络体验远不如 ping 值 50ms 但零丢包的网络。评估网络质量要综合时延、抖动、丢包率、带宽四个维度单看一个都会误判。7.2 丢包不一定是故障公网上一定程度的丢包是常态尤其是跨运营商、跨地域的长距离链路。互联网的设计本身就假设了会丢包靠 TCP 重传来保证可靠性。所以看到 1% 以内的丢包先别急着报障观察一下是否影响实际业务。真正要处理的是那种持续、规律、影响体验的丢包。7.3 排查顺序比工具更重要工具人人都会用但排查思路才是分水岭。我总结的顺序是本机 → 网关 → 公网 IP → 域名 → 逐跳追踪 → 长时间观测。每一步都在缩小范围每一步都有明确的判断标准。按这个顺序走绝大多数丢包问题都能定位到具体环节。反过来如果一上来就乱 ping很容易被表象带偏。ping 这个命令简单到几乎人人都会敲但真正能用它把问题定位清楚的人并不多。区别不在于记不记得住参数而在于脑子里有没有一张清晰的链路地图知道每一个结果对应着哪一段的可能性。我自己这些年最大的体会是排查网络问题耐心比技巧更重要。很多丢包是间歇性的急着下结论往往南辕北辙老老实实持续 ping 一段时间、把日志记下来慢慢分析反而最快找到答案。下次再遇到网络卡别急着换设备先 ping 几下让数据告诉你问题在哪。