TE 是什么
TE 是请求头,声明客户端在当前这条连接上可接受的传输编码(transfer-coding),并用于表示是否愿意接收分块报文尾部的字段(trailers)。它作用在逐跳的传输语义上,与表示压缩的 Accept-Encoding 不是一回事:TE 管传输,Accept-Encoding 管内容本身(RFC 9110 §10.1.4)。
基本信息
| 名称 | TE |
|---|---|
| 方向 | 请求头 |
| 规范 | RFC 9110 §10.1.4 |
| 常见取值 | gzip、compress、deflate、trailers |
| 关键值 | trailers 表示愿意接收分块尾部字段 |
| 区分项 | Accept-Encoding 管表示压缩,Transfer-Encoding 管报文自身编码 |
典型使用场景
- gRPC 与移动端:客户端用 TE: trailers 接收尾部状态字段
- 网关配置:确认代理是否转发 TE 并保留 trailer
- 协议实现者:分离传输编码与内容编码两套逻辑
- 排障:分块响应丢失尾部字段的根因定位
- 性能分析:判断传输层压缩是否被链路支持
- 兼容性测试:模拟不同 TE 取值观察服务端行为
取值与验证
取值与验证
# 声明接受分块报文的尾部字段(gRPC 等协议的常见写法)
TE: trailers
# 表示层压缩由另一个头协商,两者含义不同、不能互相替代
Accept-Encoding: gzip, br
# 观察服务端是否按 TE 返回尾部字段
curl -sv --raw https://api.example.com/stream 2>&1 | grep -iE 'trailer|transfer-encoding'编码相关头部对照
| 头部 | 作用范围 | 典型值 |
|---|---|---|
| TE | 逐跳传输能力协商 | trailers |
| Transfer-Encoding | 报文自身的传输编码 | chunked |
| Accept-Encoding | 表示层压缩协商 | gzip、br |
| Content-Encoding | 实体实际使用的压缩 | gzip、br |
除 trailers 之外的取值(gzip 等)在实际实现中几乎被忽略;写解析器时仍需按语法兼容,避免遇到旧实现直接报错。
TE 与 Transfer-Encoding 都属于逐跳头,代理必须自行处理,不能原样透传给下游。
若链路中有代理不支持 trailer,gRPC 这类依赖尾部状态传输的协议会直接失败,因此上线前必须做端到端验证。
客户端若在 TE 里声明 trailers,服务端才可以发送尾部字段;没有这条声明时,服务端应当把这类元数据放到头部或改用其他机制。
TE 默认是可选协商,服务端不响应也不会报错;排查「尾部字段消失」时应同时检查请求里的 TE 与链路上每个代理的转发配置。