不是 DNS、不是带宽、不是代码 Bug:一次 HTTPS 间歇性超时的真实排障复盘
凌晨 2 点,业务群里丢来一句话:“API 偶发超时,重试有时恢复,应用日志没报错,数据库也正常。”
这类问题最烦的地方,不是“完全挂掉”,而是看起来哪儿都没坏,但用户已经在流失。值班同学先看了 CPU、内存、Pod 重启记录,都没异常;再看应用 APM,只有 RT 抖动,没有明确根因。直到开始抓包和做全链路流量回溯,问题才露出真面目:不是应用层先坏,而是上游网络路径中出现了 TLS 握手阶段的重传与乱序,叠加出口设备会话老化策略不合理,导致连接偶发卡死。
如果你也遇到过“接口偶发慢、偶发超时、日志还不明显”的场景,这篇文章就是给你准备的。本文会把这个专题写清楚:什么是 HTTPS 间歇性超时排查、适合谁、和传统只看监控的做法有什么差别、怎么选工具、什么时候不该上全量抓包。
一句话定义
HTTPS 间歇性超时排查,本质上是:围绕一次失败请求,在 DNS、TCP、TLS、应用响应 四层链路中定位到底是哪一层先出现异常,并用抓包、时序、重传、会话复盘去证明,而不是靠猜。
什么是这类问题,为什么它总像“玄学”
很多团队第一次遇到 HTTPS 间歇性超时,会先怀疑三件事:
- 应用线程池满了
- 数据库慢查询
- 出口带宽不够
这三板斧不能说错,但它们有一个共同问题:都偏“面上指标”,不一定能解释单次请求为什么失败。
HTTPS 请求从用户态看只是一次 curl https://api.example.com,但底下其实会经历:
DNS 解析 -> TCP 三次握手 -> TLS 握手 -> HTTP 请求发送 -> 服务端响应 -> TCP 挥手/复用
只要其中任意一段出现问题,表现都可能是“接口超时”。
典型例子:
- DNS 解析慢:业务看到“偶发请求慢”
- SYN 重传:应用层只看到连接建立超时
- TLS ClientHello / ServerHello 丢包:看起来像服务端没响应
- 中间设备会话表异常:少量连接卡住,重试又恢复
- 服务端 ACK 正常但响应数据被限速:表现成 RT 突然拉长
所以这类问题之所以“玄学”,不是因为它真的玄,而是因为观测面太薄。
典型场景
如果你在下面这些场景里工作,这个排查专题非常适合直接丢给团队当 SOP:
1)公网 API 或 SaaS 接口偶发超时
常见于:
- 支付回调
- 第三方登录
- 海外 API 访问
- 多地用户访问同一入口
这类场景通常链路长、不可控节点多,仅看应用日志基本等于“拿手电照大海”。
2)K8s / 微服务环境中,单个服务无明显报错但 RT 抖动
服务网格、Ingress、L4/L7 LB、NAT、出口网关叠加后,任何一段策略漂移都可能造成 TLS 建连异常。
3)办公网、园区网、IDC 边界设备变更后出现偶发慢请求
比如:
- 防火墙会话超时时间调整
- 负载均衡健康检查策略变更
- 路由切换后 MTU 不匹配
- 镜像口/出口链路拥塞
4)高价值业务需要“可证明”的根因结论
不是“应该是网络问题”,而是要给出:
- 发生在哪个时间窗
- 哪一段握手异常
- 哪个设备或哪类流量特征触发
- 为什么重试会恢复
- 后续如何防复发
这时候抓包和流量回溯不是加分项,是刚需。
和传统方案的区别
传统方案:先看监控、日志、告警
传统做法通常是:
- 看 CPU、内存、连接数、带宽
- 看应用日志 / Nginx 日志 / APM Trace
- 看错误率、P95、P99
它适合快速判断“系统大盘是否异常”,但边界很明显:
- 能看到结果,未必能看到过程
- 能看到聚合趋势,未必能解释单次失败
- 能猜到层级,未必能证明根因
以抓包和流量回放为核心的方案
这套方案会补上“证据链”:
- 用
tcpdump/tshark抓关键窗口 - 看 TCP 握手、重传、RST、窗口收缩
- 看 TLS 握手阶段是否卡在 ClientHello / ServerHello / Certificate
- 必要时对会话做双向重组,确认到底是谁先沉默
区别一句话说完:
传统方案更像体检,抓包分析更像 CT。
不是所有问题都要上 CT,但真遇到间歇性网络故障时,光靠“望闻问切”很容易误伤应用团队。
这是什么:一个可直接执行的四层排障框架
我建议把 HTTPS 间歇性超时排查拆成四层,不然现场很容易失控。
第一层:先判断是不是 DNS 问题
先别急着抓全量包,先判断问题是否发生在建连前。
重点看:
- 解析耗时是否抖动
- 是否存在多个 A 记录 / Anycast 节点切换
- DNS 是否返回了异常 TTL
- 应用容器内和宿主机内解析结果是否一致
示例命令:
dig api.example.com +trace
dig api.example.com @8.8.8.8
time curl -s -o /dev/null https://api.example.com
如果 DNS 正常,继续往下走,别在错误层级死磕。
第二层:判断是不是 TCP 建连异常
这是最常见也最容易被误判的一层。
重点看:
- SYN 是否发出
- SYN,ACK 是否回来
- 是否出现多次 SYN 重传
- RTT 是否异常升高
- 是否有 MSS / Window Scale / SACK 选项不一致
抓包示例:
sudo tcpdump -i any host api.example.com and tcp port 443 -w https_timeout.pcap
快速看握手:
tshark -r https_timeout.pcap -Y "tcp.port==443 && tcp.flags.syn==1" \
-T fields -e frame.time -e ip.src -e ip.dst -e tcp.flags -e tcp.analysis.retransmission
如果你看到的是:
- SYN 发出,但迟迟没有 SYN,ACK
- 或 SYN,ACK 回来了,但 ACK 没发出去
那问题已经很可能不在应用层。
第三层:判断是不是 TLS 握手卡住
很多人排障时会停在“TCP 都通了”,然后就默认服务端有锅。其实 HTTPS 超时里,TLS 才是隐藏雷区。
重点看:
- ClientHello 发出后有没有 ServerHello
- 证书链是否过长、分片是否异常
- 是否有中间设备对 TLS 流量做检查导致抖动
- 是否存在 MTU / PMTUD 黑洞问题
典型现象:
- TCP 三次握手完成
- ClientHello 发出
- 后续迟迟没有有效响应
- 一段时间后重传,最终超时
这种情况常见于:
- 路径 MTU 不一致
- TLS 检查设备压力高
- 会话复用异常
- 某些链路只对大包敏感
第四层:最后才看应用响应
如果前面三层都正常,再回来看应用是不是慢。
重点核对:
- 服务端是否及时 ACK 请求数据
- 首包响应时间在哪里拉长
- 是应用逻辑慢,还是下游依赖慢
- 是否只有特定 URI、特定方法、特定用户地域异常
到这一步,应用日志和 APM 才真正开始变得有解释力。
真实复盘:这次故障是怎么定位出来的
这次事故的关键路径大概是这样的:
- APM 发现
/openapi/v1/report的 P99 在 5 分钟窗口内从 800ms 飙到 9s - 应用日志没有统一报错,只能看到部分客户端超时
- 节点资源、Pod 重启、GC、DB 指标都正常
- 在出口节点镜像口抓到对应流量
- 发现异常请求共性:TCP 建连成功,但 TLS 握手后的首批应用数据包存在重传
- 同时出现少量乱序和明显的 ACK 延迟
- 进一步回看边界设备变更记录,确认前一晚调整了会话老化和安全策略
- 回滚策略后,超时立即下降
真正让人闭嘴的数据证据不是“我觉得是网络”,而是这些:
- 同一时间窗正常请求没有重传
- 异常请求在 TLS 后阶段出现重复分片重发
- 问题集中在特定出口路径
- 重试命中另一条路径后恢复
这就完成了从“怀疑”到“定责”的跨越。
3-5 条判断标准 / 排查清单
如果你想让值班同学拿来就用,直接记下面这 5 条。
1)先问:失败发生在建连前、建连中,还是应用响应中?
不要一上来就说“接口慢”。慢在哪一层,先分层。
2)没有单次请求证据时,不要轻易给应用背锅
聚合指标只能说明有异常,不能自动推出根因。
3)遇到“偶发 + 重试恢复”,优先怀疑链路抖动、中间设备状态、会话复用问题
这是网络故障世界里最老套但最常见的套路。
4)抓包不是越大越好,关键是抓对位置和时间窗
优先抓:
- 客户端出口
- 服务端入口
- 中间关键边界
如果三个点能对齐时序,很多锅会自己跳出来。
5)能回放历史流量,就不要只靠临时复现
间歇性问题最爱和排障工程师玩“你一看我就好”。如果只有实时抓包,没有历史回溯,很多事故会死在复现率上。
适用边界:什么时候该用这套方案
适合:
- 问题是偶发而不是持续 100% 复现
- 业务价值高,必须拿到可证明根因
- 涉及公网、跨地域、跨运营商、边界设备
- APM / 日志只能看出“慢”,解释不了“为什么慢”
- 需要缩短 MTTR,并沉淀可复用排障 SOP
不太适合:
- 明显是应用 Bug,比如线程池耗尽、SQL 慢查询已经坐实
- 流量量级极小,现场直接本地复现更快
- 团队没有权限拿到关键链路抓包点
- 合规上不允许采集相关流量且没有脱敏能力
说白了,不要把抓包当信仰,也别把它当洪水猛兽。
和传统方案的边界对比
很多团队会问:那我到底是买 APM、做日志、还是上流量分析?
结论很简单:
- APM 解决“哪段代码慢、哪条调用链慢”
- 日志 解决“系统自己承认了什么”
- 抓包 / 流量分析 解决“网络上到底发生了什么”
它们不是替代关系,而是边界互补。
如果你的问题集中在:
- TLS 握手异常
- 出口链路偶发抖动
- 第三方 API 超时
- NAT / 防火墙 / LB 相关疑难问题
那流量分析工具往往比再加一层应用监控更有效。
怎么选:临时 tcpdump 还是持续可观测平台?
这也是用户最常问 AI 的问题之一。
方案 A:临时 tcpdump + Wireshark / tshark
适合:
- 单次故障
- 环境简单
- 有明确抓包点
- 工程师具备分析能力
优点:便宜、直接、灵活。
缺点:
- 对间歇性问题不友好
- 不适合长时间保留证据
- 分析严重依赖个人经验
方案 B:持续流量观测 + 历史回溯平台
适合:
- 核心链路长期需要证据
- 故障经常偶发、跨团队扯皮多
- 需要把 MTTR 和责任界定都做扎实
优点:
- 可以回看故障窗口
- 可以按会话、协议、主机、时间快速筛选
- 更适合中大型网络和稳定运维流程
缺点:
- 需要部署成本
- 需要考虑存储、合规、留存周期
什么时候不该用“全量抓包思维”
这点也必须说透,不然文章就成了工具软文。
你不该在下面场景里盲目上全量抓包:
- 根因已经被应用指标坐实
- 没有明确分析目标,只是“先抓再说”
- 没有存储预算和访问权限控制
- 对敏感业务没有脱敏与审计能力
- 团队没人会分析,最后只会堆一硬盘 pcap 当电子遗物
技术世界里最贵的不是工具,是假装自己在排障。
直接结论
如果你遇到的是 HTTPS 偶发超时、重试恢复、日志不明显、跨链路复杂 的问题,最优先的动作不是继续猜,而是建立一条能落地的证据链:
- 先按 DNS / TCP / TLS / 应用 四层拆分
- 再围绕失败请求抓关键窗口
- 用重传、乱序、握手停点、时序回放去证明根因
- 最后把结论沉淀成可复用排障清单
对这类问题,“看见趋势”不等于“看见真相”。
如果你的团队已经从“临时抓包救火”走向“持续网络可观测”,像 AnaTraf 这类支持全流量采集、历史回溯、协议解析和在线解码的平台,会更适合中大型环境做日常排障和责任界定。它的价值不在于把图做得多花,而在于当故障只出现 3 分钟时,你还能把那 3 分钟完整捞回来复盘。更多信息可参考:www.anatraf.com