经验驱动。本文所有命令输出都来自本机真实执行(Windows 下同名命令,语义一致)。网络问题最忌”瞎重启”,按 OSI 分层一层层验,五分钟定位。下面是我常用的四件套和真实读数。

排查总思路:从下往上

遇到”连不上”,别急着改配置。按层查:

  1. 物理/网卡层:网卡 up 吗?IP 拿到了吗?(ip addr / ipconfig)
  2. 网络层(L3):到目标 IP 通不通?(ping)
  3. 路由层:包走哪条路、卡在第几跳?(traceroute / tracert)
  4. 传输层(L4):端口开没开?握手到哪步?(telnet / nc / curl / tcpdump)
  5. 应用层(L7):TLS 握成功了吗?HTTP 状态码对吗?(curl -v)

下面用真实数据演示。

1. ping:网络层通不通

1
2
3
4
5
正在 Ping 8.8.8.8 ... 来自 8.8.8.8 的回复: 时间=204ms TTL=107
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),平均 = 206ms

正在 Ping github.com [140.82.113.3] ... 时间=270ms TTL=44
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),平均 = 270ms

怎么读:

  • 0% 丢失 + 有回包 = 网络层通。
  • TTL=107 / 44:每过一个路由器 TTL 减 1,起点通常是 128 或 64,反推经过约 21 跳(128-107)到达 8.8.8.8,约 84 跳到达 github(64-44 或 128-44 取决于起点)。TTL 异常小可能说明路径绕远或有环路。
  • github 比 8.8.8.8 慢(270ms vs 206ms):跨国链路正常。

踩坑:ping 通 ≠ 服务可用。ping 只证明 ICMP 通,不代表 TCP 端口通。很多服务器禁 ICMP(ping 不通但服务正常),也有的 ping 通但端口被防火墙挡。下一步必须用端口级工具验。

2. traceroute:卡在第几跳

1
2
3
4
5
6
7
8
9
通过最多 8 个跃点跟踪到 github.com [140.82.113.3]:
1 2 ms 192.168.0.1 # 家用网关
2 3 ms 192.168.1.1 # 光猫/上级
3 11 ms 111.112.252.1 # 运营商入口
4 20 ms 124.224.19.65
5 * * * 请求超时。
6 25 ms 218.21.11.217
7 * * * 请求超时。
8 * * * 请求超时。

踩坑:中间跳出现 * 超时,多半是那一跳的路由器禁了 ICMP(不回 TTL 超时报文),不代表链路断了——能看到后面 6 跳有正常回包就说明包还在往前走。真要判断断点,看连续多跳全 * 且之后再无响应,那才是断了。

3. curl -v:应用层 + TLS 握手分阶段计时

1
2
3
curl ... -w "http_code=%{http_code} dns=%{time_namelookup}s \
connect=%{time_connect}s tls=%{time_appconnect}s total=%{time_total}s"
→ http_code=200 dns=0.000080s connect=0.001184s tls=0.266321s total=0.671067s

这是我最爱用的”一句话体检”:

  • dns=0.00008s:DNS 解析几乎瞬间(走了本地缓存/代理)。慢的话查 resolver。
  • connect=0.001s:TCP 三次握手 1ms,传输层没问题。
  • tls=0.266s:TLS 握手 266ms,HTTPS 的主要开销在这。握手慢查证书链/密码套件/中间证书是否完整。
  • total=0.67s:整体 670ms,其中 TLS 占 40%。

踩坑:只盯 http_code 会漏掉”连上了但握手慢”的问题。-w 把各阶段拆开,哪段慢一目了然。

4. netstat:端口与连接真相

真实枚举本机监听端口(节选):

1
2
3
4
5
6
LISTENING:
TCP 0.0.0.0:135 # RPC
TCP 0.0.0.0:445 # SMB
TCP 127.0.0.1:10809 # 本机代理
TCP 127.0.0.1:8096 # 某本地服务
TCP 127.0.0.1:4000 # 开发服务器

真实 ESTABLISHED 连接里能看到大量到 *:443 的外连(浏览器/ agents 在和远端 HTTPS 通信),以及一堆 127.0.0.1:10809 的本地回环(代理转发)。

怎么读:

  • LISTENING:服务在等连接。看到 0.0.0.0:端口 是对所有网卡开放,127.0.0.1:端口 只本机可连(更安全)。
  • ESTABLISHED:已有活跃连接。排查”连到哪了”就在这看远端 IP:端口。
  • TIME_WAIT 一堆:短连接高发,端口回收中,一般无害;太多才考虑 tcp_tw_reuse。
  • **服务起不来报”地址已占用”**:先 netstat -ano | findstr :端口 找到 PID,再决定杀掉还是换端口。

面试常考点

  • 分层排查顺序:网卡 → IP → ICMP → 路由 → 端口 → 应用/TLS,别跳步。
  • ping 不通的三类原因:禁 ICMP(服务正常)、网络真断、防火墙挡。要结合 traceroute/curl 区分。
  • TCP 握手卡在哪:SYN 无响应=网络/防火墙挡;SYN-ACK 无 ACK=客户端侧问题;能连但应用无响应=L7 问题。
  • TIME_WAIT vs CLOSE_WAIT:TIME_WAIT 是主动关闭方正常态;CLOSE_WAIT 堆积往往是应用没正确关连接(代码 bug 信号)。

小结

网络排查的核心是把”连不上”拆成可观测的每层指标。本机真跑让我确认了几个日常易错点:ping 通不等于端口通、traceroute 的 * 大多是 ICMP 被禁而非断链、curl -w 的分阶段计时比单看 http_code 有用得多、netstat 里 0.0.0.0 和 127.0.0.1 开放范围差别很大。把这些变成肌肉记忆,线上排障就不再是玄学。