HTTP/2 协议-Stream 的状态变迁
简介:
HTTP/2 协议-Stream 的状态变迁
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.抓取权重报文