所有的帧都以一个固定的9字节首部开始,其后紧跟一个可变长度的载荷。

  1. +-----------------------------------------------+
  2. | Length (24) |
  3. +---------------+---------------+---------------+
  4. | Type (8) | Flags (8) |
  5. +-+-------------+---------------+-------------------------------+
  6. |R| Stream Identifier (31) |
  7. +=+=============================================================+
  8. | Frame Payload (0...) ...
  9. +---------------------------------------------------------------+

帧首部

帧首部的字段定义如下:

  • 长度(Length):帧载荷的长度,以一个无符号24位整数表示。必须不(MUST NOT)能发送大于2^14(16,384)的值,除非接收者已经为 SETTINGS_MAX_FRAME_SIZE 设置了更大的值。

    注意:9字节的帧首部不包含在这个值之内。也就是整个帧的大小是 9+length 字节。

  • 类型(Type):8位的帧类型。帧类型决定了帧的格式和语义。HTTP/2实现必须(MUST)忽略并丢弃未知类型的帧。

  • 标记(Flags):一个特定于帧类型的8位boolean标记保留字段。

    标记的语义特定于指示的帧类型。一个特定帧类型中没有定义语义的标记必须(MUST)被忽略,且必须(MUST)在发送时被复位(0x0)。

  • (R):一个保留的1位字段。

    这个位的语义还没有定义,而在发送时这个位必须(MUST)保持复位(0x0)状态,在接收时必须(MUST)被忽略。

  • 流标识符(Stream Identifier):流标识符被表示为一个31位无符号整型值。

    保留0x0值,用于那些与整个连接关联的帧,而不是一个独立的流。