Page 213 - Web性能权威指南
P. 213
• 客户端通过发送 HEADERS 帧来发起新流(图 12-7),这个帧里包含带有新流 ID 的
公用首部、可选的 31 位优先值,以及一组 HTTP 键-值对首部;
• 服务器通过发送 PUSH_PROMISE 帧来发起推送流,这个帧与 HEADERS 帧等效,但它
包含“要约流 ID”,没有优先值。
܈ ૌ႙ Քኾ
ୁՔ๎ޙ
ᆫံኵ
և
图 12-7:带优先值的 HEADERS 帧
这两种帧的类型字段都只用于沟通新流的元数据,净荷会在 DATA 帧中单独发送。同
样,由于两端都可以发起新流,流计数器偏置:客户端发起的流具有偶数 ID,服务
器发起的流具有奇数 ID。这样,两端的流 ID 不会冲突,而且各自持有一个简单的
计数器,每次发起新流时递增 ID 即可。
由于流的元数据与应用数据是单独发送的,因此客户端和服务器可以分别
给它们设定不同的优先级。比如,“控制流量”的流优先级可以高一些,但
只将其应用给 DATA 帧。
12.4.2 发送应用数据
创建新流并发送 HTTP 首部之后,接下来就是利用 DATA 帧(图 12-8)发送应用数
据。应用数据可以分为多个 DATA 帧,最后一帧要翻转帧首部的 END_STREAM 字段。
܈ ૌ႙ Քኾ
ୁՔ๎ޙ
ኡ৫ࢁ
图 12-8:DATA 帧
数据净荷不会被另行编码或压缩。编码方式取决于应用或服务器,纯文本、gzip 压
缩、图片或视频压缩格式都可以。既然如此,关于 DATA 帧再也没有什么新东西好说
了!整个帧由公用的 8 字节首部,后跟 HTTP 净荷组成。
198 | 第 12 章