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