HTTP/2HTTP 2.0即超文本传输协议 2.0,是下一代HTTP协议 。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发 。是自1999年http1.1发布后的首个更新,HTTP/2 协议是从 SPDY 演变而来,SPDY 已经完成了使命并很快就会退出历史舞台(例如 Chrome 在「2016 年初结束对 SPDY 的支持」;Nginx在版本1.9.5+,Apache在版本2.4.16+都已经全面支持HTTP/2 。
上图是Akamai的HTTP/2 DEMO,通过加载300张图片,对比HTTP/1.1和HTTP/2,首先直观地感受一下HTTP/2,下来解释一下这个感受的原因,即HTTP/2新特性:
- 二进制分帧
- 首部压缩
- 流量控制
- 多路复用
- 请求优先级
- 服务器推送
HTTP 1.x在应用层以纯文本的形式进行通信,HTTP2.0在不改变HTTP1.x的语义、方法、状态码、URL以及首部字段的情况下,为了突破原有性能限制,在应用层(HTTP)和传输层(TCP)之间增加了一个二进制分帧层 。HTTP2.0将所有的传输信息分割为更小的消息和帧,并对它们采用二进制格式编码,如下图所示
文章插图
这里引入一个新的通信单位:帧
帧是HTTP 2.0通信的最小单位,包括帧首部、流标识符、优先值和帧净荷等
文章插图
其中,帧类型可以分为:
- DATA:用于传输HTTP消息体
- HEADERS:用于传输首部字段
- SETTINGS:用于约定客户端和服务端的配置数据 。比如设置初识的双向流量控制窗口大小
- WINDOW_UPDATE:用于调整个别流或个别连接的流量
- PRIORITY: 用于指定或重新指定引用资源的优先级
- RST_STREAM: 用于通知流的非正常终止
- PUSH_ PROMISE: 服务端推送许可
- PING: 用于计算往返时间,执行“ 活性” 检活
- GOAWAY: 用于通知对端停止在当前连接中创建流
下面是抓包的一个HEADERS帧:
文章插图
另外一个两个要说一下的概念:消息和流
消息是指逻辑上的HTTP消息(请求/响应),一系列数据帧组成一个完整的消息,比如一系列DATA帧和一个HEADERS帧组成了请求消息 。
流是链接中的一个虚拟信道,可以承载双向消息传输,每个流有唯一证书标识符,为了防止两端流ID冲突,客户端发起的流具有奇数ID,服务端发起的流具有偶数ID 。
所有HTTP 2.0通信都在一个TCP链接上完成,这个链接可以承载任意数量的双向数据流Stream 。相应地,每个数据流以消息的形式发送,而消息由一个或多个帧组成,这些帧可以乱序发送,然后根据每个帧首部的流标识符重新组装 。
文章插图
二进制分帧主要是为HTTP2.0其他特性提供基础 。它能把一个数据划分封装为更小更便捷的数据 。首先是在单链多资源方式中,减少服务端的链接压力,内存占用更少,链接吞吐量更大;另一方面,由于TCP链接的减少而使网络拥塞状态得以改善,同时慢启动时间减少,使拥塞和丢包恢复的速度更快 。
首部压缩HTTP1.x每次通信(请求或响应)都会携带首部信息用于描述资源属性 。而HTTP2.0在客户端和服务端之间使用首部表来跟踪和存储之前发送的键值对,首部表在连接过程中始终存在,新增的键值对会更新到表尾,因此不需要每次通信都携带首部,请求与响应首部的定义在HTTP2.0中基本没有变 。
文章插图
另外HTTP2.0使用了首部压缩技术,压缩算法采用HPACK,让报头更紧凑、更快速传输,有利于移动网络环境 。需要注意的是,HTTP2.0的首部压缩,与我们常用的gzip等报文内容压缩不冲突 。
流量控制HTTP/2.0 "流"的流量控制的目标是:在不改变协议的情况下允许使用多种流量控制算法
- 流量控制是特定于一个连接的 。每种类型的流量控制都是在单独的一跳的两个端点之间的,并不是在整个端到端的路径上的 。(这里的一跳指的是HTTP连接的一跳,而不是IP路由的一跳)
推荐阅读
- 免费申请 HTTPS 证书,开启全站 HTTPS
- Linux性能实时监测工具 Netdata
- 如何给域名配置https证书
- 图文教程 阿里云申请免费SSL证书实现网站HTTPS化
- MySQL中,索引,主键对数据库的性能有什么影响
- 小程序性能优化总结
- mysql优化实战:千万级数据表如何进行分页查询?
- Python密码系统速查表
- 一份SEO优化操作方案具体讲解
- JS全局变量是如何工作的?