首页 > 解决方案 > 了解 HTTP2 服务器推送和多路复用

问题描述

据我了解,多路复用的意思是客户端只需要与服务器建立一个 TCP 连接,它就可以同时发送多个请求,而无需等待一个请求的响应再继续另一个请求。所以如果我同时发送 3 个请求,也会有 3 个响应流。

对于服务器推送,客户端向服务器发送一个请求,然后服务器猜测客户端需要其他资源(也称为承诺)而不是它请求的资源,因此它发送推送承诺流以提示客户端的 URL额外资源。客户可以选择是否请求这些额外的资源。

我的问题是:

  1. 对于从服务器发送到客户端的任何响应,它是否必须是首先发起的请求?我的意思是,我创建了与服务器的连接,我没有发送任何请求。我可以通过服务器推送从服务器获取响应吗?在多路复用中,对于相同数量的请求,我得到相同数量的响应。在服务器推送中,我可以获得一个请求的多个响应。那么总是必须先有请求吗?
  2. 在服务器推送中,当服务器向客户端发送包含附加资源的 URL 的承诺流时,这是否意味着只有在客户端接受承诺时服务器才会推送附加资源?

标签: http2

解决方案


[服务器] 发送推送承诺流,用附加资源的 URL 提示客户端。客户可以选择是否请求这些额外的资源。

这是不正确的。当服务器向客户端发送 aPUSH_PROMISE时,服务器将发送与该推送资源关联的资源内容。客户端唯一能做的就是通过RST_STREAM帧重置推送的流,但很可能整个推送的资源已经在进行中,所以重置推送的流没有效果:客户端将收到推送的资源字节如果不感兴趣,可能会丢弃它们。

要回答您的具体问题:

  1. 是的,来自服务器的响应始终是客户端发起的。如果客户端没有向服务器发送任何请求,则服务器无法推送给客户端。即使在服务器推送的情况下,客户端始终通过发出请求来启动流,并且服务器推送始终与该“父”请求相关联。

  2. PUSH_PROMISE框架是从服务器到客户端的一个指示,表明服务器将要推送什么资源。客户端不“接受”推送,服务器将它们强制推送给客户端。客户端唯一能做的就是重置与推送资源关联的流;RST_STREAM正如我所说,服务器在从客户端接收到帧时可能已经推送了整个资源。


推荐阅读