解法
HTTP/1.1为每个请求打开一个新连接,或者复用少数几个连接,迫使浏览器为每个站点打开大约六个并行连接。每个连接都要单独握手,一个响应慢会阻塞后面的其他请求。网络之所以慢,是结构性的原因,而非技术性的。
谷歌的SPDY证明了解决方案:保持HTTP的方法、头和状态码完全不变,但将流量移到一个承载多个多路复用流的单一连接上。IETF采纳了这项工作,并将其标准化为RFC 7540中的HTTP/2,采用二进制分帧和HPACK头压缩。
由于语义保持相同,服务器和浏览器无需重新考虑HTTP请求的含义就能接纳它。传输层发生了变化,但契约未变,因此每个站点都免费获得了提速。
取得了什么结果
冻结HTTP的语义;在一个连接上运行多个流。
为什么有效
因为HTTP语义未动,现有服务器无需改变应用程序写响应的方式就能增加支持。
一个连接承载多个流消除了六个连接的瓶颈,也省去了每个资源都有的连接建立开销。
HPACK压缩了重复的头,因此相同的cookie和user-agent字段不会在每次请求中重复发送。
服务器推送允许服务器在客户端请求之前发送资产,省去了一次往返。
可以借鉴什么
即使语义不变,保持兼容的传输层也能获胜;保持契约,更换管道。
后续
RFC 7540于2015年5月定稿,并成为几乎所有HTTPS流量的默认协议。其遗留的主要问题是TCP队头阻塞,这直接导致了QUIC和HTTP/3的出现。HTTP/2还引发了请求走私和2023年发现的HTTP/2快速重置DoS模式。
从这里,追溯依据
参考来源
- RFC 7540: Hypertext Transfer Protocol Version 2 (HTTP/2) IETF / RFC Editor · rfc-editor.org
- HTTP/2 Wikipedia · en.wikipedia.org