提供内容后的HTTP2推送

时间:2017-11-14 17:24:29

标签: http2

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

This Wikipedia article解释了帧的顺序如下:

  
      
  1. 服务器接收HEADERS帧,询问流3中的index.html ...
  2.   
  3. 服务器为styles.css发送PUSH_PROMISE,为script.js发送PUSH_PROMISE,再次在流3中发送...
  4.   
  5. 服务器在流3中发送HEADERS帧以响应对index.html的请求。
  6.   
  7. 服务器发送带有index.html内容的DATA帧,仍在第3流中。
  8.   
  9. 服务器发送HEADERS帧以响应第4流中的styles.css
  10.   
  11. 服务器发送HEADERS帧以响应流6中的script.js。
  12.   
  13. 服务器使用各自的流号为styles.css和script.js的内容发送DATA帧。
  14.   

我想知道,例如,我是否可以保持开放流3,之后我发送了index.html的DATA帧,然后发送了PUSH_PROMISE帧。

感谢您的回复:)

1 个答案:

答案 0 :(得分:1)

  

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

我认为答案是' no',基于 6.6。 RFC 7540中的PUSH_PROMISE 。这里是相关的引用(强调我的):

  

PUSH_PROMISE帧必须仅在对等发起的流上发送   在" open"中的或"半封闭(远程)"状态即可。该   PUSH_PROMISE帧的流标识符表示它的流   与....关联。如果流标识符字段指定了   值0x0,收件人必须响应连接错误   (PROTOCOL_ERROR类型的(第5.4.1节)。

回到你的问题:

  

我想知道,例如,我是否可以保持开放流3,之后我发送了index.html的DATA帧,然后发送了PUSH_PROMISE帧。

以下是我认为你可以做的事情:你可以发送所有DATA帧for stream 3 但保留END_STREAM标志因此保持(这意味着客户端仍在等待内容)。然后发送PUSH_PROMISE,然后发送一个空的(零长度)DATA帧,并在第3行设置END_STREAM。我无法想到一个有用的场景,但是。