HEADERS帧

HEADERS帧(type=0x1)用于打开一个流,此外还携带一个header块片段。HEADERS帧可以在状态为”idle”,”reserved (local)”,”open”,或”half-closed (remote)”的流上发送。

帧格式

 +---------------+
 |Pad Length? (8)|
 +-+-------------+-----------------------------------------------+
 |E|                 Stream Dependency? (31)                     |
 +-+-------------+-----------------------------------------------+
 |  Weight? (8)  |
 +-+-------------+-----------------------------------------------+
 |                   Header Block Fragment (*)                 ...
 +---------------------------------------------------------------+
 |                           Padding (*)                       ...
 +---------------------------------------------------------------+

HEADERS帧具有如下的字段:

  • Pad Length/填充长度

8位的字段,包含以字节为单位的帧的填充长度。只有在PADDED标记设置时这个字段才出现。

  • E

单bit的标记,指示流依赖是独占的。这个字段只有在PRIORITY标记设置时才会出现。

  • Stream Dependency/流依赖:31位的流标识符,标识这个流依赖的流。这个字段只有在PRIORITY标记设置时才会出现。

  • Weight/权重

无符号8位整型值,表示流的优先级权重。将值加1以获得介于1和256之间的权重。这个字段只有在PRIORITY标记设置时才会出现。

  • header块片段/Header Block Fragment

一个header块片段。

  • 填充/Padding

填充字节。

标记

HEADERS帧定义了如下的标记:

  • END_STREAM (0x1)

当设置时,位0表示这个header块是终端将是被标识的流发送的最后一个块。

HEADERS帧可以携带 END_STREAM 标记,标明流的结束。然而,在相同的流上,一个设置了 END_STREAM 标记的HEADERS帧后面可以跟着 CONTINUATION 帧。逻辑上来说,CONTINUATION 帧是 HEADERS 帧的一部分。

  • END_HEADERS (0x4)

若设置,位2 指示该帧包含整个头部块,并且没有任何CONTINUATION帧。没有END_HEADERS标记集的HEADERS帧必须跟随同一个流的CONTINUATION帧。接收方必须将接收到的任何其他类型的帧或不同流上的帧视为PROTOCOL_ERROR类型的连接错误。

  • PADDED(0x8):若设置,位3 指示Pad Length字段及其描述的填充符存在。
  • PRIORITY(0x20):若设置,位5 指示存在专用标志(E),流依赖性和权重字段。

PRIORITY帧在wireshark中所示:

载荷

HEADERS帧的载荷包含一个header块片段。不适合放在HEADERS帧中的header块在CONTINUATION帧中继续。

HEADERS帧必须与流关联。如果收到的流标识符字段为0x0的HEADERS帧,收件人必须响应PROTOCOL_ERROR类型的连接错误。

如第4.3节所述,HEADERS帧改变连接状态。

HEADERS帧可以包含填充。填充字段和标志与为DATA帧定义的填充字段和标志相同。填充超过header分段的剩余大小必须被视为PROTOCOL_ERROR。

HEADERS帧中的优先级信息在逻辑上等同于单独的PRIORITY帧,但包含在HEADERS中可避免在创建新流时在流优先级中进行流失的可能性。流之后的HEADERS帧中的优先级字段重新设置流的优先顺序。