HTTPS性能优化原理与实践——如何优化HTTPS

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新特性:

  • 二进制分帧
  • 首部压缩
  • 流量控制
  • 多路复用
  • 请求优先级
  • 服务器推送
二进制分帧二进制分帧层,是HTTP2.0性能增强的核心
HTTP 1.x在应用层以纯文本的形式进行通信,HTTP2.0在不改变HTTP1.x的语义、方法、状态码、URL以及首部字段的情况下,为了突破原有性能限制,在应用层(HTTP)和传输层(TCP)之间增加了一个二进制分帧层 。HTTP2.0将所有的传输信息分割为更小的消息和帧,并对它们采用二进制格式编码,如下图所示
HTTPS性能优化原理与实践——如何优化HTTPS

文章插图
 
这里引入一个新的通信单位:帧
帧是HTTP 2.0通信的最小单位,包括帧首部、流标识符、优先值和帧净荷等
HTTPS性能优化原理与实践——如何优化HTTPS

文章插图
 
其中,帧类型可以分为:
  • DATA:用于传输HTTP消息体
  • HEADERS:用于传输首部字段
  • SETTINGS:用于约定客户端和服务端的配置数据 。比如设置初识的双向流量控制窗口大小
  • WINDOW_UPDATE:用于调整个别流或个别连接的流量
  • PRIORITY: 用于指定或重新指定引用资源的优先级
  • RST_STREAM: 用于通知流的非正常终止
  • PUSH_ PROMISE: 服务端推送许可
  • PING: 用于计算往返时间,执行“ 活性” 检活
  • GOAWAY: 用于通知对端停止在当前连接中创建流
标志位,用于不同的帧类型定义特定的消息标志 。比如DATA帧就可以使用End Stream: true表示该条消息通信完毕;流标识位表示帧所属的流ID;优先值用于HEADERS帧,表示请求优先级;R表示保留 。
下面是抓包的一个HEADERS帧:
HTTPS性能优化原理与实践——如何优化HTTPS

文章插图
 
另外一个两个要说一下的概念:消息和流
消息是指逻辑上的HTTP消息(请求/响应),一系列数据帧组成一个完整的消息,比如一系列DATA帧和一个HEADERS帧组成了请求消息 。
流是链接中的一个虚拟信道,可以承载双向消息传输,每个流有唯一证书标识符,为了防止两端流ID冲突,客户端发起的流具有奇数ID,服务端发起的流具有偶数ID 。
所有HTTP 2.0通信都在一个TCP链接上完成,这个链接可以承载任意数量的双向数据流Stream 。相应地,每个数据流以消息的形式发送,而消息由一个或多个帧组成,这些帧可以乱序发送,然后根据每个帧首部的流标识符重新组装 。
HTTPS性能优化原理与实践——如何优化HTTPS

文章插图
 
二进制分帧主要是为HTTP2.0其他特性提供基础 。它能把一个数据划分封装为更小更便捷的数据 。首先是在单链多资源方式中,减少服务端的链接压力,内存占用更少,链接吞吐量更大;另一方面,由于TCP链接的减少而使网络拥塞状态得以改善,同时慢启动时间减少,使拥塞和丢包恢复的速度更快 。
首部压缩HTTP1.x每次通信(请求或响应)都会携带首部信息用于描述资源属性 。而HTTP2.0在客户端和服务端之间使用首部表来跟踪和存储之前发送的键值对,首部表在连接过程中始终存在,新增的键值对会更新到表尾,因此不需要每次通信都携带首部,请求与响应首部的定义在HTTP2.0中基本没有变 。
HTTPS性能优化原理与实践——如何优化HTTPS

文章插图
 
另外HTTP2.0使用了首部压缩技术,压缩算法采用HPACK,让报头更紧凑、更快速传输,有利于移动网络环境 。需要注意的是,HTTP2.0的首部压缩,与我们常用的gzip等报文内容压缩不冲突 。
流量控制HTTP/2.0 "流"的流量控制的目标是:在不改变协议的情况下允许使用多种流量控制算法