延迟:一个总数说明不了任何事
一、为什么要分四段
"Claude 好慢"这句话背后有四种完全不同的原因,修法也完全不同:
| 段 | 量的是什么 | 慢了说明 | 怎么修 |
|---|---|---|---|
| DNS | getaddrinfo 返回耗时 | 解析器慢,或者 DNS 请求本身被绕了一大圈 | 换解析器;关掉不必要的 split-DNS |
| TCP | 三次握手完成耗时 | 到出口节点的物理距离 / 拥塞。这一段基本就是一个 RTT | 换出口节点 |
| TLS | 握手完成耗时 | 正常是 1~2 个 RTT。明显高于 TCP 段的倍数 → 链路丢包在重传 | 换节点或换协议;查丢包 |
| 首字节(TTFB) | 请求发出到收到第一个字节 | 服务端在算,或者中间代理在排队 | 这一段你改不动,只能确认不是自己的问题 |
只有一个总数的时候,这四种情况长得一模一样。
一个真实的读法示例(探测 api.anthropic.com):
DNS 3 ms 2%
TCP 98 ms 8%
TLS 143 ms 12%
首字节 920 ms 79%
79% 花在首字节上 —— 意味着换节点几乎没用:网络这一段(TCP+TLS)总共 才 241 ms,剩下的时间在对面。这时候去折腾代理配置是白费功夫。
反过来,如果 TCP 占了 60%,那就是纯粹的距离问题,换个近的节点立刻见效。
二、这个工具怎么量
不用 requests / urllib,用裸 socket + ssl 自己走一遍,因为:
- 高层库拿不到分段耗时;
- 拿不到这条 TCP 实际连到了哪个对端地址 —— 在 fake-ip 环境里, 这个地址和 DNS 查出来的完全是两回事;
- 要能在同一个进程里既走直连、又走系统代理,用来对比两条路径。