【问题标题】:HTTP/2 HEADERS and DATA FramesHTTP/2 标头和数据帧
【发布时间】:2017-11-11 14:32:04
【问题描述】:

我正在尝试详细了解 HTTP/2。我读过这篇关于流、消息和帧的文章:https://hpbn.co/http2/#streams-messages-and-frames。我不知道我的概念是否正确。

我得出以下结论:

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

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

【问题讨论】:

    标签: http http2


    【解决方案1】:

    你弄错了一些东西。

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

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

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

    HTTP/2 流是请求消息和响应消息的组合。 请注意,不要将这与 flag_end_stream 混淆,后者表示任一对等方为该特定流发送的最后一帧。

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

    • 一个 ID=13、flag_end_headers=trueflag_end_stream=trueHEADERS 框架(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]

    其中括号] 表示它是流中的最后一帧。

    【讨论】:

    • 我分析了你的回复,知道我理解这个概念!不能感谢你!干杯!
    【解决方案2】:

    补充:

    DATA 帧只能与 HEADERS 帧一起发送

    不正确。 DATA帧也可以用PUSH_PROMISE发送。

    我没有看到任何显示数据帧流 ID(RFC 7540、6.1)的指标

    这是因为第 6.1 节显示了帧的 Payload,其中不包括标题部分。 4.1 告诉你 9 字节的标头是什么样的:

    【讨论】:

    • 那么来自 6.1 的 Payload DATA 帧在 4.1 的 Frame Payload 内?
    猜你喜欢
    • 2019-02-27
    • 2016-09-01
    • 2021-04-05
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2017-06-26
    相关资源
    最近更新 更多