页面能打开、状态码是 200,但等了好几秒才看到内容。这种情况用「能不能打开」去判断没用,200 只说明服务器把响应给你了,跟你等了多久没有关系。先看五段耗时里哪一段占比最大,比盯着状态码有用。

下面这组数据是 2026-11-09 22:12 从一台国内服务器上测的,两条命令、两个站点,都返回 200:

站点 状态码 DNS 建连 TLS TTFB 总耗时 响应体
https://t.bt.cn/http/2005ms10ms43ms57ms63ms68.9KB
https://www.example.com/2006ms204ms412ms821ms1.02s577B

第二行就是典型的「200 但慢」:响应体只有 577 字节,TTFB 却要 821 毫秒。页面小,说明不是图片和脚本拖的;时间花在服务端回第一个字节之前。只看状态码,这两个站没有区别。

先把五段耗时打出来

``bash curl -o /dev/null -s \ -w 'http=%{http_code} dns=%{time_namelookup} conn=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total} size=%{size_download}\n' \ https://你的域名/ ``

各字段的口径:

  • time_namelookup:DNS 解析完成
  • time_connect:TCP 建连完成(含 DNS)
  • time_appconnect:TLS 握手完成(含前面两步)
  • time_starttransfer:收到第一个字节,即 TTFB(含前面三步)
  • time_total:整个请求结束,含响应体下载

它们是从零开始累计的,不是分段。要看某一段花多久,做减法:TLS 段 = time_appconnect - time_connect,首字节等待 = time_starttransfer - time_appconnect,下载 = time_total - time_starttransfer。

用上面 example.com 那行算:TLS 段约 208 毫秒,首字节等待约 409 毫秒,下载约 200 毫秒。总耗时一秒钟,其中四成是在等服务器开口。

200 之下,四种慢法对应不同位置

首字节等待长、响应体小。 请求已经到达服务端,服务端过了很久才回第一个字节。查后端处理、数据库查询、上游接口、缓存是否命中。上面 example.com 的 409 毫秒属于这一档。

下载段长。 首字节来得快,后面拉得慢。看响应体大小、是否开了压缩、是否走了 CDN。一个 5MB 的 HTML 和 50KB 的 HTML,下载段能差两个数量级。

TLS 段长。 建连后握手占了大部分时间。常见原因是证书链不完整、客户端要额外去取中间证书,或者线路质量差导致多几个往返。用 openssl s_client -connect 域名:443 -servername 域名 -showcerts 看返回几张证书,只有一张就是没下发中间证书。

五段都不长,浏览器还是慢。 这时传输层已经没问题,慢在解析 HTML、执行脚本、加载第三方资源。curl 测不到这些,要用浏览器开发者工具的网络面板看。

判断之前,先排除三种假象

只测了一个节点。你这里快,不代表别的地区快。要判断是不是局部问题,用多地区多运营商节点对照,看慢的是某一条线路还是全部。

宝塔拨测对 t.bt.cn/http/ 的快速测速结果:全部节点平均 0.222s,最快 0.041s,最慢 0.96s

200 只说明 HTTP 层通了;TCP、TLS、首字节、下载任何一段出问题,状态码都可能是 200。

这次测量的边界

以上数据来自一台国内服务器、2026-11-09 22:12 的一次请求,只代表那一条线路。example.com 的 821 毫秒 TTFB 是这次观察到的结果,具体原因未进一步验证,不能推给所有访问者。

如果你手上只有「用户说慢」这一条信息,先让他把状态码和总耗时发过来,再决定查哪一层。没有这两个数,后面的判断都只能靠猜。