我正在实现自己的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 携带。
谢谢!
答案 0 :(得分:0)
是的,可以将与1个HTTP标头对应的字节分成2个(或更多)帧。
您可以通过HPACK将HTTP标头编码为字节,因此现在只有byte[]
。
假设byte[]
的长度为23。
您可以创建带有标记HEADERS
的{{1}}帧,并在其中放入23个字节中的13个。
然后,创建一个带有标志end_headers=false
的{{1}}帧,并将其余的10个字节放入其中。
在拆分CONTINUATION
时它是完全不透明的。
重要的是end_headers=true
和byte[]
帧必须一个接一个地发送,并且它们之间没有其他帧。
接收方将看到带有HEADERS
的{{1}}帧,将提取这13个字节并将其放在一边,等待CONTINUATION
帧。
当HEADERS
帧到达时,接收方将提取10个字节,并将其与前13个字节连接起来,以获得原始23个字节的副本,现在可以通过HPACK对其进行解码,从而获得原始HTTP标头。>