HTTP 请求生命周期与分层定位
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
HTTP(Hypertext Transfer Protocol,超文本传输协议)的一次访问不只涉及应用。先画出实际链路:
浏览器 → DNS 解析 → 建立传输连接 → TLS → HTTP 请求
↓
CDN → 负载均衡器 → 反向代理 → 应用 → 数据库
↑ ↓
浏览器渲染/脚本读取 ← 响应与浏览器策略检查 ←───────────┘DNS 是 Domain Name System(域名系统);TLS 是 Transport Layer Security(传输层安全);CDN 是 Content Delivery Network(内容分发网络)。缓存命中可能不回源;复用连接可能不重复 DNS/握手;HTTP/3 使用 QUIC 传输,不能把所有版本都画成 TCP 握手。
1. 每一步看什么#
| 阶段 | 主要证据 | 常见问题 |
|---|---|---|
| DNS | 解析结果、解析耗时 | 错误记录、分区解析、客户端缓存 |
| 连接 | 目标地址、连接耗时 | 路由、防火墙、监听端口、连接耗尽 |
| TLS | 证书域名/链、协商协议 | 证书过期、不受信任、协议不兼容 |
| 代理路由 | Host、路径、规则、入口日志 | 错目标、路径改写、入口直接拒绝 |
| 应用与依赖 | 请求关联 ID、应用耗时、数据库指标 | 排队、锁、慢查询、依赖超时 |
| 响应 | 首字节/下载耗时、状态和头 | 缓冲、带宽、截断、浏览器拦截 |
反向代理通常拆成两段连接;客户端成功完成 TLS 不证明代理到后端连接正常。
2. Hands-on:逐段测量真实入口#
准备自己负责的 HTTPS 预发布域名、一个无副作用的 GET 路径,以及 curl、dig。以下每篇的 example.com 均为占位,必须替换。
export HTTP_HOST='api.staging.example.com'
export READ_PATH='/health/ready'
dig +short "$HTTP_HOST" A
dig +short "$HTTP_HOST" AAAA
curl -sS --connect-timeout 3 --max-time 15 -o /dev/null -w 'ip=%{remote_ip} code=%{http_code} version=%{http_version}\ndns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} first=%{time_starttransfer} total=%{time_total}\n' "https://$HTTP_HOST$READ_PATH"这些时间大多从请求开始累计:新建 HTTPS 连接时,可用 connect−dns 估计连接阶段、tls−connect 估计握手阶段;first−tls 包含发送、排队、网络和服务端处理,不能直接称为应用耗时。复用、代理、重定向会改变解释;本例不自动跟随重定向。
从刚才 DNS 结果选择一个当前有效 IPv4 地址,保持域名与证书验证,只固定目的地址:
export EDGE_IP='替换为解析得到的IPv4地址'
curl -sS --connect-timeout 3 --max-time 15 --resolve "$HTTP_HOST:443:$EDGE_IP" -D - -o /dev/null "https://$HTTP_HOST$READ_PATH"若固定地址成功而正常解析失败,继续检查 DNS/地址族;不是立即认定应用有问题。通过组织网络代理访问时,先明确代理路径,不能把代理 DNS 行为误当本机行为。不要把负载均衡器临时地址写入生产配置。
3. 浏览器与服务端交叉验收#
- 浏览器 Network 查看 Timing、Remote Address、Protocol、Initiator,记录是否命中缓存或被 Service Worker 拦截。
- 对同一业务请求关联入口和应用日志;入口有记录、应用无记录时,先查路由/认证/防火墙/连接失败。
- 比较正常与故障时段,保留状态码、时间、请求 ID;不保存凭证和正文。
- 恢复时重新走正常域名、真实用户路径,确认成功率与延迟恢复;单次健康检查不足以证明业务恢复。