本文主要是介绍http2.x的frame(帧)协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
.
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拆帧* |------------------------------------------------------------------* |------------|-----------------------------------------------------* | | 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>*/
.
.
这篇关于http2.x的frame(帧)协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!