网络排错实战: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),别让它无限写下去占满磁盘。

五、一套固定的排查顺序

最后把这些工具串成一套固定流程,遇到“网络卡 / 慢 / 丢包”就按这个顺序走:

  1. ping 网关 → 不通查物理层(网线、网卡、交换机)。
  2. ping 内网 + 外网 → 判断问题在内网还是上游。
  3. mtr 外网目标 → 丢包在哪一跳,是线路还是目标。
  4. iperf3 两端对测 → 真实带宽够不够,排除物理链路。
  5. tcpdump 抓包 → 看 TCP 重传,找“卡”的直接证据。

按这个顺序走一遍,大多数问题在第二步、第三步就能定位了,根本轮不到重启路由器。

写在最后

网络排错说到底是个“缩小范围”的活儿。工具不在多,在会用:ping 看通不通,mtr 看卡在哪,iperf3 看带宽够不够,tcpdump 看包到底发生了什么。四件套装好,以后家里网络再出幺蛾子,你就能有条不紊地查,而不是靠玄学重启。

如果你在 homelab 里还遇到过什么诡异的网络问题,欢迎留言,咱们一起研究。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注