2017-06-09 31 views
2

我想了解详细的HTTP/2。我阅读了关于流,消息和帧的文章:https://hpbn.co/http2/#streams-messages-and-frames。我不知道我是否有正确的概念。HTTP/2的头和数据帧

我来到了以下结论:

  • 消息是一个HEADER帧和一个或多个数据帧 的组合。
  • 数据帧只能与一个HEADERS帧发送的,因为我看不到其显示了数据的任何指标帧的流ID(RFC 7540,6.1)
    • 如果这是真的,数据帧可以仅一个消息内发送
  • 甲流可以被分块成许多帧,而它可通过它的流ID

此外涉及到一个Stream:如何被一个消息中的规范表示?

回答

4

你错误地得到了一些东西。

消息是一个或两个HEADER帧(携带HTTP头),零个或多个 DATA帧,并且一个可选终端HEADER帧(携带HTTP拖车)的组合。 你可以看看this section of RFC 7540的例子。 对于100 Continue响应有一个特殊情况,可以从两个HEADERS而不是一个开始。在以下我们可以忽略这种情况。

DATA确实有一个流ID,因为所有帧共享this section of RFC 7540定义的帧报头。 6.1节中描述的仅仅是DATA框架的主体。

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

HTTP/2流是请求消息和响应消息的组合。 请注意,这不应与flag_end_stream混淆,该信号表示由任一对端发送的特定流的最后一帧。

由浏览器执行的典型GET请求随后将已(假设流ID是13):

  • 一个HEADERS帧与ID = 13,flag_end_headers=trueflag_end_stream=true(一个GET请求通常具有不体)

GET请求典型的响应届时将有:

  • 一个HEADERS帧ID = 13和flag_end_headers=true
  • 一个或多个DATA帧,全部ID = 13;最后的DATA框架将有flag_end_stream=true

请注意,由于多路复用,帧可以交错;这意味着,如果你有两个并行的反应(比如为流13和流15),例如,你可以有这样的顺序:

HEADERS(13) HEADERS(15) DATA(15) DATA(13) DATA(13] DATA(15) DATA(15]

在托架]意味着它流中的最后一帧。

+0

我分析你的反应,知道我理解的概念!不够感谢你!干杯! – csnewb

2

甲补充:

数据帧只能与一个HEADERS帧

并非如此被发送。数据帧也可以用PUSH_PROMISE发送。

我看不出其示出了数据的任何指标帧的流ID(RFC 7540,6.1)

这是因为第6.1节示出了帧的净荷,它不包括标题部分。 4.1告诉你9个字节的报头的样子:

enter image description here

+0

那么来自6.1的Payload DATA帧就在4.1的Frame Payload中? – csnewb

+0

是.................... – laike9m

+1

恩,谢谢........... :) – csnewb