优化你的HTTPS(上),你需要这么做

HTTP/2

HTTP 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。

首先看看HTTP/2的一些新特性:

  • 二进制分帧

  • 首部压缩

  • 流量控制

  •  

  • 二进制分帧

    二进制分帧层,是HTTP2.0性能增强的核心。

    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:用于通知对端停止在当前连接中创建流

    标志位,用于不同的帧类型定义特定的消息标志。比如DATA帧就可以使用End Stream: true表示该条消息通信完毕;流标识位表示帧所属的流ID;优先值用于HEADERS帧,表示请求优先级;R表示保留。

  • 下面是抓包的一个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路由的一跳)

  • 流量控制是基于WINDOW_UPDATE帧的。接收方公布自己打算在每个流以及整个连接上分别接收多少字节。这是一个以信用为基础的方案。

  • 流量控制是有方向的,由接收者全面控制。接收方可以为每个流和整个连接设置任意的窗口大小。发送方必须尊重接收方设置的流量控制限制。客户方、服务端和中间代理作为接收方时都独立地公布各自的流量控制窗口,作为发送方时都遵守对端的流量控制设置。

  • 无论是新流还是整个连接,流量控制窗口的初始值是65535字节。

  • 帧的类型决定了流量控制是否适用于帧。目前,只有DATA帧服从流量控制,所有其它类型的帧并不消耗流量控制窗口的空间。这保证了重要的控制帧不会被流量控制阻塞。

  • 流量控制不能被禁用。

  • HTTP/2只定义了WINDOW_UPDATE帧的格式和语义,并没有规定接收方如何决定何时发送帧、发送什么样的值,也没有规定发送方如何选择发送包。具体实现可以选择任何满足需求的算法。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-11-10 16:29  莫孟林  阅读(398)  评论(1编辑  收藏  举报