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推送的更多讨论和想法感兴趣.
| 归档时间: |
|
| 查看次数: |
4610 次 |
| 最近记录: |