.
一、http2.x的frame(帧)协议
/**
* @see io.netty.handler.codec.http2.DefaultHttp2FrameReader#processHeaderState(io.netty.buffer.ByteBuf)
*
* Frame
*
* <pre>
* // 1、当为 Type=DATA=0x0,Length=... // 数据
* // 2、当为 Type=HEADERS=0x1,Length=... // 头
* // 3、当为 Type=PRIORITY=0x2,Length=固定5byte // 优先级
* // 4、当为 Type=RST_STREAM=0x3,Length=固定4byte // ...
* // 5、当为 Type=SETTINGS=0x4,Length=... // 设置
* // 6、当为 Type=PUSH_PROMISE=0x5,Length=... // 推送
* // 7、当为 Type=PING=0x6,Length=固定8byte // ping请求
* // 8、当为 Type=GO_AWAY=0x7,Length=... // ...
* // 9、当为 Type=WINDOW_UPDATE=0x8,Length=固定4byte // 窗口更新
* // 10、当为 Type=CONTINUATION=0x9,Length=... // header拆帧
* |------------------------------------------------------------------
* |------------|-----------------------------------------------------
* | | Payload Length (24bit) |
* | header |-----------------------------------------------------
* | (9 byte) | Type (8bit) | Flags (8bit) |
* | |-----------------------------------------------------
* | | R (1bit) | Stream Identifier (31bit) |
* |------------|-----------------------------------------------------
* | | |
* | body | Frame Payload (0...) |
* | | |
* |------------|-----------------------------------------------------
* </pre>
*/
/**
* Flags (8bit)
*
* <pre>
* FLAG_NONE = 0x0;
* FLAG_ACK = 0x1; // Used for settings and ping.
* ack消息
* 当 frameType=SETTINGS、PING 可以设置
* FLAG_END_STREAM = 0x1; // Used for headers and data.
* 流结束,即读取body结束
* 当 frameType=DATA 可以设置
* FLAG_END_HEADERS = 0x4; // Used for headers and continuation.
* header结束,即读取header结束
* FLAG_END_PUSH_PROMISE = 0x4;
* FLAG_PADDED = 0x8; // Used for headers and data.
* 是否有填充,如果为true,那么Payload的第一个byte表示padding长度
* 当 frameType=HEADERS、DATA 可以设置
* FLAG_PRIORITY = 0x20; // Used for headers.
* 当 frameType=HEADERS 可以设置
* FLAG_COMPRESSED = 0x20; // Used for data.
* 当 frameType=DATA 可以设置
* ----------------------------------------------------------------------------------------------------------------------
* Flags
* -------------------------------------------|--------------------------------------------------------------------------
* | 3 | 2 | 1(0x20) | 0 | 3(0x8) | 2(0x4) | 1 | 0(0x1) |
* -------------------------------------------|--------------------------------------------------------------------------
* | - | - | PRIORITY/COMPRESSED | - | PADDED | END_HEADERS/END_PUSH_PROMISE | - | ACK/END_STREAM |
* -------------------------------------------|--------------------------------------------------------------------------
*/
.
二、http2.x 握手过程
/**
* <pre>
* // !!! sendConnectionPreface 发送连接序言 - 可选
* // 1、发送序言到{server}
* // 2、发送 SETTINGS 消息到{server}
* // 3、发送 WINDOW_UPDATE 消息到{server} - 可选
* // !!! readConnectionPreface 读取{server发送过来}的连接序言
* // 1、读取{server发送过来}的setting
* // !!! 读取{server发送过来}的帧
* // 1、有10种帧:TYPE_DATA、TYPE_HEADERS、TYPE_PRIORITY、TYPE_RST_STREAM、TYPE_SETTINGS、TYPE_PUSH_PROMISE、TYPE_PING、TYPE_GOAWAY、TYPE_WINDOW_UPDATE、CONTINUATION
*
* </pre>
*/
.
三、各种帧类型的数据结构
1、Frame_DATA
/**
* 《DATA》
*
* <pre>
* @see okhttp3.internal.http2.Http2Reader#nextFrame (boolean, okhttp3.internal.http2.Http2Reader.Handler)
* @see okhttp3.internal.http2.Http2Reader#readData (okhttp3.internal.http2.Http2Reader.Handler, int, byte, int)
* </pre>
*
* Payload
* <pre>
* ----------------------------------------
* | paddingLength(8bit) | data | padding |
* ----------------------------------------
* </pre>
*/
.
2、Frame_GO_AWAY
/**
* 《Ping》
*
* <pre>
* @see okhttp3.internal.http2.Http2Reader#nextFrame (boolean, okhttp3.internal.http2.Http2Reader.Handler)
* @see okhttp3.internal.http2.Http2Reader#readGoAway (okhttp3.internal.http2.Http2Reader.Handler, int, byte, int)
* </pre>
*
* Payload
* <pre>
* ----------------------------------------------------------
* | lastStreamId(32bit) | errorCodeInt(32bit) | data |
* ----------------------------------------------------------
* </pre>
*/
.
3、Frame_HEADERS
/**
* 《HEADERS》
*
* <pre>
* @see okhttp3.internal.http2.Http2Reader#nextFrame (boolean, okhttp3.internal.http2.Http2Reader.Handler)
* @see okhttp3.internal.http2.Http2Reader#readHeaders (okhttp3.internal.http2.Http2Reader.Handler, int, byte, int)
* </pre>
*
* Payload
* <pre>
* ------------------------------------------------------------------------------------------------------------------------------
* | 1byte | 5byte |
* ------------------------------------------------------------------------------------------------------------------------------
* | paddingLength(8bit) | Priority-exclusive(8bit) | Priority-streamDependency(24bit) | Priority-weight(8bit) | data | padding |
* ------------------------------------------------------------------------------------------------------------------------------
* </pre>
*/
.
4、Frame_PING
/**
* 《Ping》
*
* <pre>
* @see okhttp3.internal.http2.Http2Reader#nextFrame (boolean, okhttp3.internal.http2.Http2Reader.Handler)
* @see okhttp3.internal.http2.Http2Reader#readPing (okhttp3.internal.http2.Http2Reader.Handler, int, byte, int)
* </pre>
*
* Payload
* <pre>
* -------------------------------------------
* | payload1(32bit) | payload2(32bit) | 无 |
* -------------------------------------------
* </pre>
*/
.
5、Frame_PRIORITY
/**
* 《Priority》
*
* <pre>
* @see okhttp3.internal.http2.Http2Reader#nextFrame (boolean, okhttp3.internal.http2.Http2Reader.Handler)
* @see okhttp3.internal.http2.Http2Reader#readPriority (okhttp3.internal.http2.Http2Reader.Handler, int, byte, int)
* </pre>
*
* Payload
* <pre>
* ---------------------------------------------------------------------------------------
* | Priority-exclusive(8bit) | Priority-streamDependency(24bit) | Priority-weight(8bit) |
* ---------------------------------------------------------------------------------------
* </pre>
*/
.
6、Frame_PUSH_PROMISE
/**
* 《PushPromise》
*
* <pre>
* @see okhttp3.internal.http2.Http2Reader#nextFrame (boolean, okhttp3.internal.http2.Http2Reader.Handler)
* @see okhttp3.internal.http2.Http2Reader#readPushPromise (okhttp3.internal.http2.Http2Reader.Handler, int, byte, int)
* </pre>
*
* Payload
* <pre>
* ------------------------------------------------------------------
* | paddingLength(8bit) | promisedStreamId(32bit) | data | padding |
* ------------------------------------------------------------------
* </pre>
*/
.
7、Frame_RST_STREAM
/**
* 《RstStream》
*
* <pre>
* @see okhttp3.internal.http2.Http2Reader#nextFrame (boolean, okhttp3.internal.http2.Http2Reader.Handler)
* @see okhttp3.internal.http2.Http2Reader#readRstStream (okhttp3.internal.http2.Http2Reader.Handler, int, byte, int)
* </pre>
*
* Payload
* <pre>
* ----------------------------
* | errorCodeInt(32bit) | 无 |
* ----------------------------
* </pre>
*/
.
8、Frame_SETTINGS
/**
* 《Settings》
*
* <pre>
* @see okhttp3.internal.http2.Http2Reader#nextFrame (boolean, okhttp3.internal.http2.Http2Reader.Handler)
* @see okhttp3.internal.http2.Http2Reader#readSettings (okhttp3.internal.http2.Http2Reader.Handler, int, byte, int)
* </pre>
*
* Payload
* <pre>
* --------
* | data |
* --------
* </pre>
*/
.
9、Frame_WINDOW_UPDATE
/**
* 《WINDOW_UPDATE》
*
* <pre>
* @see okhttp3.internal.http2.Http2Reader#nextFrame (boolean, okhttp3.internal.http2.Http2Reader.Handler)
* @see okhttp3.internal.http2.Http2Reader#readWindowUpdate (okhttp3.internal.http2.Http2Reader.Handler, int, byte, int)
* </pre>
*
* Payload
* <pre>
* --------------------------
* | increment(32bit) | 无 |
* -------------------------
* </pre>
*/
.