HTTP / 2 HEADERS和DATA帧

时间:2017-06-09 14:14:13

标签: http http2

我正在尝试详细了解HTTP / 2。我阅读了有关流,消息和框架的文章:https://hpbn.co/http2/#streams-messages-and-frames。我不知道我的概念是否正确。

我得出以下结论:

  • 消息是HEADER帧和一个或多个DATA的组合 帧。
  • DATA帧只能与HEADERS帧一起发送,因为我没有看到任何显示DATA帧流ID的指示符(RFC 7540,6.1)
    • 如果是这样,A DATA Frame只能在消息中发送
  • 可以将Stream分块为多个帧,而可以通过Stream ID将其与Stream相关联

此外:规范中如何表示消息?

2 个答案:

答案 0 :(得分:5)

你有一些不正确的事情。

消息是一个或两个HEADER帧(携带HTTP标头),零个或多个 DATA帧和一个的组合可选终端HEADER框架(携带HTTP预告片)。 您可以查看this section of RFC 7540中的示例。 100 Continue响应有一个特殊情况,可以从两个HEADERS而不是一个DATA开始。在下文中我们可以忽略这种情况。

DATA 具有流ID,因为所有帧都共享this section of RFC 7540中定义的帧头。 第6.1节中描述的内容仅是flag_end_stream框架的主体。

消息是HTTP / 2流的一半。消息表示HTTP请求或HTTP响应。

HTTP / 2流是请求消息和响应消息的组合。 请注意,不要将GET与任何一个对等体发送给该特定流的最后一帧信号混淆。

浏览器执行的典型HEADERS请求将具有(假设流ID为13):

  • ID为13的flag_end_headers=true一帧,flag_end_stream=trueGETGET请求通常没有正文)

对该HEADERS请求的典型响应将具有:

  • ID为13且flag_end_headers=true
  • 的一个DATA框架
  • 一个或多个DATA帧,ID = 13;最后一个flag_end_stream=true框架将包含HEADERS(13) HEADERS(15) DATA(15) DATA(13) DATA(13] DATA(15) DATA(15]

注意,由于多路复用,帧可以交错;这意味着,如果您有两个并发响应(例如,对于流13和流15),您可以使用此序列:

]

括号className={`box ${props.className}`} 表示它是流中的最后一帧。

答案 1 :(得分:2)

补充:

  

DATA帧只能与HEADERS帧一起发送

不正确。数据帧也可以与PUSH_PROMISE一起发送。

  

我没有看到任何显示DATA帧流ID(RFC 7540,6.1)

的指标

这是因为第6.1节显示了一个帧的 Payload ,它不包括标题部分。 4.1告诉你9字节标题的样子:

enter image description here