http2 - 了解 HTTP2 服务器推送和多路复用
问题描述
据我了解,多路复用的意思是客户端只需要与服务器建立一个 TCP 连接,它就可以同时发送多个请求,而无需等待一个请求的响应再继续另一个请求。所以如果我同时发送 3 个请求,也会有 3 个响应流。
对于服务器推送,客户端向服务器发送一个请求,然后服务器猜测客户端需要其他资源(也称为承诺)而不是它请求的资源,因此它发送推送承诺流以提示客户端的 URL额外资源。客户可以选择是否请求这些额外的资源。
我的问题是:
- 对于从服务器发送到客户端的任何响应,它是否必须是首先发起的请求?我的意思是,我创建了与服务器的连接,我没有发送任何请求。我可以通过服务器推送从服务器获取响应吗?在多路复用中,对于相同数量的请求,我得到相同数量的响应。在服务器推送中,我可以获得一个请求的多个响应。那么总是必须先有请求吗?
- 在服务器推送中,当服务器向客户端发送包含附加资源的 URL 的承诺流时,这是否意味着只有在客户端接受承诺时服务器才会推送附加资源?
解决方案
[服务器] 发送推送承诺流,用附加资源的 URL 提示客户端。客户可以选择是否请求这些额外的资源。
这是不正确的。当服务器向客户端发送 aPUSH_PROMISE
时,服务器将发送与该推送资源关联的资源内容。客户端唯一能做的就是通过RST_STREAM
帧重置推送的流,但很可能整个推送的资源已经在进行中,所以重置推送的流没有效果:客户端将收到推送的资源字节如果不感兴趣,可能会丢弃它们。
要回答您的具体问题:
是的,来自服务器的响应始终是客户端发起的。如果客户端没有向服务器发送任何请求,则服务器无法推送给客户端。即使在服务器推送的情况下,客户端始终通过发出请求来启动流,并且服务器推送始终与该“父”请求相关联。
PUSH_PROMISE
框架是从服务器到客户端的一个指示,表明服务器将要推送什么资源。客户端不“接受”推送,服务器将它们强制推送给客户端。客户端唯一能做的就是重置与推送资源关联的流;RST_STREAM
正如我所说,服务器在从客户端接收到帧时可能已经推送了整个资源。
推荐阅读
- python-3.x - 在 Qt 小部件中重新绘制时出现网格线问题
- r - 非标准评估不起作用: h(simpleError(msg, call)) 中的错误
- c# - MySQL 数据 C# MySql.Data.MySqlClient.MySqlException 而 Database.CreateIfNotExists
- rest - 我想在 VB 6.0 应用程序中使用 RESTful API?
- java - Jooq 对反应式应用程序的 R2DBC 支持
- excel - Excel - 对单元格进行编程以根据另一张纸上的另一个单元格更改颜色
- python - discord.ext.commands.errors.ExtensionNotFound:无法加载扩展“cogs.mod”
- angular - 我们可以从 jasmine 测试代码覆盖率中排除特定的角度分量方法吗?
- typescript - 在地图中搜索图层要素时,坐标返回空
- c# - 如何在 C# 上进行 UDP 打孔