【Envoy 数据面】HCM 与 Codec:HTTP/1·2·3、流生命周期与编解码错误

💡 原文中文,约6100字,阅读约需15分钟。
📝

内容提要

本文介绍Envoy HTTP连接管理器(HCM)与编解码器(Codec)的作用:HCM将字节流转为HTTP事件,处理日志、追踪等;Codec屏蔽HTTP/1、2、3协议差异,统一为stream模型。强调区分连接与流生命周期,错误排查需先检查编解码和ALPN,再考虑Router。

🔎

延伸解读

连接与流:排查时先分清层级

文章强调,HTTP/2 下连接存活不代表所有 stream 成功,单 stream 可能因错误或超时被 reset,而连接仍正常。排查时应区分 connection 级与 stream 级日志字段,避免将 H2 的 stream 错误误判为连接故障。

流销毁条件:上游协议决定生命周期

流的销毁依赖上游协议与是否启用 independent half-close:HTTP/1 上游在响应结束时即可销毁;HTTP/2/3 且开启独立半关闭时,需两侧 end-stream 且响应成功。配置超时或重试前,应先确认上游协议与半关闭设置,否则可能空转。

协议错误排查:先看编解码与 ALPN

连接建立后立即出现协议错误,通常源于下游 codec 选错或 ALPN 与 FilterChain 不匹配,而非 Router 问题。排查时应先检查编解码配置与 ALPN 协商,再考虑路由层。

自动协议选择:区分未尝试与失败回落

AutoHttpConfig 依赖 ALPN 与 Alt-Svc 选择协议,允许回落。观测时需区分“从未尝试 H3”与“尝试失败后回落”,否则可能将网络 UDP 策略误判为 Envoy 不支持 H3。

Q&A

Envoy中HCM和Codec分别负责什么?

HCM(HTTP连接管理器)是内置的network filter,负责将原始字节翻译成HTTP级消息与事件,并处理access log、request ID、tracing、首部处理、路由表管理、统计等共性工作。Codec则负责将HTTP/1、HTTP/2、HTTP/3等不同线协议统一为协议无关的stream/request/response形态,使上层可以以stream思维工作。

Envoy中Connection和Stream的生命周期有什么区别?

Connection是传输会话,HTTP/1常为1请求序列,H2/H3可多stream;其销毁条件包括空闲超时、GOAWAY、reset、对端关闭、排水等。Stream是请求-响应逻辑通道,其销毁条件依赖上游协议和independent half-close设置:若启用且上游为H2/H3,需两侧end-stream且响应成功;若上游为H1或未启用独立半关闭,响应结束即可销毁,未完成的请求可能被reset。

在Envoy中,为什么H2连接存活但单个stream可能失败?

因为H2连接是多路复用的,一个连接上可以承载多个stream。连接存活不代表所有stream都成功,单个stream可能因错误、超时或对端reset而失败,但连接仍然健康。因此排查问题时需区分connection级和stream级字段。

Envoy中如何排查连接建立后立即出现的协议错误?

连接建立后立即出现协议错误,应首先检查下游codec选择是否正确以及ALPN与FilterChain是否匹配。如果ALPN不匹配或codec选错,会导致协议错误。排除编解码和ALPN问题后,再考虑Router等其他因素。

Envoy中HCM的路由表是如何配置的?多个listener共享吗?

HCM的路由表来源有两种:静态配置或通过RDS动态下发。每个HCM实例持有自己的路由表视图,多个listener或多个HCM不会自动共享同一张表。因此修改RDS后某个listener未生效,应核对哪个HCM订阅了哪个route config name。

Envoy中HTTP/1、HTTP/2、HTTP/3的codec如何统一?

Envoy通过Codec API将HTTP/1、HTTP/2、HTTP/3的线协议统一为协议无关的stream/request/response形态。HTTP/1的串行或pipelining被翻译成类似HTTP/2的stream视图,HTTP/2原生支持多路复用,HTTP/3基于QUIC,但都映射到同一套stream事件,使上层过滤器无需感知具体协议。

Envoy中自动协议选择(AutoHttpConfig)是如何工作的?

自动协议选择(AutoHttpConfig)依赖ALPN和Alt-Svc。对于TCP,通过ALPN在H2和H1之间择优;对于H3,依赖alternate protocol缓存或Alt-Svc广告,并可能对QUIC和TCP做短窗口并行尝试。机制允许回落,观测时需区分从未尝试H3和尝试失败后回落。

Envoy中HCM的header sanitizing有什么安全风险?

HCM会进行header sanitizing,清理不可信下游首部。但过滤器可能再次修改首部,这种交互存在安全风险,官方文档警告清理只完整适用一次。配置header操作时需注意顺序,不能假设每个过滤器都看到原始下游头。

🏷️

标签

➡️

继续阅读