阶段五 · 进程与网络

网络诊断工具

一句话总结

网络排查的思路是从下往上分层定位:先看通不通(ping),再看域名解析对不对(dig),然后看端口开没开(ss,nc),最后看应用层响应(curl).
每个工具对应网络栈的一层,出问题时逐层往上排查.

分层排查的思路

"网站打不开"是个模糊的故障描述,背后可能是十几种原因.高效排查的关键是不要乱猜,按网络分层顺序逐层验证--每一层都有对应的诊断命令.

排查网络就像查一条断了的供水管:
先确认水厂到小区通不通(ping),门牌号查得对不对(DNS 解析),水龙头开没开(端口监听),最后才是水质好不好(应用响应).
从下游往上游一段段排,而不是一上来就拆水龙头.

┌──────────┐
│ 网站打不开 │
└──────────┘


┌──────────┐
│ ping 通吗? │
└──────────┘
│ "不通"

┌───────────────────────────────┐
│ 网络/路由问题 · ping · traceroute │
└───────────────────────────────┘
┌──────────┐
│ 域名解析对吗? │
└──────────┘
│ "错"

┌───────────────────────────┐
│ DNS 问题 · dig · nslookup │
└───────────────────────────┘
┌──────────┐
│ 端口开着吗? │
└──────────┘
│ "没开"

┌──────────────────────┐
│ 服务没起/防火墙 · ss · nc │
└──────────────────────┘
┌───────────────────┐
│ 应用层排查 · curl -v │
└───────────────────┘

ping:连通性的第一道探针

ping 向目标主机发送 ICMP 回显请求包,看对方是否应答,以此判断"网络层是否可达"以及往返延迟(RTT).它是排查的第一步,也是最快的"通不通"判断.

$ ping -c 4 google.com          # -c 4 只发 4 个包就停(不加会一直发)
PING google.com (142.250.4.100): 56 data bytes
64 bytes from 142.250.4.100: icmp_seq=0 ttl=116 time=12.3 ms
64 bytes from 142.250.4.100: icmp_seq=1 ttl=116 time=11.8 ms
...
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss
round-trip min/avg/max = 11.8/12.1/12.3 ms

三个关键读数:

  • packet loss(丢包率):0% 才健康,持续丢包说明链路不稳
  • time(延迟):同城几毫秒,跨国上百毫秒属正常;突然飙高说明网络拥塞
  • ttl:Time To Live,每过一个路由器减 1,可粗略估算中间跳了几个路由

ping 不通 ≠ 网站挂了

很多服务器(包括部分大厂)主动屏蔽 ICMP 来防止被扫描--这时 ping 超时,但 HTTP 服务完全正常.所以 ping 不通只能说明"ICMP 不可达",不能直接判定服务死了,要结合 curl 等应用层工具一起看.

dig / nslookup:DNS 解析排查

域名(如 example.com)最终要被解析成 IP 地址才能连接.这一步出错,表现往往是"某些机器能访问,某些不能"或"刚改了 DNS 还没生效".dig(Domain Information Groper)是排查 DNS 的标准工具,比老旧的 nslookup 输出更清晰.

$ dig example.com

;; ANSWER SECTION:
example.com. 3600 IN A 93.184.216.34
# ↑TTL ↑记录类型 ↑解析出的 IP

# 只要答案,不要一堆元信息:+short
$ dig +short example.com
93.184.216.34

# 查指定类型的记录
$ dig MX gmail.com +short # 邮件服务器记录
$ dig AAAA example.com +short # IPv6 地址记录

# 指定用某个 DNS 服务器解析(绕过本地 DNS 验证是否本地缓存问题)
$ dig @8.8.8.8 example.com +short

常见的 DNS 记录类型:

类型 含义
A 域名 → IPv4 地址(最常见)
AAAA 域名 → IPv6 地址
CNAME 别名,指向另一个域名
MX 邮件交换服务器
TXT 任意文本,常用于域名验证,SPF 等
NS 该域名的权威 DNS 服务器

如果 dig example.com 解析出旧 IP,但 dig @8.8.8.8 example.com 是新 IP,说明是本地的 DNS 缓存还没过期,而非 DNS 配置错误.这个对比是排查"改了 DNS 不生效"的关键一招.

ss / netstat:看端口与连接

服务进程要对外提供功能,得监听某个端口(如 Web 服务监听 80/443)."端口到底有没有被监听"是排查"连接被拒绝"的核心.ss(socket statistics)是现代 Linux 的首选,比已被淘汰的 netstat 快得多.

# 最常用组合:看所有 TCP 监听端口及对应进程
$ ss -tlnp
# │││└ p: 显示进程名/PID
# ││└ n: 端口显示为数字,不解析成服务名
# │└ l: 只看 listening 监听状态
# └ t: TCP(u 则是 UDP)

State Recv-Q Local Address:Port Process
LISTEN 0 0.0.0.0:22 users:(("sshd",pid=789))
LISTEN 0 127.0.0.1:5432 users:(("postgres",pid=1024))

注意监听地址的区别--这是高频踩坑点:

监听地址 含义
0.0.0.0:80 监听所有网卡,外部机器可访问
127.0.0.1:5432 只监听本机回环,外部连不上(常见的"本地能连,远程拒绝"原因)
# 查某个端口被谁占用了("端口已被占用"报错的排查)
$ ss -tlnp | grep ":8080"

