server-push - 当资源在缓存中时,浏览器是否会取消服务器推送?

标签 server-push http2

HTTP/2 规范表明,如果客户端取消 PUSH_PROMISE 帧中标识的任何资源,则不会推送该资源。

当浏览器检测到缓存中已有资源时,它应该取消对该资源的推送。但是,我不知道浏览器如何检测它。框架是否提供附加信息(例如 etag 或上次修改时间),以允许浏览器检测是否必须逐出任何缓存条目或是否可以取消推送?

如果可能的话,可以节省一些带宽。然而,服务器推送似乎会损害任何客户端缓存优化。

最佳答案

在 HTTP/2 中,服务器通过 PUSH_PROMISE 帧向客户端推送对资源的请求

从服务器到客户端时,这不是响应,而是请求,即客户端为获取该资源而发出的请求。

当客户端收到 PUSH_PROMISE 时,它可以查看 URI,并找出该资源的缓存状态。浏览器通常对正常接收的资源和推送的资源使用不同的缓存。 如果缓存仍然有效,客户端可以通过向该流的服务器发送 RST_STREAM 帧来取消推送的流。

同时,服务器开始推送资源。这将生成一个 HEADERS 响应帧,其中包含典型的响应 header ,例如 etag。 当客户端收到 HEADERS 响应帧时,它还有一次取消流的机会,当然,数据帧可能正在传输,也可能全部传输。

节省带宽可能很有趣,但浪费一点带宽通常不是问题;从用户体验的角度来看,更重要的是延迟,而推送机制大大降低了延迟。

我认为推送机制不会损害任何客户端缓存优化;如果是这种情况,浏览器供应商将会反对此功能,而大多数浏览器供应商(如果不是全部)都在实现该功能后,在用户体验和减少延迟方面取得了非常好的效果。

当然,该机制可以改进,例如让客户端和服务器就某些 header 达成一致,该 header 将提供有关正在推送的资源的更多信息,但到目前为止效果还不错。

[免责声明:我是 Jetty 提交者] almost 3 years ago 是第一个为 Java 生态系统 ( Jetty Project ) 实现 SPDY 和 HTTP/2 Push 的公司。肯定对more discussions and ideas感兴趣围绕 HTTP/2 推送。

关于server-push - 当资源在缓存中时,浏览器是否会取消服务器推送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29352282/

相关文章:

c++ - 无法通过 WebSockets 发送二进制数据

java - 是否可以使用 Apache Camel 实现服务器推送?

ssl - 在 Go 中使用 SSL 终止和 HTTP/2 的 HAProxy

c++ - 使用 C++ 的 Google Cloud 语音 API,第一步是什么?

curl - 如何从代码中禁用服务器 key 交换?

server-sent-events - 跨浏览器服务器发送的事件,或替代方案,包括 Microsoft 浏览器

websocket - 网站远程控制

asp.net-mvc-4 - 使用信号器时的 session 超时

Netty HTTP/2 writePushPromise 使浏览器无限循环

nginx - 如何阻止 nginx 提供 http/2 服务?