序列化的标题块如何划分?

时间:2019-01-23 16:00:23

标签: http2

我正在实现自己的HTTP / 2服务器。阅读RFC 7540,有关HTTP标头框架的部分内容使我感到困惑:

  

https://tools.ietf.org/html/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标头分为多个标头块片段?例如,标头1容器数据的一部分由 Block Fragment 1 ,其余部分由 Block Fragment 2 携带。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

您可以创建带有标记HEADERS的{​​{1}}帧,并在其中放入23个字节中的13个。 然后,创建一个带有标志end_headers=false的{​​{1}}帧,并将其余的10个字节放入其中。

在拆分CONTINUATION时它是完全不透明的。

重要的是end_headers=truebyte[]帧必须一个接一个地发送,并且它们之间没有其他帧。

接收方将看到带有HEADERS的{​​{1}}帧,将提取这13个字节并将其放在一边,等待CONTINUATION帧。 当HEADERS帧到达时,接收方将提取10个字节,并将其与前13个字节连接起来,以获得原始23个字节的副本,现在可以通过HPACK对其进行解码,从而获得原始HTTP标头。