1.Stream 特性
- 一条
TCP
连接上,可以并发存在多个处于OPEN
状态的Stream
- 客户端或者服务器都可以创建新的
Stream
- 客户端或者服务器都可以首先关闭
Stream
- 同一条
Stream
内的Frame
帧是有序的 - 从
Stream ID
的值可以轻易分辨PUSH
消息 - 所有为发送
HEADER/DATA
消息而创建的流,从1
、3
、5
等递增奇数开始 - 所有为发送
PUSH
消息而创建的流,从2
、4
、6
等递增偶数开始
2.Message 特性
- 一条
HTTP Message
由1
个HEADER
(可能含有0
个或者多个持续帧构成)及0
个或者多个DATA
构成 HEADER
消息同时包含HTTP/1.1
中的start line
与headers
部分- 取消
HTTP/1.1
中的不定长Chunk
消息
3.GET 消息发送示意图
4.POST 消息发送示意图
5.Stream 流的状态
- 帧符号
H:HEADERS
帧PP:PUSH_PROMISE
帧ES:END_STREAM
标志位R:RST_STREAM
帧
- 流状态
idle
:起始状态closed
open
:可以发送任何帧half closed
单向关闭remote
:不再接收数据帧local
:不能再发送数据帧reserved
remote
local
6.RST_STREAM 帧(type=0x3)
HTTP2
多个流共享同一连接,RST
帧允许立刻终止一个未完成的流RST_STREAM
帧不使用任何flag
RST_STREAM
帧的格式
7.常见的 RST_STREAM 错误码
NO_ERROR(0x0)
:没有错误。GOAWAY
帧优雅关闭连接时可以使用此错误码PROTOCOL_ERROR(0x1)
:检测到不识别的协议字段INTERNAL_ERROR(0x2)
:内部错误FLOW_CONTROL_ERROR(0x3)
:检测到对端没有遵守流控策略SETTINGS_TIMEOUT(0x4)
:某些设置帧发出后需要接收端应答,在期待时间内没有得到应答则由此错误码表示STREAM_CLOSED(0x5)
:当Stream
已经处于半关闭状态不再接收Frame
帧时,又接收了新的Frame
帧FRAME_SIZE_ERROR(0x6)
:接收到的Frame Size
不合法REFUSED_STREAM(0x7)
:拒绝先前的Stream
流的执行CANCEL(0x8)
:表示Stream
不再存在COMPRESSION_ERROR(0x9)
:对HPACK
压缩算法执行失败CONNECT_ERROR(0xa)
:连接失败ENHANCE_YOUR_CALM(0xb)
:检测到对端的行为可能导致负载的持续增加,提醒对方“冷静”一点INADEQUATE_SECURITY(0xc)
:安全等级不够HTTP_1_1_REQUIRED(0xd)
:对端只能接受HTTP/1.1
协议
8.Priority 优先级设置帧
- 帧类型:
type=0x2
- 不使用
flag
标志位字段 Stream Dependency
:依赖流Weight
权重:取值范围为1
到256
。默认权重16
- 仅针对
Stream
流,若ID
为0
试图影响连接,则接收端必须报错 - 在
idle
和closed
状态下,仍然可以发送Priority
帧
9.抓取权重报文