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

时间:2015-03-30 17:16:33

标签: server-push http2

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

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

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

2 个答案:

答案 0 :(得分:47)

在HTTP / 2中,服务器使用PUSH_PROMISE帧向客户端推送请求

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

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

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

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

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

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

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

答案 1 :(得分:5)

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