外观
命令行网络诊断
「网断了」其实是十几种不同故障的统称:网卡没拿到地址、拿到了但出不去、出得去但域名解析不了、解析正常但某个端口被挡。
界面上它们长得一样,都是「无法连接」。命令行的价值就在于逐层排除,把范围缩小到一段。这一篇给出一条固定的检查顺序。
开始之前
本文命令绝大多数只读,只有清除 DNS 缓存一条需要 sudo 并会改变状态(影响很小,下文说明)。图形界面层面的处理见Wi-Fi 连上但没有网。
诊断输出里会包含你的 IP 地址、网关地址、路由器名称。贴出来求助前先脱敏,至少去掉公网 IP。
第一层:本机有没有地址
sh
ifconfig en0ifconfig 显示网络接口配置,en0 通常是第一个以太网/无线接口。关注两行:status: active 表示链路是通的;inet 192.168.x.x 是拿到的 IPv4 地址。
不确定哪个接口在用:
sh
networksetup -listallhardwareportsnetworksetup 是 macOS 管理网络设置的命令行工具,这个子命令列出所有硬件端口和对应的设备名(en0、en1……)。Wi-Fi 对应的那一项写着 Hardware Port: Wi-Fi。
只想要 IP 地址:
sh
ipconfig getifaddr en0没有输出就说明这个接口没有拿到地址。故障到此为止,后面几层不用查了——先解决连接本身:重新连 Wi-Fi、检查网线、确认路由器 DHCP 是否正常。
地址以 169.254. 开头也属于这一类:那是自动分配的本地链路地址,意思是「没能从路由器拿到地址,自己编了一个」。
第二层:能不能到网关
sh
netstat -rn | grep defaultnetstat -rn 显示路由表(-r 路由,-n 不做名称解析,输出更快),grep default 取默认路由那一行。后面跟的地址就是你的网关,通常是路由器。
sh
ping -c 4 192.168.1.1把地址换成你实际的网关。ping 发送探测包,-c 4 表示发 4 个就停(不加会一直发下去)。
通了说明本机到路由器这一段没问题。不通则问题在本地网络内,和运营商、DNS 都无关。
第三层:能不能出去
sh
ping -c 4 1.1.1.1用 IP 地址而不是域名,是为了把 DNS 排除在外。这一步通了、下一步不通,就能确定问题出在域名解析上。
想看卡在哪一跳:
sh
traceroute 1.1.1.1traceroute 逐跳显示数据包经过的路由器。中间某些跳显示 * * * 是正常的(那些设备不响应探测),持续到结尾都不通才说明有问题。
第四层:域名能不能解析
sh
dig apple.comdig 是 DNS 查询工具。关注 ANSWER SECTION,里面是解析结果。没有答案段,或者 status: 不是 NOERROR,就是解析出了问题。
指定用某台 DNS 服务器查,用来区分「域名本身有问题」和「你当前的 DNS 有问题」:
sh
dig @1.1.1.1 apple.com@服务器地址 指定查询哪台 DNS。换一台就正常,说明你当前用的 DNS 有问题。
看系统当前用的是哪些 DNS:
sh
scutil --dns | grep nameserverscutil 查询系统配置,--dns 显示 DNS 配置。输出里可能有多组,对应不同网络接口。
清除 DNS 缓存
确认是缓存了旧记录时:
sh
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder两条命令用分号分隔,依次执行。前者清空目录服务缓存,后者给负责 DNS 解析的 mDNSResponder 进程发送 HUP 信号让它重新加载(killall 按名字发信号,-HUP 是挂起信号,惯例上表示「重新加载配置」)。
影响是接下来一小段时间内解析会略慢——缓存要重建。这不是万能修复手段,只在你确实改过 hosts 文件、或者某个域名刚换过 IP 时才有意义。把它当作通用「网络修复」步骤是没有依据的。
第五层:端口通不通
前四层都正常,但某个服务连不上,查具体端口:
sh
nc -zv apple.com 443nc(netcat)尝试建立连接,-z 表示只探测不发送数据,-v 显示结果。成功会打印 succeeded。
443 是 HTTPS 端口,22 是 SSH,5432 是 PostgreSQL。这条命令能区分「服务器没开这个端口」和「中间有东西挡住了」。
看本机哪些程序占用了端口:
sh
sudo lsof -i -P -n | grep LISTENlsof 列出打开的文件(网络连接也算),-i 只看网络相关,-P 不把端口号转成服务名,-n 不做地址反查(这两个都是为了快)。grep LISTEN 只留正在监听的。
这是排查「端口已被占用」的标准做法,比重启服务有效得多。
测速与响应
sh
networkQuality这是 macOS 自带的测速工具。除了上下行速率,它还给出 RPM(每分钟往返次数)——衡量网络在满负载时的响应质量。
这个指标比单纯的带宽更贴近实际体验:视频会议卡顿、网页加载慢,很多时候不是带宽不够,而是响应差。带宽很高但 RPM 很低,说明路由器存在缓冲区膨胀,和你买多大的宽带无关。
按 man networkQuality 的说明,测试会实际连接互联网并消耗流量,用移动热点时注意这一点。
一张排查顺序表
| 步骤 | 命令 | 不通说明什么 |
|---|---|---|
| 1 | ipconfig getifaddr en0 | 没连上网络或没拿到地址 |
| 2 | ping 网关 | 本地网络有问题 |
| 3 | ping 1.1.1.1 | 出口或运营商有问题 |
| 4 | dig apple.com | DNS 有问题 |
| 5 | nc -zv 主机 端口 | 特定服务或端口被挡 |
按顺序走,不要跳步。 跳到第 4 步发现解析失败就去换 DNS,而实际原因是第 1 步就没拿到地址——这种误判很常见。
检查结果
网络正常时,这四条应当都有正常输出:
sh
ipconfig getifaddr en0
ping -c 2 1.1.1.1
dig +short apple.com
nc -zv apple.com 443+short 让 dig 只输出解析结果,适合快速确认。
动手练习
制造一次可控的故障,验证你能定位它:
- 网络正常时,把上面四条命令的输出各存一份作为基线。
- 在「系统设置 → 网络 → Wi-Fi → 详细信息 → DNS」里,把 DNS 改成一个不存在的地址(如
192.0.2.1),记得先抄下原设置。 - 重新跑那四条命令,确认第 1、2 条正常而
dig失败——你成功地把故障定位在了第四层。 - 执行
dig @1.1.1.1 apple.com,确认换一台 DNS 就正常,进一步坐实结论。 - 把 DNS 设置改回原样,重新验证。
成功标准是第 3 步:你能只凭命令输出判断故障在哪一层,而不是逐个尝试网上的「修复方法」。网络慢而不是断的情况,见网络慢或时断时续。