我正在尝试详细了解HTTP / 2。我阅读了有关流,消息和框架的文章:https://hpbn.co/http2/#streams-messages-and-frames。我不知道我的概念是否正确。
我得出以下结论:
此外:规范中如何表示消息?
答案 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):
flag_end_headers=true
一帧,flag_end_stream=true
和GET
(GET
请求通常没有正文)对该HEADERS
请求的典型响应将具有:
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字节标题的样子: