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

Gui*_* D. 28 server-push http2

HTTP/2规范指示如果客户端取消它,则不会推送在PUSH_PROMISE帧中标识的任何资源.

当浏览器检测到缓存中已存在的资源时,它应取消对此资源的推送.但是,我没有看到浏览器如何检测它.框架是否提供其他信息,如etag或上次修改,以允许浏览器检测是否必须驱逐任何缓存条目或是否可以取消推送?

如果可能,可以节省一些带宽.但是,似乎服务器推送会破坏任何客户端缓存优化.

sbo*_*det 47

在HTTP/2中,服务器使用PUSH_PROMISE帧向客户端发送对资源的请求.

从服务器到客户端时,这不是响应,而是请求,客户端将获取该资源的请求.

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

同时,服务器启动推送资源所需的内容.这将生成一个HEADERS响应帧,其中包含典型的响应头,例如etag.当客户端收到HEADERS响应帧时,它还有一次机会取消流,尽管 - 当然 - 数据帧可能是空中的,可能全部都是.

节省带宽可能很有意思,但浪费一点带宽通常不是问题; 从用户体验的角度来看更重要的是延迟,推送机制将相当大的数量减少了.

我认为推送机制不会影响任何客户端缓存优化; 如果是这种情况,浏览器供应商就会反对这一功能,而大多数(如果不是全部)实现它会在用户体验和延迟减少方面取得很好的效果.

当然可以改进机制,例如让客户端和服务器就某些标题达成一致,这将提供有关所推送资源的更多信息,但到目前为止工作得相当好.

[免责声明:我是Jetty提交者] Jetty项目是第一个为Java生态系统(大约3年前)实施SPDY和HTTP/2推送的人,他们肯定对围绕HTTP/2推送的更多讨论和想法感兴趣.

  • 除了我上面的评论之外,这里还有一个 Chrome 讨论线程 https://groups.google.com/a/chromium.org/forum/#!msg/net-dev/yfkW4mkWIPU/CEVL86nFJgAJ(更具体到 SPDY)表示不支持服务器推送缓存。来自 HTTP2 服务器的服务器推送文件不会出现在 `chrome://cache` 中(最初请求的文件确实出现在缓存中,但另外推送的文件不会出现)。我认为 HTTP2 规范可以让浏览器在 PUSH_PROMISE 中接收一个 etag 并取消推送,但至少看起来 Chrome 并没有以这种方式实现。 (2认同)

Bob*_*bík 5

简单回答:是的,如果缓存中有此URL ,浏览器将取消服务器推送.