【问题标题】:HTTP2 push after serving content提供内容后的 HTTP2 推送
【发布时间】:2018-04-27 18:09:02
【问题描述】:

是否可以在请求的内容已经提供后将内容推送到客户端?

This Wikipedia article对帧序列的解释如下:

  1. 服务器收到 HEADERS 帧,请求流 3 中的 index.html...
  2. 服务器发送一个 PUSH_PROMISE 用于 styles.css 和一个 PUSH_PROMISE 用于 script.js,再次在流 3 中...
  3. 服务器在流 3 中发送一个 HEADERS 帧以响应对 index.html 的请求。
  4. 服务器发送带有 index.html 内容的 DATA 帧,仍在流 3 中。
  5. 服务器发送 HEADERS 帧以响应流 4 中的 styles.css
  6. 服务器将 HEADERS 帧发送到流 6 中的 script.js 响应。
  7. 服务器使用 style.css 和 script.js 的内容发送 DATA 帧,使用它们各自的流号。

我想知道,例如,在我为 index.html 发送 DATA 帧并随后发送 PUSH_PROMISE 帧之后,我是否可以保持打开流 3。

感谢您的任何回复:)

【问题讨论】:

    标签: http2


    【解决方案1】:

    是否可以在请求的内容已经提供后将内容推送到客户端?

    我相信答案是“不”,基于 6.6。 RFC 7540 中的 PUSH_PROMISE。以下是相关引用(强调我的):

    PUSH_PROMISE 帧必须仅在对等发起的流上发送 即处于“打开”或“半关闭(远程)”状态。这 PUSH_PROMISE 帧的流标识符指示它的流 与....关联。如果流标识符字段指定 值 0x0,接收者必须以连接错误响应 (第 5.4.1 节)类型 PROTOCOL_ERROR。

    回到你的问题:

    我想知道,例如,在我为 index.html 发送 DATA 帧并随后发送 PUSH_PROMISE 帧之后,我是否可以保持打开流 3。

    以下是我相信您可以按照这些思路做的事情:您可以为流 3 发送所有 DATA但保留 END_STREAM 标志,从而保留(这意味着客户端仍将等待内容)。然后发送PUSH_PROMISE,然后发送一个空(零长度)DATA 帧,并在流 3 上设置END_STREAM。但是,我想不出一个有用的场景。

    【讨论】:

    • 大多数浏览器允许推送内容用于连接中的其他流,但它们只使用推送内容一次。请参阅“如果连接关闭,再见推送缓存”和“推送缓存中的项目只能使用一次”jakearchibald.com/2017/h2-push-tougher-than-i-thought 竞争条件是客户端将解析 html 并请求 css/js,然后才意识到它在路上。这似乎有用的唯一可能情况是,如果您想增加以后使用承诺内容的可能性
    猜你喜欢
    • 1970-01-01
    • 2019-02-25
    • 2018-09-06
    • 1970-01-01
    • 2018-03-06
    • 2018-03-11
    • 2021-06-05
    • 2019-01-04
    • 2017-08-31
    相关资源
    最近更新 更多