网站测速打开很慢但状态码200:先看五段耗时占比
页面能打开、状态码是 200,但等了好几秒才看到内容。这种情况用「能不能打开」去判断没用,200 只说明服务器把响应给你了,跟你等了多久没有关系。先看五段耗时里哪一段占比最大,比盯着状态码有用。
下面这组数据是 2026-11-09 22:12 从一台国内服务器上测的,两条命令、两个站点,都返回 200:
| 站点 | 状态码 | DNS | 建连 | TLS | TTFB | 总耗时 | 响应体 |
|---|---|---|---|---|---|---|---|
| https://t.bt.cn/http/ | 200 | 5ms | 10ms | 43ms | 57ms | 63ms | 68.9KB |
| https://www.example.com/ | 200 | 6ms | 204ms | 412ms | 821ms | 1.02s | 577B |
第二行就是典型的「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 测不到这些,要用浏览器开发者工具的网络面板看。
判断之前,先排除三种假象
只测了一个节点。你这里快,不代表别的地区快。要判断是不是局部问题,用多地区多运营商节点对照,看慢的是某一条线路还是全部。

200 只说明 HTTP 层通了;TCP、TLS、首字节、下载任何一段出问题,状态码都可能是 200。
这次测量的边界
以上数据来自一台国内服务器、2026-11-09 22:12 的一次请求,只代表那一条线路。example.com 的 821 毫秒 TTFB 是这次观察到的结果,具体原因未进一步验证,不能推给所有访问者。
如果你手上只有「用户说慢」这一条信息,先让他把状态码和总耗时发过来,再决定查哪一层。没有这两个数,后面的判断都只能靠猜。