连通性自检:四层定位卡在哪

"打不开"这三个字信息量太少。它可能是域名没解析出来,也可能是 TCP 连不上、TLS 握手失败,或者服务端返回了错误。每一层的处理方式完全不同,跳过定位直接重装,是最常见的浪费。

按下面四层往下走,每层给出明确的判断标准,两分钟能定位。

第一层:DNS 解析

dig +short example.com
# 或
nslookup example.com

判断:返回空、超时、或者返回的是一个明显不对的 IP(比如 0.0.0.0、127.0.0.1),就是 DNS 层的问题。

常见原因:本地 DNS 不可用、被投毒、或者代理接管了 DNS 但上游挂了。先换一个 DNS(223.5.5.5 / 1.1.1.1)对比一次,能通说明是原 DNS 的问题。

第二层:TCP 连接

nc -vz -w 5 example.com 443
# 或
curl -v --connect-timeout 5 https://example.com 2>&1 | head -5

判断:

输出含义
Connection refused对端拒绝,端口没开或被防火墙拒
Operation timed out包发出去没回应,中间被丢
succeededTCP 通,往下一层

超时和拒绝是完全不同的两件事:拒绝说明有设备明确回了一个 RST,超时说明包被吞了。前者查服务端,后者查链路和防火墙。

第三层:TLS 握手

openssl s_client -connect example.com:443 -servername example.com < /dev/null 2>&1 | head -15

判断:能看到 Verify return code: 0 就是正常。certificate verify failed 说明证书链有问题(过期、域名不匹配、缺中间证书)。

这一层失败的表现是浏览器报"您的连接不是私密连接",但 TCP 是通的。很多人把它当成"网络不通",其实是证书问题。

第四层:应用层

curl -o /dev/null -s -w "code:%{http_code} ttfb:%{time_starttransfer}\n" https://example.com

判断:能看到 code:200 就说明链路全通,问题是页面本身(资源加载、JS 报错、登录态)。

如果 code 是 4xx/5xx,问题在服务端,不在网络。

四层的时间特征

还有个更快的判断方法:看卡在哪一步的时间上。

  • time_namelookup 高 → DNS 慢
  • time_connect 高 → TCP 慢(链路或服务端)
  • time_appconnect 高 → TLS 慢
  • time_starttransfer 高 → 服务端处理慢
curl -o /dev/null -s -w "dns:%{time_namelookup} conn:%{time_connect} tls:%{time_appconnect} ttfb:%{time_starttransfer}\n" https://example.com

一行命令,四个数字,直接告诉你卡在哪。

💡 顺序不能反:先 DNS 再 TCP,先 TCP 再 TLS。反着查会在上层看到"失败"的假象,因为底层根本没通。

延伸阅读:DNS 泄露怎么自测、延迟怎么测才准、端口被占用怎么排查。