http2

[toc]

环境

研究http2,首先我们要有一个http2的客户端,一般情况下curl不会支持http2,所以我们要重新安装我们的curl,为了使curl支持http2,我们需要先安装nghttp2(严重怀疑和nginx有什么关系吗)依赖库

curl安装nghttp2依赖之后,只支持h2或者h2c通过http/1.1升级到http2的形式,但是nginx支持的h2c是direct h2c,即没有前置的http/1.1协议升级,直接http2通信,所以要测试h2c direct直接用的nghttp2提供的工具nghttp

协议

帧是http2传输过程中的最基本单元,一个数据帧的格式如下

1
2
3
4
5
6
7
8
9
 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| R | Length (14) | Type (8) | Flags (8) |
+-+-+-----------+---------------+-------------------------------+
|R| Stream Identifier (31) |
+=+=============================================================+
| Frame Payload (0...) ...
+---------------------------------------------------------------+

R: 保留字 2位
Length: 帧主体长度,不包括第一行的帧头
Type: 帧类型
flags: 特定帧类型的标示位
R: 保留字
Sid: 流id,0号表示当前帧关联整个tcp流
Frame Payload:

DATA帧

1
2
3
4
5
6
7
8
9
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| [Pad High(8)] | [Pad Low (8)] | Data (*) .
+---------------+---------------+-------------------------------+
. Data (*) ...
+---------------------------------------------------------------+
| Padding (*) ...
+---------------------------------------------------------------+
好饿好饿好饿 我真的好饿