本页目录
协议演进与兼容
协议部署后就很难改了——TCP 固定 header 导致扩展花了十年,TLS 中间件对未知扩展的 buggy 行为导致 ossification。QUIC 从设计之初就内置版本协商和 GREASE(随机插入无意义扩展)对抗中间件僵化——这是所有新协议的必修课。
概述
协议不是一成不变的——部署后就很难改了。HTTP/1.1 headers 的文本灵活性使其可以无痛添加新特性(Cache-Control, CORS),但 TCP 的固定 header 导致扩展困难(TCP Fast Open 花了 10 年才普及)。QUIC 从设计之初就内置了版本协商和 GREASE(随机插入无意义扩展)——对抗中间件对未知字段的 buggy 行为造成的 protocol ossification。所有新设计的协议都应该实现 GREASE 和明确的扩展点。
Forward vs Backward
Forward compatible (新 client, 旧 server):
未知字段: skip (protobuf, TLV)
未知 frame type: ignore (HTTP/2)
→ 实现: "be liberal in what you accept"
Backward compatible (旧 client, 新 server):
默认值填充
版本号协商
capability 位图 (TLS cipher suites)
协商与 Fallback
GREASE
问题: 中间件 (防火墙, NAT) 只认识它知道的 byte pattern
→ 新 protocol extension → 被丢弃 (不认识) → protocol 无法演进
GREASE: 客户端随机插入无意义的 extensions/values:
TLS: random cipher suites in ClientHello
HTTP/2: random SETTINGS parameters
QUIC: random transport parameters
目的: 中间件必须正确处理 unknown values (ignore, not reject)
→ 未来真正的 extension 不会被中间件阻塞
QUIC 的教训
参考
- GREASE: RFC 8701
- QUIC Appendix A: RFC 9000 (design rationale)
Keywords: forward compatibility, backward compatibility, GREASE, ossification, QUIC, Alt-Svc