DATA帧

DATA帧(type=0x0)传送与一个流关联的任意的可变长度的字节序列。一个或多个DATA帧被用于携带HTTP请求或响应载荷。

DATA帧也可以包含填充字节。填充字节可以被加进DATA帧来掩盖消息的大小。填充字节是一个安全性的功能;

帧格式

 +---------------+
 |Pad Length? (8)|
 +---------------+-----------------------------------------------+
 |                            Data (*)                         ...
 +---------------------------------------------------------------+
 |                           Padding (*)                       ...
 +---------------------------------------------------------------+
  • Pad Length/填充长度

一个8位的字段,包含了以字节为单位的帧的填充的长度。这个字段是有条件的(如图中的”?”所指的),只有在PADDED标记设置时才出现。

  • data/数据

应用数据。数据的大小是帧载荷减去出现的其它字段的长度剩余的大小。

  • padding/填充

填充字节包含了无应用语义的值。当填充时填充字节必须被设置为0。接收者没有义务去验证填充,而可以将非零的填充当做一个类型为 PROTOCOL_ERROR 的连接错误。

标志

备注:HTTP2帧的头部定义中,9个固定字节其中有一个字节flag是用来存放标志的。

DATA帧定义了如下的标记:

  • END_STREAM (0x1)

当设置了这个标记时,位0表示这个帧是终端将为标识的流发送的最后一帧。设置这个标记使得流进入某种”half-closed”状态或”closed”状态。

  • PADDED (0x8)

当设置了这个标记时,位3表示上面描述的填充长度字段及填充存在。

DATA帧必须与一个流关联。如果收到了一个流标识符为0x0的DATA帧,接收者必须以一个类型为 PROTOCOL_ERROR 的连接错误来响应。

DATA帧受控于flow control,而且只能在流处于”open”或”half-closed (remote)“状态时发送。整个的DATA帧载荷被包含在flow control中,可能包括填充长度和填充字段。如果收到DATA帧的流不处于”open”或”half-closed (remote)“状态,则接收者必须以一个类型为 STREAM_CLOSED 的流错误来响应。

填充字节的总大小由填充长度字段决定。如果填充的长度是帧载荷的长度或更大,则接收者必须将这作为一个类型为 PROTOCOL_ERROR 的连接错误来处理应。

注意:一个帧可以通过包含一个值为零的填充长度字段来使帧长度只增加一个字节。