【网络知识之四】HTTP/2

一、HTTP/1.1存在的问题

1、TCP 连接数限制
2、线头阻塞 (Head Of Line Blocking) 问题
3、Header 内容多,而且每次请求 Header 不会变化太多,没有相应的压缩传输优化方案
4、为了尽可能减少请求数,需要做合并文件、雪碧图、资源内联等优化工作,但是这无疑造成了单个请求内容变大延迟变高的问题,且内嵌的资源不能有效地使用缓存机制
5、明文传输不安全

二、HTTP/2优势
1、二进制分帧层 (Binary Framing Layer)
2、多路复用 (MultiPlexing)


3、服务端推送 (Server Push)
4、Header 压缩 (HPACK)
5、应用层的重置连接
6、请求优先级设置
7、流量控制
8、HTTP/1 的几种优化可以弃用

三、HTTP/2原理

1、帧
(1)帧的结构
帧由头部(9字节)+Frame Payload(主体内容)组成。

Length:frame长度,一个24位无符号整数表示。不包含头部9字节。
Type:定义frame类型,用8位表示。帧类型决定了帧主体的格式和语义,如果type为unknown应该忽略或抛弃。
Flags:帧类型相关而预留的布尔标识。标识对于不同的帧类型赋予了不同的语义。如果该标识对于某种帧类型没有定义语义,则它必须被忽略且发送的时候应该赋值为 (0x0)
R:是一个保留的比特位。这个比特的语义没有定义,发送时它必须被设置为 (0x0), 接收时需要忽略。
Stream Identifier:流标识,用作流控制,用 31 位无符号整数表示。客户端建立的 sid 必须为奇数,服务端建立的 sid 必须为偶数,0x0保留为连接控制消息不能用于建立新流.
Frame Payload:是主体内容,由帧类型决定。

(2)帧的类型
HEADERS: 报头帧 (type=0x1),仅包含 HTTP 标头信息;
DATA: 数据帧 (type=0x0),装填主体信息,可以用一个或多个 DATA 帧来返回一个请求的响应主体;
PRIORITY: 优先级帧 (type=0x2),指定发送者建议的流优先级,可以在任何流状态下发送PRIORITY帧,包括空闲(idle)和关闭(closed)的流;
RST_STREAM: 流终止帧 (type=0x3),用来请求取消一个流,或者表示发生了一个错误,payload 带有一个 32 位无符号整数的错误码 (Error Codes),不能在处于空闲 (idle) 状态的流上发送 RST_STREAM 帧
SETTINGS: 设置帧 (type=0x4),设置此 连接 的参数,作用于整个连接
PUSH_PROMISE: 推送帧 (type=0x5),服务端推送,客户端可以返回一个 RST_STREAM 帧来选择拒绝推送的流
PING: PING 帧 (type=0x6),判断一个空闲的连接是否仍然可用,也可以测量最小往返时间 (RTT)
GOAWAY: GOWAY 帧 (type=0x7),用于发起关闭连接的请求,或者警示严重错误。GOAWAY 会停止接收新流,并且关闭连接前会处理完先前建立的流
WINDOW_UPDATE: 窗口更新帧 (type=0x8),用于执行流量控制功能,可以作用在单独某个流上 (指定具体 Stream Identifier) 也可以作用整个连接 (Stream Identifier 为 0x0),只有 DATA 帧受流量控制影响。初始化流量窗口后,发送多少负载,流量窗口就减少多少,如果流量窗口不足就无法发送,WINDOW_UPDATE 帧可以增加流量窗口大小
CONTINUATION: 延续帧 (type=0x9),用于继续传送首部块片段序列,见 首部的压缩与解压缩

2、流-多路复用
(1)流标识
流ID是31位无符号整数,客户端发起的流必须是奇数,服务端发起的流必须是偶数,0x0保留为连接控制消息不能用于建立新流。

(2)流状态
idle:所有流以“空闲”状态开始。在这种状态下,没有任何帧的交换
reserved (local) / reserved (remote)
open
half-closed (local)
half-closed (remote)
closed

(3)流优先级

每个流都分配了一个优先级,用于确定它的处理顺序,以及它将收到的资源量。将该优先级输入到给定流的标头帧或优先级帧中,优先级可以是 0 到 256 之间的任何数字。

3、服务端推送
(1)PUSH_PROMISE帧
(2)Server-Push过程
(3)nginx配置Server-Push
(4)Server-Push潜在问题

4、Header压缩-HPACK 算法
(1)索引表
(2)编码类型
(3)二进制编码

5、流量控制
(1)WINDOW_UPDATE帧
(2)流量控制窗口
(3)合理使用流控制

6、HTTP/2协议协商机制

参考
HTTP2详解
深入浅出:HTTP/2
HTTP/2 LAB
Ngnix7个提高HTTP/2的技巧

HTTP/2 幕后原理
Java对HTTP2的支持

原文地址:https://www.cnblogs.com/cac2020/p/11867852.html