握手延迟的分解方法
建连总耗时可以拆成三段:请求从客户端发出到抵达服务端、服务端处理并返回响应、响应返回到客户端。在两端同时抓包把这三段分别量出来,就能判断「连接为什么慢」究竟是网络问题还是服务端问题。
基本信息
| 适用平台 | 两端均可抓包的链路,Wireshark 或 tcpdump 都可以 |
|---|---|
| 拆解方法 | 客户端量总时长,服务端量内侧处理时长 |
| 关键观测点 | 服务端发出响应的时刻,用来切分网络与服务端 |
| 注意事项 | 两侧时钟未同步时需先做基准平移 |
典型使用场景
- 归因建连延迟:把总耗时拆成网络与服务端两部分
- 排查队列问题:服务端内侧耗时长时查看监听队列与负载
- 跨区域对比:比较不同区域的网络往返差异
- 验证网络变更:调整路由或链路后对比往返变化
- 排查中间设备:负载均衡自身的处理时间也会被算进去
分解示例
分解示例
# 客户端:SYN 到 SYN-ACK 用时 320 毫秒
# 服务端:收到 SYN 到发出 SYN-ACK 用时 3 毫秒
# 结论:网络往返约 317 毫秒
# 若服务端内侧也是 300 毫秒,则应查队列与负载结果判读
| 客户端耗时 | 服务端内侧耗时 | 结论 |
|---|---|---|
| 大 | 小 | 网络往返慢 |
| 大 | 大 | 服务端处理慢 |
| 小 | 大 | 服务端本地异常 |
| 小 | 小 | 两侧都不慢,应看后续阶段 |
服务端发出响应的时刻是区分「网络慢」与「服务端慢」的关键观测点。只有客户端侧数据时,无法把这两种情况分开。
两侧时钟未同步时,用一次已知的往返时延做基准平移,再对比其余时间点,比直接相减可靠得多。
链路中间有负载均衡时,要先约定「服务端」指的是负载均衡还是真实后端。口径不一致会让两侧的对比失去意义,也容易把负载均衡的排队时间算到后端头上。