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 章
   208   209   210   211   212   213   214   215   216   217   218