HTTP/2多路复用
Contents
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支持复用,即多路复用。
Author gsemir
LastMod 2022-01-23