Page 212 - Web性能权威指南
P. 212
知道了帧类型,解析器就知道该如何解释帧的其余内容了。HTTP 2.0 规定了如下帧
类型。
• DATA:用于传输 HTTP 消息体。
• HEADERS:用于传输关于流的额外的首部字段。
• PRIORITY:用于指定或重新指定引用资源的优先级。
• RST_STREAM:用于通知流的非正常终止。
• SETTINGS:用于通知两端通信方式的配置数据。
• PUSH_PROMISE:用于发出创建流和服务器引用资源的要约。
• PING:用于计算往返时间,执行“活性”检查。
• GOAWAY:用于通知对端停止在当前连接中创建流。
• WINDOW_UPDATE:用于针对个别流或个别连接实现流量控制。
• CONTINUATION:用于继续一系列首部块片段。
服务器可以利用 GOAWAY 类型的帧告诉客户端要处理的最后一个流的 ID,
从而消除一些请求竞争,而且浏览器也可以据此智能地重试或取消“悬着
的”请求。这也是保证复用连接安全的一个重要和必要的功能!
前述各种类型帧的具体实现在很大程度上取决于服务器和客户端开发商,他们需要
考虑流量控制、错误处理、连接终止等细节。好在,所有这些内容在官方标准中都
有论述。好奇的话,可以查阅一下最新的草案。
既然有了这个分帧层,即使它对我们的应用不可见,我们也应该更进一步,分析一
下两种最常见的工作流:发起新流和交换应用数据。只有明白了一个请求或响应如
何转换成一个一个的帧,才能理解 HTTP 2.0 对性能的提升来自哪里。
固定长度与可变长度字段
HTTP 2.0 只使用固定长度字段,HTTP 2.0 帧占用带宽很少(帧首部是 8 字节)。
采用可变长度编码的确可以节省一点带宽和时延,但却无法抵偿由此带来的分析
复杂性。
即使可变长度编码能减少 50% 的带宽占用,那么在 1 Mbit/s 的连接上传输 1400 字
节的分组,也只能节省 4 字节(0.3%)和每帧不到 100 纳秒的延迟时间。
12.4.1 发起新流
在发送应用数据之前,必须创建一个新流并随之发送相应的元数据,比如流优先级、
HTTP 首部等。HTTP 2.0 协议规定客户端和服务器都可以发起新流,因此有两种可能:
HTTP 2.0 | 197