网络排查常用命令
线上出问题,第一步往往不是翻代码,而是先判断"网络通不通、连到哪、卡在哪"。掌握一套排查命令,就等于拥有了定位网络故障的"听诊器"。本文以 Linux/macOS 为主,自底向上串讲最常用的工具。
排查思路:分层检查
建议按 OSI 自底向上逐层排查,常用命令的出场顺序如下表:
| 关注点 | 命令 | 想确认的问题 |
|---|---|---|
| 连通性 | ping | 目标主机是否可达、延迟多大 |
| 路由路径 | traceroute | 数据包在哪一跳丢失 |
| 本机网络 | ip addr / ifconfig | IP、掩码、网卡状态是否正确 |
| 端口与连接 | ss / netstat | 端口是否在监听、连接处于什么状态 |
| 域名解析 | nslookup / dig | 域名是否解析到正确的 IP |
| 应用层 | curl | 接口/网页是否真的返回了期望内容 |
连通性与路径:ping、traceroute
ping 用 ICMP 探测目标是否可达,并统计丢包率与往返时延。注意:ping 不通不等于服务挂了,也可能是对方防火墙禁 ping。
ping -c 4 www.example.com
# 输出:4 packets transmitted, 4 received, 0% packet loss, rtt avg 12.3 ms
traceroute www.example.com
# 输出:逐跳显示 1 网关 → 2 运营商骨干 → … → 目标,某跳出现 * * * 就在附近排查
traceroute 的原理是逐次把 IP 报文的 TTL 加 1,利用路由器"丢弃超时包并回 ICMP 报错"来画出整条路径,可快速判断故障是在内网、运营商骨干还是目标机房。
端口与连接:ss、netstat
服务到底起没起来、端口是否被占,看这里最直接。Linux 推荐用更快、信息更全的 ss。
ss -tlnp # 列出所有正在监听的 TCP 端口及对应进程
# 输出:LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("java",pid=1234))
netstat -ant # 查看所有 TCP 连接及状态
ss -tn state established | wc -l # 统计当前已建立的连接数
# 输出:37
要会读关键状态:
- LISTEN:端口已被进程监听,说明服务已启动。
- ESTABLISHED:连接正常建立。
- SYN_SENT / TIME_WAIT / CLOSE_WAIT 大量堆积:往往是网络不通或代码未正确关闭连接。
域名解析:nslookup、dig
用域名访问失败、但用 IP 直连成功时,多半是 DNS 出了问题。
nslookup www.example.com
# 输出:Name: www.example.com / Address: 93.184.216.34
dig www.example.com +short
# 输出:93.184.216.34
dig 还能指定 DNS 服务器查询(dig @8.8.8.8 www.example.com),并显示 TTL、权威服务器等细节,是排查"DNS 缓存过期 / 被污染"的首选工具。
应用层验证:curl
链路全部通畅但接口仍报错时,用 curl 模拟真实请求,能直接看到状态码与耗时分布:
curl -v http://localhost:8080/api/users
# 输出:* Connected to localhost (127.0.0.1) port 8080 / < HTTP/1.1 200 OK
curl -o /dev/null -s -w "DNS:%{time_namelookup}s TCP:%{time_connect}s 总计:%{time_total}s 状态:%{http_code}\n" \
https://www.example.com
# 输出:DNS:0.021s TCP:0.055s 总计:0.321s 状态:200
-w 可分别打印 DNS 解析、TCP 连接、TLS 握手、总耗时等指标,一眼看出瓶颈在网络层还是应用层。
抓包兜底:tcpdump(了解)
命令行排查到底仍无结论时,抓包是最权威的手段:
sudo tcpdump -i eth0 tcp port 80 -c 10
# 输出:逐条打印 80 端口上的 TCP 报文(含 SYN/ACK/FIN 标志)
小结:排查讲究"先分层、再动手"——ping 看连通、traceroute 看路径、ss 看端口、nslookup 看解析、curl 看应用;照这条链路走一遍,绝大多数网络问题都能被定位到具体环节。