客户端明确指定优先级 , 服务端可以根据这个优先级作为依据交互数据 , 比如客户端优先级设置为.css>.js>.jpg(具体可参见《高性能网站建设指南》) , 服务端按优先级返回结果有利于高效利用底层连接 , 提高用户体验 。
然而 , 也不能过分迷信请求优先级 , 仍然要注意以下问题:
- 服务端是否支持请求优先级
- 会否引起队首阻塞问题 , 比如高优先级的慢响应请求会阻塞其他资源的交互 。

文章插图
PUSH_PROMISE帧是服务端向客户端有意推送资源的信号 。
- 如果客户端不需要服务端Push , 可在SETTINGS帧中设定服务端流的值为0 , 禁用此功能
- PUSH_PROMISE帧中只包含预推送资源的首部 。如果客户端对PUSH_PROMISE帧没有意见 , 服务端在PUSH_PROMISE帧后发送响应的DATA帧开始推送资源 。如果客户端已经缓存该资源 , 不需要再推送 , 可以选择拒绝PUSH_PROMISE帧 。
- PUSH_PROMISE必须遵循请求-响应原则 , 只能借着对请求的响应推送资源 。
目前 , Apache的mod_http2能够开启 H2Push on服务端推送Push 。Nginx的ngx_http_v2_module还不支持服务端Push 。
Apache mod_headers example<Location /index.html>Header add Link "</css/site.css>;rel=preload"Header add Link "</images/logo.jpg>;rel=preload"</Location>123455. 首部压缩HTTP 1.x每一次通信(请求/响应)都会携带首部信息用于描述资源属性 。HTTP 2.0在客户端和服务端之间使用“首部表”来跟踪和存储之前发送的键-值对 。首部表在连接过程中始终存在 , 新增的键-值对会更新到表尾 , 因此 , 不需要每次通信都需要再携带首部 。
文章插图
另外 , HTTP 2.0使用了首部压缩技术 , 压缩算法使用HPACK 。可让报头更紧凑 , 更快速传输 , 有利于移动网络环境 。
需要注意的是 , HTTP 2.0关注的是首部压缩 , 而我们常用的gzip等是报文内容(body)的压缩 。二者不仅不冲突 , 且能够一起达到更好的压缩效果 。
6. 一个完整的HTTP 2.0通信过程考虑一个问题 , 客户端如何知道服务端是否支持HTTP 2.0?是否支持对二进制分帧层的编码和解码?所以 , 在两端使用HTTP 2.0通信之前 , 必然存在协议协商的过程 。
6.1 基于ALPN的协商过程支持HTTP 2.0的浏览器可以在TLS会话层自发完成和服务端的协议协商以确定是否使用HTTP 2.0通信 。其原理是TLS 1.2中引入了扩展字段 , 以允许协议的扩展 , 其中ALPN协议(Application Layer Protocol Negotiation, 应用层协议协商, 前身是NPN)用于客户端和服务端的协议协商过程 。
服务端使用ALPN , 监听443端口默认提高HTTP 1.1 , 并允许协商其他协议 , 比如SPDY和HTTP 2.0 。
比如 , 客户端在TLS握手Client Hello阶段表明自身支持HTTP 2.0

文章插图
服务端收到后 , 响应Server Hello , 表示自己也支持HTTP 2.0 。双方开始HTTP 2.0通信 。

文章插图
6.2 基于HTTP的协商过程然而 , HTTP 2.0一定是HTTPS(TLS 1.2)的特权吗?
当然不是 , 客户端使用HTTP也可以开启HTTP 2.0通信 。只不过因为HTTP 1. 0和HTTP 2. 0都使用同一个 端口(80) , 又没有服务器是否支持HTTP 2. 0的其他任何 信息 , 此时 客户端只能使用HTTP Upgrade机制(OkHttp, nghttp2等组件均可实现 , 也可以自己编码完成)通过协调确定适当的协议:
HTTP Upgrade requestGET / HTTP/1.1host: nghttp2.orgconnection: Upgrade, HTTP2-Settingsupgrade: h2c/*发起带有HTTP2.0 Upgrade头部的请求*/http2-settings: AAMAAABkAAQAAP__/*客户端SETTINGS净荷*/user-agent: nghttp2/1.9.0-DEVHTTP Upgrade responseHTTP/1.1 101 Switching Protocols/*服务端同意升级到HTTP 2.0*/Connection: UpgradeUpgrade: h2cHTTP Upgrade success/*协商完成*/1234567891011121314
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 5分钟!彻底搞懂MyBatis插件+PageHelper原理
- 深入理解HTTPS工作原理
- HTTPS浅析与抓包分析
- 承压式太阳能热水器原理介绍
- Linux|优麒麟22.04 LTS正式发布:全新桌面、10多款自研应用
- 甲烷燃料电池原理及介绍
- 系统Hosts文件原理和应用
- 铝空气电池的原理及应用
- 喝茶减肥的5个误区,喝茶减肥的原理是什么
- 炒菜为什么要翻锅 炒菜不入味是什么原理
