网络排错实战:ping、mtr、tcpdump、iperf3 四件套,内网卡顿丢包一查到底
家里和机房里设备一多,网络问题就跟着来了:看…
家里和机房里设备一多,网络问题就跟着来了:看视频转圈、SSH 敲个字都卡、内网传文件慢得离谱、打游戏时不时跳 ping。很多人的第一反应是重启路由器。重启当然有用,但更多时候只是把问题暂时“糊”过去,过两天又犯。
这几年我折腾 homelab,服务器、NAS、软路由、摄像头、各种 AI 节点加起来几十台设备,网络问题是家常便饭,慢慢摸出了一套固定套路:先定位、再动手。今天就把它整理成一篇,配合四个工具——ping、mtr、tcpdump、iperf3,基本能定位 90% 以上的内网卡顿和丢包。
四件套一行命令装齐:
sudo apt install -y iputils-ping mtr tcpdump iperf3
如果是 CentOS / Rocky 系,把 apt 换成 dnf 就行。
一、ping:先确认“通不通”,再看“稳不稳”
任何网络问题,第一步永远是 ping。别小看它,ping 能同时回答三个问题:目标通不通、延迟多少、丢不丢包。最简单的用法:
ping -c 10 192.168.1.1
-c 10 表示发 10 个包就停,不加这个参数在 Linux 上会一直 ping 下去。执行完看最后几行统计:
--- 192.168.1.1 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9008ms
rtt min/avg/max/mdev = 0.318/0.412/0.623/0.084 ms
三个关键指标:
- packet loss(丢包率):有线内网应该是 0%,WiFi 偶尔 1%~2% 能接受,长期超过 5% 就要查了。
- rtt avg(平均延迟):有线局域网一般 1ms 以内,WiFi 5ms 以内算正常。要是局域网 ping 网关都几十毫秒,先别怪外网,问题就在你家里。
- mdev(抖动):越小越稳定。打游戏、视频会议卡,很多就是抖动太大。
排错顺序很重要:先 ping 网关(一般是 192.168.1.1 或路由器地址),再 ping 局域网其他设备,最后才 ping 外网(比如阿里 DNS 的 223.5.5.5)。
- 网关 ping 不通 → 网线、网卡、路由器本机的问题。
- 网关通、其他内网设备不通 → 中间交换机、目标设备防火墙的问题。
- 内网都通、外网不通 → 路由器拨号 / 上游线路的问题。
这个顺序能帮你把范围一层层缩小,比漫无目的地重启强多了。
二、mtr:逐跳定位,看到底卡在哪一段
ping 只能告诉你“通不通”,但外网访问慢,中间要经过十几跳,到底卡在哪一跳?这时候上 mtr。它是 ping 和 traceroute 的合体,实时统计每一跳的丢包和延迟。
mtr -rw -c 50 223.5.5.5
-r 是报告模式(一次性输出结果),-w 是宽格式,-c 50 是发 50 个包。
HOST Loss% Snt Last Avg Best Wrst
1. 192.168.1.1 0.0% 50 0.4 0.5 0.3 1.2
2. 100.64.0.1 0.0% 50 3.1 4.2 2.8 18.5
3. 112.xx.xx.xx 0.0% 50 5.0 5.6 4.1 20.3
4. 202.97.xx.xx 0.0% 50 12.3 11.8 10.2 45.6
5. 223.5.5.5 0.0% 50 11.5 11.4 10.9 13.2
怎么看这张表?关键看 Loss% 这一列:
- 每一跳都 0% 丢包,延迟逐跳递增且没有突变 → 网络健康,慢是带宽不够,不是线路问题。
- 中间某一跳开始 Loss% 蹭蹭涨,后面所有跳都跟着丢 → 问题大概率出在这一跳的节点或它前面那段线路。
- 最后一跳 Loss% 高、倒数第二跳正常 → 是目标服务器自己丢包,跟你没关系。
有个坑要提醒:有些运营商路由器会“限速响应 ICMP”,也就是对你发的探测包爱答不理,导致某中间跳显示高丢包,但最后一跳却正常。这种情况以最后一跳为准,别被中间跳吓到。
三、iperf3:测真实带宽,区分“链路慢”和“应用慢”
传文件慢,到底是网卡不行、网线是百兆、还是应用本身慢?iperf3 是测带宽的标杆工具,直接打满链路看真实吞吐。
一台机器当服务端:
iperf3 -s
另一台当客户端,连过去测:
iperf3 -c 192.168.1.10
[ ID] Interval Transfer Bitrate
[ 5] 0.00-10.00 sec 1.08 GBytes 928 Mbits/sec
这个结果说明链路实际能跑到 928 Mbit/s,基本是千兆网卡的极限,链路没问题。如果这里只有 90 Mbit/s 左右,那问题就清楚了,大概率是:
- 网线只有 4 芯(百兆线),或者水晶头没压好,协商到了 100M。
- 网卡或交换机端口被强制限速在 100M。
- 中间某个设备是百兆口。
加个 -R 参数可以测反向(服务端往客户端方向),有时候双向速率差很多,能发现网线质量问题:
iperf3 -c 192.168.1.10 -R
用 iperf3 测完如果带宽正常,但实际应用还是慢,那基本可以排除物理链路,转而去查应用层、磁盘 IO 或者协议本身的问题。这也是排错里很重要的一步:先把“网络”这个嫌疑犯洗清,再去查别的。
四、tcpdump:抓包看真相,眼见为实
前面三个工具都在“间接推断”,tcpdump 是直接抓包,把每个包的内容扒给你看。当你怀疑是某个服务在捣乱、或者想看 TCP 到底发生了什么时,它是终极武器。
最基础的抓包,抓某块网卡上所有流量:
sudo tcpdump -i eth0
流量多的时候屏幕会狂刷,一般配合过滤条件用。比如只看某台主机:
sudo tcpdump -i eth0 host 192.168.1.50
看某个端口:
sudo tcpdump -i eth0 port 443
我最常用的是排查 TCP 重传。重传就是发了包对方没确认、又发了一遍,这是“卡顿”最直接的元凶之一。抓包时加 -n 关掉域名解析,看输出里有没有重复的 seq 序号:
sudo tcpdump -i eth0 -n tcp
14:32:01.223456 IP 192.168.1.10.52341 > 192.168.1.50.22: Flags [.], seq 2001:3441, ack 1, win 501, length 1440
14:32:01.223789 IP 192.168.1.10.52341 > 192.168.1.50.22: Flags [.], seq 2001:3441, ack 1, win 501, length 1440
看到两条一模一样的 seq 序号重复出现,就是重传了。重传多了说明这条链路在丢包,或者对端处理不过来。这时候再回到 mtr 和 iperf3 去定位是哪一段丢的、带宽够不够。
不想实时盯屏幕,就把结果存成文件,事后慢慢分析:
sudo tcpdump -i eth0 -w /tmp/capture.pcap
-w 存成 pcap 文件,之后可以用 tcpdump -r /tmp/capture.pcap 读,也能丢给 Wireshark 图形化分析。抓包文件会涨得很快,记得抓完就停(Ctrl+C),别让它无限写下去占满磁盘。
五、一套固定的排查顺序
最后把这些工具串成一套固定流程,遇到“网络卡 / 慢 / 丢包”就按这个顺序走:
- ping 网关 → 不通查物理层(网线、网卡、交换机)。
- ping 内网 + 外网 → 判断问题在内网还是上游。
- mtr 外网目标 → 丢包在哪一跳,是线路还是目标。
- iperf3 两端对测 → 真实带宽够不够,排除物理链路。
- tcpdump 抓包 → 看 TCP 重传,找“卡”的直接证据。
按这个顺序走一遍,大多数问题在第二步、第三步就能定位了,根本轮不到重启路由器。
写在最后
网络排错说到底是个“缩小范围”的活儿。工具不在多,在会用:ping 看通不通,mtr 看卡在哪,iperf3 看带宽够不够,tcpdump 看包到底发生了什么。四件套装好,以后家里网络再出幺蛾子,你就能有条不紊地查,而不是靠玄学重启。
如果你在 homelab 里还遇到过什么诡异的网络问题,欢迎留言,咱们一起研究。
