http2 相较于http2最大的改变在于用户和网站之间可以复用一条连接实现多流交互。其推出并没有改变http1.1 的基本语义。http2的目的是响应复用,头部压缩来提高极致的性能。
http2 的版本标识
- h2:基于TLS之上构建的HTTP/2,作为ALPN的标识符,两个字节表示,0x68, 0x32,即https
- h2c:直接在TCP之上构建的HTTP/2,缺乏安全保证,即http
HTTP2引入了的三个新概念
- Stream: 已经建立连接的双向字节流,用唯一ID标示,可以传输一个或多个消息
- Message:逻辑上的HTTP消息,例如请求或者响应,一个消息可以包含多个 frame
- Frame:HTTP2通信的最小单位,二进制头封装,封装HTTP头部或body
HTTP2是把一个HTTP数据包分成多个帧发送,每个帧有一个二进制头,并把HTTP分成多个独立小帧,多个帧组成一个Message在流中发送。不同流的帧有可能交错到达,帧的报文头中标示了属于哪一个流。
HTTP2的最小数据单位是帧,所有帧以9字节的帧头并跟着0-16,383(可调整帧大小)字节的数据。
- Length: unsigned 24-bit integer,最大值为 2^24(16384),指的是不包括头部的部分
- Type:帧的类型
- Flags:为帧类型保留的8字节字段有具体的布尔标识
- R:1位的保留字段,这个比特的语义没有定义,发送时它必须被设置为 (0x0), 接收时需要忽略。
- Stream Identifier:31字节的流标识符。
0是保留的,标明帧是与连接相关作为一个整体而不是一个单独的流。由客户端建立的 Stream ID 必须是奇数,由服务端建立的 Stream ID 必须是偶数(如服务端主动向客户端推送消息)。 - Frame Payload:帧主体的结构和内容完全取决于帧类型。
HTTP2 有以下十种帧类型:
Frame Type | Code | NAME | DES |
---|---|---|---|
DATA | 0x0 | 数据帧 | 主要用来传递消息体 |
HEADERS | 0x1 | 头部帧 | 主要用于传递消息头 |
PRIORITY | 0x2 | 优先级帧 | 用于设置流的优先级 |
RST_STREAM | 0x3 | 流结束帧 | 用于终止异常流 |
SETTINGS | 0x4 | 连接配置参数帧 | 用于设置参数 |
PUSH_PROMISE | 0x5 | 推送承诺帧 | Server推送之前告知Client端 |
PING | 0x6 | 发送端测量最小的RTT时间,检测连接是否可用 | |
GOAWY | 0x7 | 超时帧 | 通知对端不要在连接上建新流 |
WINDOW_UPDATE | 0x8 | 实现流量控制 | |
CONTINUATION | 0x9 | 延续帧 | 延续一个报头区块 |
消息的组成: Headers 帧和DATA 帧
流,消息,帧 之间的关系:
在一条 Connection 中,不同流的数据帧可以穿插传递,但是同一条流的达到顺序必须是有序的。
例如1号流内帧必须有序。即传输中无序,接收时组装。
参考:
深入 HTTP2(帧,消息,流)
HTTP/2 协议(帧、消息、流简单的抓包分析)
Http2协议简介
HTTP2 协议初识