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

•   应用可以在自身的代码中明确发起服务器推送。这种情况要求与 HTTP 2.0 紧密
                 耦合,但开发人员有控制权。
               •   应用可以通过额外的 HTTP 首部向服务器发送信号,列出它希望推送的资源。这
                 样可以将应用与 HTTP 服务器 API 分离。比如 Apache 的 mod_spdy 能够识别
                 X-Associated-Content 首部,这个首部中列出了希望服务器推送的资源。
               •   服务器可以不依赖应用而自动学习相关资源。服务器可以解析文档,推断出要
                 推送的资源,或者可以分析流量,然后作出适当的决定。比如服务器可以根据
                 Referer 首部收集依赖数据,然后自动向客户端推送关键资源。

               当然,以上只是各种可能策略中的几个,但由此也可以知道可能性是很多的:可能
               是手工调用低级 API,也可能是一种全自动的实现。类似地,服务器应不应该重复
               推送相同的资源,还是应该实现一个更智能的策略?服务器可以根据自身的模型、
               客户端 cookie 或其他机制,智能推断出客户端缓存中有什么资源,然后再作出推送
               决定。简言之,服务器推送领域将爆出各种创新。

               最后还有一点,就是推送的资源将直接进入客户端缓存,就像客户端请求了似的。
               不存在客户端 API 或 JavaScript 回调方法等通知机制,可以用于确定资源何时到达。
               整个过程对运行在浏览器中的 Web 应用来说好像根本不存在。

               12.3.8 首部压缩

               HTTP 的每一次通信都会携带一组首部,用于描述传输的资源及其属性。在 HTTP
               1.x 中,这些元数据都是以纯文本形式发送的,通常会给每个请求增加 500~800 字
               节的负荷。如果算上 HTTP  cookie,增加的负荷通常会达到上千字节(参见 11.5 节
              “度量和控制协议开销”)。为减少这些开销并提升性能,HTTP  2.0 会压缩首部元数
               据:

               •   HTTP 2.0 在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,
                 对于相同的数据,不再通过每次请求和响应发送;
               •   首部表在 HTTP 2.0 的连接存续期内始终存在,由客户端和服务器共同渐进地更新 ;
               •   每个新的首部键-值对要么被追加到当前表的末尾,要么替换表中之前的值。

               于是,HTTP  2.0 连接的两端都知道已经发送了哪些首部,这些首部的值是什么,从
               而可以针对之前的数据只编码发送差异数据(图 12-5)。










               192   |   第 12 章
   202   203   204   205   206   207   208   209   210   211   212