BLINK:打算删除:HTTP/2和gQUIC服务器推送

2020-11-12 09:11:53

未读时间:上午6:00(3小时前)和上午6:00要么电子邮件地址对此组是匿名的,要么您需要查看成员电子邮件地址权限才能查看原始邮件。

删除接收、保存在内存中以及使用服务器发送的HTTP/2和gQUIC推送流的功能。请在每个HTTP/2和gQUIC连接开始时发送SETTINGS_ENABLE_PUSH=0,以请求服务器不发送它们。

Https://httpwg.org/specs/rfc7540.html#PushResources/2允许服务器在客户端实际请求之前“推送”客户端可能需要的资源,参见HTTP。该规范允许客户端自行拒绝推送的资源。

GQUIC是Google服务器、Akamai和Litespeed支持的非标准协议。它还允许服务器以非常类似于HTTP/2的方式推送资源。gQUIC正在被HTTP/3淘汰,最终将完全取消对它的支持。

Chrome目前支持通过HTTP/2和gQUIC处理推流,这一意图是为了移除对这两种协议的支持。*Chrome不支持通过HTTP/3推送,添加支持不在路线图中。

在HTTP/2 RFC发布近五年半后,服务器推流仍然极少使用。在过去的28天里,Chrome创建的99.95%的HTTP/2连接从未收到过推流(Net.SpdyStreamsPushedPerSession),99.97%的连接从未收到过与请求匹配的推流(Net.SpdyStreamsPushedAndClaimedPerSession)。这些数字与2019年6月的数据完全相同。99.96%的HTTP/2连接从未收到过推流。这些数字表明服务器运营商没有采取积极措施来增加推送使用率。*最重要的是,收到的推送的使用率从两年前的63.51%下降到了不到40%。其余的都是无效的,永远不会与请求匹配,或者已经在缓存中。

服务器推送很难很好地使用。Akamai公开分享了两项研究,表明通过http/2推送不会改变性能,或者在使用某些限制时略微提高性能,参见https://lists.w3.org/Archives/Public/ietf-http-wg/2019JulSep/0078.html。然而,这些研究已经进行了一年多,推送使用数据仍然不表明广泛部署,即使在Akamai的网络中也是如此。鉴于此,规模较小的服务器运营商是否有资源成功部署服务器推送是值得怀疑的。

2018年,同一个ietf呈现了一个截然不同的结果:Chrome做了一个大型实验,测量使用http/2时服务器推流对页面加载延迟的影响,结果显示,推流会增加长尾延迟,参见https://github.com/httpwg/wg-materials/blob/gh-pages/ietf102/chrome_push.pdf。

就gQUIC而言,在过去的28天里,每120万个连接中只有不到1个看到过推流。我们不知道有任何关于延迟影响的研究。

Chromium支持推送有很大的代码复杂性:推送的请求必须存储在内存缓存中,通过连接的URL查找,但前提是连接对请求是权威的,与其他参数(方法和其他头部)匹配,并在超时后被逐出。在开发无关功能时,运行相关测试会给开发人员和基础设施带来负担,而用户承担增加的二进制大小的负担。*我们认为这些好处超过了理论上的性能好处。

没有兼容性风险。服务器推送是一种性能优化,允许客户端选择拒绝任何推送的流。*为了最大限度地减少浪费的下行链路容量,Chromium会通过在初始设置框中发送SETTINGS_ENABLE_PUSH=0来取消有漏洞的服务器可能打开的推送流,方法是在初始设置框中发送SETTINGS_ENABLE_PUSH=0。但是请注意,在两年前进行的实验中,没有观察到服务器在发送此设置时发送推送。

Firefox和Safari都支持HTTP/2推送,我们不知道有任何移除的计划。

建议服务器使用<;link rel=#34;preload;>;元素通知客户端预期需要的子资源。诚然,客户端随后将需要请求这些资源,使它们比推送的资源延迟1 RTT到达。另一方面,<;link rel=#34;preload&34;>;允许客户端避免提取已缓存的资源。重复尝试分析延迟。

由于HTTP/2流多路复用的限制,服务器通常可能只发送<;link rel=";preload>;元素,否则它将阻塞连接上的其他响应。在某些情况下,103个早期提示状态代码(https://tools.ietf.org/html/rfc8297)有望提供更好的性能,因为它允许有关客户端应请求的资源的信息尽快发送,然后使连接可用于在其他流上承载数据,直到最终响应被发送。如果正在积极努力测量103个早期提示的潜在延迟增益(与在这两种情况下都不使用它,而不使用服务器推送相比),如果数据看起来前景看好,我们将分配资源用于在Chromium中实现它。更多细节请参见https://chromium.googlesource.com/chromium/src/+/master/docs/early-hints.md。

有趣的是,服务器推送的使用方式超出了最初的预期。一个突出的例子是将数据从服务器传输到客户端,这将被即将发布的WebTransport协议更好地服务。