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拆帧
     *     |------------------------------------------------------------------
     *     |------------|-----------------------------------------------------
     *     |            |              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>
     */

.

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值