【问题标题】:How serialized header block is divided?序列化的头块如何划分?
【发布时间】:2019-01-24 02:09:50
【问题描述】:

我正在实现自己的 HTTP/2 服务器。通读 RFC 7540,关于 HTTP 头帧的部分内容让我感到困惑:

https://www.rfc-editor.org/rfc/rfc7540#section-4.3

标题列表是零个或多个标题字段的集合。什么时候
通过连接传输,标头列表被序列化为一个
使用 HTTP 标头压缩 [COMPRESSION] 的标头块。
然后将序列化的标头块分成一个或多个八位字节
序列,称为头块片段

所以在我的想象中,这个过程应该是这样的:

+-------------------+    +-------------------+    +------------------+    +---------+
|    Header List    |    |    Header Block   |    | Block Fragment 1 | -> | Frame 1 | 
+-------------------+    +-------------------+    +------------------+    +---------+
| :method = POST    |    | Header 1 Bin Data |    | Block Fragment 2 | -> | Frame 2 |
| :path = /resource | -> | Header 2 Bin Data | -> +------------------+    +---------+ 
| :scheme = https   |    | Header 3 Bin Data |    | Block Fragment 3 | -> | Frame 3 |
| .....             |    | Header 4 Bin ...  |    +------------------+    +---------+
+-------------------+    +-------------------+    ...                     ...

但是本节没有提到序列化的头块是如何划分的。

所以我的问题是:是否可以将一个 HTTP 标头分隔/划分为多个 Header Block Fragments? 例如,Header 1 Bin Data 的一部分由Block Fragment 1,其余由Block Fragment 2携带。

谢谢!

【问题讨论】:

    标签: http2


    【解决方案1】:

    是的,可以将与 1 个 HTTP 标头对应的字节拆分为 2 个(或更多)帧。

    您通过 HPACK 将 HTTP 标头编码为字节,因此您现在只有一个 byte[]。 假设byte[] 的长度为 23。

    您可以创建一个带有end_headers=false 标志的HEADERS 框架,并将例如23 个字节中的13 个放入其中。 然后,您创建一个带有标志end_headers=trueCONTINUATION 帧,并将剩余的10 个字节放入其中。

    在您拆分byte[] 的位置完全不透明。

    重要的是HEADERSCONTINUATION 帧必须一个接一个地发送,它们之间没有其他帧。

    接收方将看到带有end_headers=falseHEADERS 帧,将提取这13 个字节并将它们放在一边,等待CONTINUATION 帧。 当CONTINUATION帧到达时,接收端将提取这10个字节,将其与之前的13个字节连接起来,得到原始23个字节的副本,现在可以通过HPACK解码,得到原始的HTTP头。

    【讨论】:

    • 这个答案是正确的。但是,它有严格的限制。 CONTINUATION 帧必须紧跟在前面的 HEADERS/CONTINUATION/PUSH_PROMISE 帧 (tools.ietf.org/html/rfc7540#section-6.10) 之后。这意味着 HTTP/2 连接被阻止(HOL 阻塞)并且无法处理其他流。非常非常非常大的标头块无法放入 SETTINGS_MAX_FRAME_SIZE 可能是使用它的主要原因,而且它们应该很少见。出于这个原因,它很少使用,如果某些实现存在错误甚至根本不支持它,我也不会感到惊讶。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多