1 HTTP/2的帧

​ HTTP/1.1的请求响应过程是基于字符串的,而HTTP/2的请求响应过程是基于的。

​ HTTP/2引入了帧(Frame)的概念,可以将一次请求响应过程拆分成若干帧,每一帧包含Length+Type+Flags+StreamID+Payload五部分。前四个部分是固定的9字节长度,采用二进制的形式,起到标识的作用;第五部分Payload的最大长度为16kb到16Mb,具体的最大长度由终端自行决定,其中包括请求响应和请求响应头的内容。

2 HTTP/2的请求与响应

HTTP/2保留了请求和响应的概念,请求头和响应头会被发送方压缩后,分成几个连续的Frame传输,头字段会出现在这些Frame的Payload中,接收方拼合这些Frame后,解压缩即可得到真正的请求头或响应头。

  • 请求示例

    • 前三行数据为二进制翻译后的帧标识部分,+表示true,-表示false

    • 头部字段名全部改为小写,不允许出现大写,例如accept = text/html

    • 引入了伪头部字段的概念,出现在头部字段的前面,必须以冒号开头,例如:method = GET

HTTP/1.1 HTTP/2
GET /resource HTTP/1.1
Host: example.org
Accept: image/jpeg
HEADERS
+ END_STREAM
+ END_HEADERS

:method = GET
:scheme = https
:path = /resource
host = example.org
accept = image/jpeg
POST /resource HTTP/1.1
Host: example.org
Content-Type: image/jpeg
Content-Length: 123

{消息体}
HEADERS
- END_STREAM
- END_HEADERS
:method = POST
:path = /resource
:scheme = https

CONTINUATION
+ END_HEADERS
content-type = image/jpeg
host = example.org
content-length = 123

DATA
+ END_STREAM
{消息体}
HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 123

{响应体}
HEADERS
- END_STREAM
+ END_HEADERS
:status = 200
content-type = image/jpeg
content-length = 123

DATA
+ END_STREAM
{响应体}

3 HTTP/2的流与多路复用

  • HTTP/2引入了流(Stream)的概念,一个Stream由双向传输连续且有序的Frame(s)组成,
  • 一个TCP连接可以同时包含多个Stream(比如100个),一个Stream只用于一次请求和一次响应,
  • Stream之间相互独立,通过StreamID区别请求。
  • Stream支持复用,即多路复用。