前述
最近在研究gRPC相关知识时,知道gRPC是基于HTTP2传输的。于是就有了这篇HTTP2的文章。文章只对HTTP2的基本原理和工作机制做介绍,详细的知识请参考文中的参考资料。
HTTP1.1的缺点
1,TCP连接数限制。对于同一个域名,浏览器最多只能同时创建 6~8 个 TCP 连接 (不同浏览器不一样)。
2,线头阻塞问题。每个 TCP 连接同时只能处理一个请求 - 响应,浏览器按 FIFO 原则处理请求,如果上一个响应没返回,后续请求 - 响应都会受阻。
3,Header头部多,冗余大,而且为压缩。
HTTP2的特点
1,二进制帧传输。二进制传输相对于HTTP1文本传输更高效,且更安全。
2,多路复用。基于流的概念复用,一个TCP链接上可以交叉的发送多个流。
3,服务端推送。
4,采用HPACK对Header压缩。
5,应用层连接重置。可以发送RST_STREAM
类型的帧终止流,而不用关闭TCP连接。
6,请求优先级设置。
7,流量控制。
基本实现
帧类型
-
HEADERS,报头帧,用于打开流或携带首部字段。
-
DATA,数据帧,用于返回相应body。
-
PRIORITY,优先级帧,用于调整流优先级。
-
RST_STREAM,重置帧,用来取消一个流。
-
SETTINGS,设置帧,设置连接参数。
-
PUSH_PROMISE,推送帧,用于服务器主动推送。
-
PING,Ping帧,判断连接是否有效。
-
GOAWAY,关闭连接。
-
WINDOW_UPDATE,窗口更新帧,用于流量控制。
-
CONTINUATION,延续帧,用于继续传送首部块片段序列。
流
流只是一个逻辑上的概念,代表 HTTP/2 连接中在客户端和服务器之间交换的独立双向帧序列,每个帧的 Stream Identifier 字段指明了它属于哪个流。
客户端流标识是一个奇数,服务端流标识是一个偶数。
后述
本篇内容会不断完善更新。