Page 206 - Web性能权威指南
P. 206

把资源直接插入到文档中,就是把资源直接推送给客户端,而无需客户端请求。在
                 HTTP  2.0 中,唯一的不同就是可以把这个过程从应用中拿出来,放到 HTTP 协议本
                 身来实现,而且还带来了如下好处:

                 •   客户端可以缓存推送过来的资源;
                 •   客户端可以拒绝推送过来的资源;
                 •   推送资源可以由不同的页面共享;
                 •   服务器可以按照优先级推送资源。


                            所有推送的资源都遵守同源策略。换句话说,服务器不能随便将第三方资
                            源推送给客户端,而必须是经过双方确认才行。

                 有了服务器推送后,HTTP  1.x 时代的大多数插入或嵌入资源的做法基本上也就过时
                 了。唯一有必要直接在网页中插入资源的情况,就是该资源只供那一个网页使用,
                 而且编码代价不大;此处仍然可以参考 11.7 节“嵌入资源”。除此之外,所有应用
                 都应该使用 HTTP 2.0 服务器推送。



                                               PUSH_PROMISE
                   所有服务器推送流都由 PUSH_PROMISE 发端,它是除了对原始请求的响应之外,服
                   务器向客户端发出的有意推送所述资源的信号。PUSH_PROMISE 帧中只包含要约
                  (promise)资源的 HTTP 首部。
                   客户端接收到 PUSH_PROMISE 帧之后,可以视自身需求选择拒绝这个流(比如,已
                   经缓存了相应资源),而这是对 HTTP 1.x 的一个重要改进。嵌入资源作为针对
                   HTTP 1.x 的一种流行“优化技巧”,实际上无异于“强制推送”:客户端无法取消
                   这种“推送”,而且也不能个别地缓存嵌入的资源。

                   最后再说一说服务器推送的几点限制。首先,服务器必须遵循请求 - 响应的循环,
                   只能借着对请求的响应推送资源。也就是说,服务器不能随意发起推送流。其次,
                   PUSH_PROMISE 帧必须在返回响应之前发送,以免客户端出现竞态条件。否则,就
                   可能出现比如这种情况:客户端请求的恰好是服务器打算推送的资源。



                 实现HTTP 2.0服务器推送
                 服务器推送为优化应用的资源交付提供了很多可能。然而,服务器到底如何确定哪
                 些资源可以或应该推送呢?与确定优先级类似,HTTP  2.0 标准也没有就此规定某种
                 算法,所以实现者就拥有了解释权。自然地,也就有可能出现多种策略,每种策略
                 可能会考虑一种应用或服务器使用场景。



                                                                              HTTP 2.0   |   191
   201   202   203   204   205   206   207   208   209   210   211