前言:
HTTP2引入了二进制分帧层,将普通的请求/响应,拆解为帧实现请求和响应的并发。HTTP2规定了10中类型的帧。本文将对这10种类型的帧做总结。
帧的结构:
所有的帧都包含一个9 byte的帧头 + 可边长的正文不同。根据帧的类型不同,正文部分的结构也不一样。
帧头:
Length(3 bypte):表示帧的正文部分Payload的长度。初始设为2^14(16384),如果想要发送更大长度的帧,必须收到设置有SETTINGS_MAX_FRAME_SIZE.的 SETTING frame。帧头的9 byte不算在length的计算范围之内。
Type(1 byte):只有0h-Ah有效,如果收到了type超出范围的,必须忽略这一帧。
Flags(1 bype):标志位,常用的flag 有END_STREAM,标志该帧是数据流的最后一帧。
Stream Identifier(31 bit): 帧的id,表示该帧属于哪个数据流
DATA 帧:
DATA: 可变长,是应用数据。长度受到Length, Window Size的控制。
Pad Length: 一个8bit域,表示着Padding域的长度。
Padding:*padding填充为若干个0x0比特,由padding来控制是否校验。如果需要校验,则对非0的部分回应PROTOCAL_ERROR异常。padding的长度需要计算在flow controll 之内
DATA frame的flag可以有:
END_STREAM(0x1):当设置改为之后,stream将转变为half-closed或者closed状态。
PADDED:设置了该位,那么bit 3表明着Pad Length field并且正文需要填充。 payload = Padding Length + Data + Padding
异常情况:
1、每一个DATA 帧都必须从属与一个数据流。如果收到一个DATA frame它的stream id 为0x0,那么抛出一个PROTOCAL_ERROR错误。
2、如果padding的长度超过了payload,那么必须将其视为一个错误,并抛出PROTOCAL_ERROR
HEADER 帧 :
Pad Length:1 btye,表明padding 域的长度。在flag中设置了PADDED(00001000) 位的时候有效。
E: 1 bit,表示流依赖是否专用,只有当设置了PRIORITY的