通用(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_STREAMSEND/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] 大请求体是否使用,超时时间多长,失败降级策略。
  • [重试与幂等] 对 ECONNRESETConnection: close502/503 等的重试规则;非幂等请求的防重机制。

作为 HTTP/1.1 服务端需要明确

  • [Keep-Alive] 公布 keep-alive: timeout, max 策略,避免每次请求都 Connection: close
  • [读写超时] 读首部超时、读体超时、写超时;慢请求处理策略。
  • [请求/头部上限] 最大头部大小、最大请求体、最大并发连接。
  • [100-continue] 是否支持/建议,超时时间。

最后修改于 2025-12-29 10:37