彻底掌握Http2协议
Posted 架构之旅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了彻底掌握Http2协议相关的知识,希望对你有一定的参考价值。
现代生活中,网络越来越发达,网络协议作为网络发展的基础,推动着网络越来越高效方便;在OSI 7层网络的划分中,每个层都有各自的推进和发展,例如数据链路层和物理层的wifi6,应用层的http协议等等;今天我们就重点来看看http协议以及http最新版本的http2.0相关知识。
http2协议已经在国内外的许多大型网站中得到应用,我们用chrome浏览器访问https://www.qq.com(其他大型网站如优酷,天猫等都可以),访问前打开开发者工具的network标签。
如上图所示,大部分请求的protocol 为h2,也就是http 2;
2. http1.0, http1.1以及 http2.0 的比较
当前使用的浏览器都支持http2协议;当前开发中使用的软件如tomcat等软件默认使用http1.1协议;okhttp 等http客户端支持;
http1.1,http2.0 对比
(https://http2.akamai.com/demo):
http2 的4个主要特征,下面结合okhttp3 的代码对比分析;
http2 使用TCP单连接访问,在一个 TCP 连接上,我们可以向对方不断发送帧,每帧的 stream identifier 的标明这一帧属于哪个流,然后在对方接收时,根据 stream identifier 拼接每个流的所有帧组成一整块数据。
如图所示,3个文件使用了同一个连接id,那么是所有请求都用同一个连接?显然不是,一个网页必然访问多个不同域名,而不同域名对应不同的服务器,自然不会共享同一个连接;
跨域名是不是不能用同一个连接?那么这个单连接的规则是什么?
http2必须要求https支持,所以首要满足https证书完全一致(例如使用泛域名证书);域名解析的后的ip完全一致;
案例:
https://mat1.gtimg.com/pingjs/ext2020/qqindex2018/dist/img/qq_logo_2x.png
http://mat1.gtimg.com/pingjs/ext2020/qqindex2018/dist/img/qq_logo_2x.png
从上面2图对比,对于同一张图片,http1.1和http2 相差0.2kb,那么图片一样(body)的情况下,必然是请求的header有差异,那么http2 是怎么压缩header的呢?
HPACK通过Huffman算法、静态表、动态表对三种header都做了压缩。比如上图中,method GET存在于静态表,用1个字节表示的整数2表达即可;user-agent Mozilla这行头部非常长,当它第2次出现时,用2个字节的整数62表示即可;即使它第1次出现时,也可以用Huffman算法压缩Mozilla这段很长的浏览器标识符,可以获得最多5/8的压缩率。
哈夫曼编码,主要目的是根据使用频率来最大化节省字符(编码)的存储空间。
如上图所示,Http1.1的POST请求,会被封装成为 Headers Frame,Data Frame;
Http2 包含多种Frame的类型,包含HEADERS,DATA,PRIORITY等等,具体每种Frame的作用后面细谈;
浏览器发送一个请求,服务器主动向浏览器推送与这个请求相关的资源,这样浏览器就不用发起后续请求。
Server-Push 主要是针对资源内联做出的优化,相较于 http/1.1 资源内联的优势:
客户端可以缓存推送的资源
客户端可以拒收推送过来的资源
推送资源可以由不同页面共享
服务器可以按照优先级推送资源
TLS 加密中在 Client-Hello 和 Server-Hello 的过程中通过 ALPN 进行协议协商。
应用层协议协商在 TLS 握手第一步的扩展中,Client Hello 中客户端指定 ALPN Next Protocol 为 h2 或者 http/1.1 说明客户端支持的协议。服务端如果在 Server Hello 中选择 h2 扩展,说明协商协议为 h2,后续请求响应跟着变化;如果服务端未设置 http/2 或者不支持 h2,则继续用 http/1.1 通信。
nginx 开启 HTTP2 只需在相应的 HTTPS 设置ssl后加上 http2 即可.
以上是关于彻底掌握Http2协议的主要内容,如果未能解决你的问题,请参考以下文章
HTTP2 协议初识
深入理解 WEB协议HTTP2
HTTP2.0协议
为啥说 HTTP2 是二进制协议?
HTTP2.0协议被曝4个高危漏洞,可致服务器崩溃
5GC基础自学系列 | 5GC协议系列之SBI接口HTTP2