连接控制与逐跳语义
Connection 是逐跳(hop-by-hop)头,只在当前这一跳有效,代理转发时必须处理而不能原样透传。它有双重作用:一是用 keep-alive 或 close 表示本连接是否复用,二是把某些头标记为「仅本跳专用」——被列进去的头名及其对应字段都不能再转发给下一跳,这是理解代理行为的关键。
基本信息
| 方向 | 请求与响应都可出现 |
|---|---|
| 规范 | RFC 9110 §7.6.1,持久连接见 RFC 9112 §9.3 |
| 常见取值 | keep-alive(复用)、close(用完即关)、upgrade(协议升级) |
| 其它用法 | 列出本跳专用的头名,如 Connection: X-Trace-Id,代理须删掉 X-Trace-Id |
| HTTP/2 及以上 | 该头被禁用,连接管理由协议自身承担 |
逐跳头清单
| 字段 | 作用 | 转发时 |
|---|---|---|
| Connection | 连接管理并标记其它逐跳头 | 必须移除 |
| Keep-Alive | 空闲超时与最大请求数提示 | 必须移除 |
| Proxy-Authenticate 与 Proxy-Authorization | 代理层认证 | 不得转发给源站 |
| TE 与 Trailer | 传输编码与尾部字段协商 | 按下一跳能力重写 |
| Transfer-Encoding 与 Upgrade | 分帧与协议升级 | 由代理按需要重设 |
连接管理示例
连接管理示例
curl -si -H 'Connection: close' https://example.com/ | head -3
# HTTP/1.1 200 OK
# connection: close ← 本连接用完即关
curl -s -o /dev/null -w '%{num_connects} %{time_total}\n' https://example.com/ # 观察复用效果
# 代理侧常见写法:proxy_set_header Connection ""; 清空后交给上游决定典型使用场景
- 调优反向代理与后端的连接复用策略,降低建连开销
- 排查「上游收到多余自定义头」:确认代理是否清理了 Connection 列出的字段
- 协议升级(WebSocket)时理解 Upgrade 与 Connection 的配合
- 压测时区分连接复用与每请求新建连接两种模式的性能差异
代理转发时必须移除 Connection 及其列出的字段:若上游把自定义头写进 Connection: X-Foo,仍转发 X-Foo 就等于把逐跳语义泄漏给下一跳,可能被用作请求走私的构造材料。
HTTP/1.0 默认短连接,keep-alive 是其时代的显式开启手段;HTTP/1.1 默认持久连接,所以现代客户端很少主动发送该头,为兼容老代理仍常见于配置模板里。