通用(Client/Server 共识)
- [超时预算] 明确连接/读/写/总超时。给出默认值与误差容限。
- [幂等性与重试] 哪些请求允许重试;非幂等请求是否要求
Idempotency-Key/事务号;服务端去重窗口多大。 - [代理/网关] 是否有 Nginx/Envoy/Ingress,公布其 keep-alive、空闲回收、最大头部、最大并发、压缩等配置。
- [可观测性] 日志必须含:连接标识、错误类型、关闭原因;指标:连接数、重试次数、GOAWAY 计数、错误分布。
- [版本协商] 是否 TLS/ALPN(h2/h1.1)、是否 h2c(明文 HTTP/2),对端支持矩阵。
作为 HTTP/2 客户端(调用方)需要明确
- [并发流限制] 读取服务器
SETTINGS_MAX_CONCURRENT_STREAMS,并限制并发请求数。 - [连接复用策略] 连接空闲 TTL、最大请求数/最大寿命,何时主动丢弃旧连接(防止复用到半关闭连接)。
- [保活] 是否发 HTTP/2 PING(或 TCP keepalive),间隔多久,避免中间设备/NAT 回收。
- [错误分类与重试] 将
REFUSED_STREAM、对端 GOAWAY 后新流失败、CURLE_HTTP2_STREAM、SEND/RECV_ERROR等归类为“可重试一次(强制新建连接)”;实现指数退避+抖动;限制最大尝试次数。 - [头部与负载上限] 遵守服务端
max_header_list_size与单请求体大小限制,超限前就地切分或拒绝。 - [TLS/ALPN] 与服务端达成是否必须 h2(TLS+ALPN)还是允许 h2c;证书/信任链要求。
作为 HTTP/2 服务端(提供方)需要明确
- [连接保活] 公布空闲超时(例如 300s),禁止“响应后立刻 FIN/RST”。
- [优雅关停] 滚动升级/缩容时:先发 GOAWAY(合理 last-stream-id),等待 drain 窗口(例如 5–30s),再 FIN。
- [自动 GOAWAY 策略] 是否在“连接空闲 N 秒或存活超过 TTL”时主动 GOAWAY;如果在代理层实现,公布代理参数。
- [并发与窗口] 设置并公布
MAX_CONCURRENT_STREAMS(≥100 推荐)与头部限制;避免过低导致误判拥塞。 - [错误语义] 连接/流级异常用标准 HTTP/2 错误码(如
REFUSED_STREAM)帮助客户端做正确重试。 - [压缩与编码] 是否启用 gzip/br;对大响应是否建议数据分块(虽然 H2 多路复用已能缓解 HOL)。
作为 HTTP/1.1 客户端需要明确
- [Keep-Alive 策略] 是否默认长连;连接池大小、空闲 TTL、最大复用次数。
- [Expect: 100-continue] 大请求体是否使用,超时时间多长,失败降级策略。
- [重试与幂等] 对
ECONNRESET、Connection: close、502/503等的重试规则;非幂等请求的防重机制。
作为 HTTP/1.1 服务端需要明确
- [Keep-Alive] 公布
keep-alive: timeout, max策略,避免每次请求都Connection: close。 - [读写超时] 读首部超时、读体超时、写超时;慢请求处理策略。
- [请求/头部上限] 最大头部大小、最大请求体、最大并发连接。
- [100-continue] 是否支持/建议,超时时间。
最后修改于 2025-12-29 10:37