HTTP 连接复用、连接池与协议版本

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。

HTTP 是 Hypertext Transfer Protocol(超文本传输协议)。一次业务请求不是一条新连接;客户端到代理、代理到应用的协议和连接池也可以不同。

1. 版本和连接的差别#

版本 传输/请求方式 运维关注点
HTTP/1.1 TCP(Transmission Control Protocol,传输控制协议),通常复用连接、每条连接顺序处理请求 连接池大小、空闲关闭、排队;并行通常需要多连接
HTTP/2 TCP 上多个流并行 流并发限制、流控;底层丢包仍可影响多个流
HTTP/3 QUIC(标准化的安全多路复用传输协议)运行在 UDP 上 UDP 路径可达性、协议回退、连接迁移;不同流不因同一 TCP 字节序列阻塞

UDP 是 User Datagram Protocol(用户数据报协议)。多路复用不等于无限并发,也不消除应用排队。HTTP/2/3 不使用 HTTP/1.1 的 Connection 等逐跳头。HTTP/2、HTTP/3。

连接复用、TCP keepalive 探活、ALB 客户端连接最大存活时间、idle timeout 是不同机制;调大其中一个不能代替其余策略。

2. Hands-on:证明连接是否复用#

准备 curl 和真实只读 HTTPS 入口,先用 curl -V 查看是否编译了 HTTP2/HTTP3 支持。

export HTTP_URL='https://api.staging.example.com/health/ready'
curl -V
# 同一个 curl 进程内顺序访问两次,才有机会复用连接。
curl -sS --connect-timeout 3 --max-time 10 --http1.1 -w 'version=%{http_version} new_connections=%{num_connects} total=%{time_total}\n' -o /dev/null "$HTTP_URL" -o /dev/null "$HTTP_URL"
curl -sS --connect-timeout 3 --max-time 10 --http2 -w 'version=%{http_version} new_connections=%{num_connects}\n' -o /dev/null "$HTTP_URL" -o /dev/null "$HTTP_URL"

预期在支持复用的入口,第二次 new_connections=0。--http2 是协商请求,不保证最终为 2,必须查看输出。服务端主动关闭时第二次仍可建新连接;这不是 curl 必然出错。

若客户端和入口均支持 HTTP/3,再运行:

curl -sS --http3-only --connect-timeout 3 --max-time 10 -o /dev/null -w 'version=%{http_version}\n' "$HTTP_URL"

不支持时记录“不适用/协商失败”,不要为通过实验盲目放开防火墙。--http3-only 不自动退回旧版本;生产兼容性还需测试允许回退的客户端。

3. 连接池验收步骤#

  1. 记录应用客户端库的最大连接数、每目标上限、获取连接超时、空闲回收和最大寿命;正确关闭/读完响应体才能归还连接。
  2. 使用现有压测工具对预发布做已批准的小规模并发;同时记录连接池等待、活动连接、服务端并发和请求延迟。只看平均响应时间看不出队列问题。
  3. 若服务端延迟稳定、客户端 pool wait 增长,先找连接泄漏/池上限,而不是直接加实例。
  4. 发布时观察连接排空:HTTP/2 的 GOAWAY、新请求转新连接、旧请求完成;持续流要有最长排空时间和重连方案。
  5. 恢复原池参数,重测错误率、握手次数和尾延迟。参数上调前评估文件描述符、出口端口、代理与数据库容量。

量级估算可用“并发请求数 ≈ 每秒请求数 × 平均耗时秒数”,它不是 HTTP/2 连接数计算公式。客户端到 CDN 协商为 h3,也不能证明 CDN 到后端同样为 h3。工具参数见 curl HTTP/2。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