# 看所有已建立的连接
$ ss -tn state established

nc(netcat):端口连通性测试

ping 测的是"主机可达",但真正关心的常常是"这个端口能不能连上".nc(netcat,网络瑞士军刀)可以直接探测 TCP/UDP 端口是否开放,不依赖 ICMP.

# 测试目标主机的 443 端口能否连通:-z 只扫描不发数据,-v 显示详情
$ nc -zv example.com 443
Connection to example.com port 443 [tcp/https] succeeded!

# 一次扫一段端口
$ nc -zv 192.168.1.10 20-25

# 本机起一个临时监听端口(配合另一端 nc 连过来,可验证防火墙是否放行)
$ nc -l 9000

ping 是敲整栋楼的大门问"有人在吗",nc 是直接敲某个房间号(端口)问"这间屋开门吗".
服务排查关心的几乎总是后者--具体端口通不通.

traceroute:追踪路由路径

当 ping 延迟异常或不通,traceroute 能告诉你数据包在哪一跳卡住了.它利用 TTL 逐跳递增的技巧,让沿途每个路由器都回报自己,从而画出完整路径.

$ traceroute google.com
1 192.168.1.1 1.2 ms # 家用路由器
2 100.64.0.1 8.5 ms # ISP 网关
3 * * * # 这一跳超时(可能屏蔽了探测,未必有问题)
4 142.250.4.100 12.3 ms # 到达目标

某一跳之后持续全是 * * * 且到不了终点,基本就是那一跳的链路出了问题.单独某跳超时通常是该路由器禁了探测包,不必紧张.

curl / wget:应用层请求

排查到最上层--HTTP 应用层,主角是 curlwget.两者都能发请求,但定位不同:

工具 定位
curl 万能 HTTP 客户端,调试 API,看响应头的首选,默认输出到屏幕
wget 专注下载文件,支持断点续传,递归下载整站

curl:调试 HTTP 的利器

# 最有用的排查命令:-v 显示完整的请求/响应头和 TLS 握手
$ curl -v https://example.com

# 只看响应头,不要 body:-I(HEAD 请求)
$ curl -I https://example.com
HTTP/2 200
content-type: text/html
server: nginx

# 调用 API:POST 一段 JSON
$ curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name":"alice"}'

# 跟随重定向(-L),静默模式只看 body(-s)
$ curl -sL https://example.com -o page.html

# 只打印 HTTP 状态码(脚本里做健康检查常用)
$ curl -s -o /dev/null -w "%{http_code}" https://example.com
200

curl -v 是 HTTP 排查的瑞士军刀

加上 -v,curl 会把 DNS 解析结果,连接的 IP,TLS 证书信息,完整请求头和响应头全部打出来."HTTPS 报证书错误""请求带没带对 header""重定向到哪去了"这类问题,一个 curl -v 几乎都能看明白.

wget:下载专精

# 下载文件,自动保存为原文件名
$ wget https://example.com/file.zip

# 断点续传(-c),大文件中断后接着下
$ wget -c https://example.com/bigfile.iso

# 后台下载(-b),输出写进 wget-log
$ wget -b https://example.com/bigfile.iso

速记:调试用 curl,下载用 wget

要看 API 响应,调头,测状态码 → curl;要把文件抓到本地,断点续传,整站镜像 → wget.两者功能有重叠,但记住这个分工就够日常使用.

快速回顾

  • 分层排查:连通性 → DNS → 端口 → 应用,从下往上逐层定位,不要乱猜
  • ping:测连通性和延迟,看丢包率和 RTT;但 ICMP 常被屏蔽,ping 不通 ≠ 服务挂了
  • dig +short:查 DNS 解析,@8.8.8.8 指定服务器可区分"本地缓存"还是"真没解析"
  • ss -tlnp:看监听端口和进程;注意 0.0.0.0(对外) vs 127.0.0.1(仅本机)的区别
  • nc -zv 主机 端口:精确测试某端口通不通,比 ping 更贴近真实排查需求
  • traceroute:追踪路由路径,定位"卡在哪一跳";单跳 * * * 多为禁探测,不必紧张
  • curl 调试 HTTP/API(-v 看全过程,-I 看头,-w 取状态码),wget 专注下载(-c 断点续传)

动手练习

  1. 延迟对比:用 ping -c 4 分别 ping 一个国内站点和一个国外站点,对比延迟差异
  2. DNS 解析:用 dig +short 查一个网站的 A 记录,再用 dig @8.8.8.8 对比,看是否一致
  3. MX 记录:用 dig MXgmail.comqq.com 的邮件服务器记录
  4. 端口监听:用 ss -tlnp 看本机有哪些端口在监听,找出 SSH(22)和正在跑的服务
  5. 端口探测:用 nc -zv 测试某个网站的 80 和 443 端口是否开放,再随便测一个肯定关闭的端口对比输出
  6. HTTP 状态码:用 curl -I 看某网站的响应头,再用 curl -s -o /dev/null -w "%{http_code}" 只取状态码
  7. 路由追踪:用 traceroute(macOS 自带)追踪到某个国外网站的路径,数一数中间经过几跳