什么是HTTP/2.0

HTTP/2.0(超文本传输协议第2版,最初命名为HTTP 2.0),是HTTP协议的的第二个主要版本,使用于万维网。HTTP/2.0是HTTP协议自1999年HTTP 1.1发布后的首个更新,主要基于SPDY协议。它由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小组进行开发。该组织于2014年12月将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。HTTP/2标准于2015年5月以RFC 7540正式发表。

发展趋势

主流互联网平台、组件和模块大部分都已经支持HTTP/2.0,如浏览器(Chrome、Safari、FF、Opera)、web服务器(Apache、Nginx、IIS)、proxy服务器(Squid、Varnish)、以及其他如curl、netty、jetty等。HTTP/2.0的广泛应用给用户带来更好的浏览体验。

在主流语言方面,大多已经有了成熟可用的http/2协议库,至少已经覆盖了C/C++、js、java、perl、go、python、ruby、php等,进一步简化向http/2的迁移工作。

新特性

HTTP/2.0的一些新的特性有:

多路复用(MultiPlexing)

即连接共享。每一个request都是是用作连接共享机制的,一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的id将request归属到各自不同的服务端请求里面。

原理图

006tNc79gy1fruiwsmpq3j30jg0a1aa5.jpg

HTTP 1.1 vs. HTTP 2

006tNc79gy1fruiypso0fj30go0gijrs.jpg

新二进制格式(Binary Format)

HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑 HTTP 2.0 的协议解析决定采用二进制格式,实现方便且健壮。实现关键之一就是在应用层(HTTP/2)和传输层(TCP 或 UDP)之间增加一个二进制分帧层。
006tNc79gy1fruizq0lwij30hd090gm0.jpg

Header压缩

HTTP/2.0使用了Header压缩技术,压缩算法使用HPACK。可让报头更紧凑,更快速传输,有利于移动网络环境

需要注意的是,HTTP/2.0关注的是报头(header)压缩,而我们常用的gzip等是报文内容(body)的压缩。二者不仅不冲突,且能够一起达到更好的压缩效果。

以一个空文档(body大小可忽略)为例:

  • HTTP/1.1的大小为252B
    006tNc79gy1fruj0lo4s6j313y01pjrd.jpg

  • HTTP/2的大小为140B,压缩了100B,接近50%
    006tNc79gy1fruj1kie1xj313z01qt8p.jpg

服务端推送(server push)

Server Push:即服务端能通过push的方式将客户端需要的内容预先推送过去,也叫“cache push”。

传统方式:客户端请求,服务器响应,客户端逐一解析需要后续请求的图片、样式等资源,再次一一发送资源请求。

HTTP/2服务器:根据客户端请求,计算出响应内容所包含的资源,在客户端发起请求之前提前发送给客户端。 这样做节省了客户端主动发起请求的时间的往返时间。
006tNc79gy1fruj6m71hyj30x60d20t0.jpg

优势

提升网站访问速度

通过使用最新的Chrome浏览器或者Firefox浏览器访问演示网站,页面加载效果对比图如下:
006tKfTcly1fsbwugu4bhj31kw0sh45x.jpg

降低服务器压力

HTTP/2.0多路复用的特性可以减少服务器端的并发连接数,在一定程度上,可以允许更多的用户访问网站资源,从而降低对服务器的压力。

部分替代异步加载的使用

HTTP/2.0的优势在于多连接的并发下载,对于图片资源、js、css文件较多,使用异常加载的站点来说,HTTP/2.0的优势是明显的。但对于仅使用异步加载加载文字内容的站点来说,效果不明显。

声明:使用HTTP/2.0不代表可以不优化就能达到与HTTP/1.1优化一样的效果,针对HTTP/2.0做优化还是有必要的。

保护网站安全

HTTP/2.0现阶段必须使用HTTPS加密,在很大程度上保证了网站的数据安全。

如何实现

准备工作

  1. Web服务器:Nginx 1.9.5或更高版本才集成http_v2_module模块。

  2. 操作系统:Window 10与Window Server 2016中的IIS 10才支持HTTP/2.0。

  3. OpenSSL 1.0.2及以上版本。

  4. SSL证书:由于HTTP/2.0必须使用HTTPS加密,所以申请受信任的的SSL证书是必不可少的。更多SSL证书的相关知识,请参阅什么是SSL证书如何选购适合的SSL证书在Gworg中申请SSL证书等内容。

安装配置(以Nginx为例)

安装/编译

./configure需加入参数--with-http_v2_module以及--with-http_ssl_module,以便开启支持HTTP/2.0和SSL,然后执行make命令,若无错误则执行make install命令。

你可通过运行nginx -V命令行来查看是否存在上述2个参数,如果没有需重新编译。

配置
  1. 主要是配置Nginx的server块。根据各自的环境,修改相关.conf文件。一般在 /usr/local/nginx/conf/vhost/ 或者 /etc/nginx/conf/

  2. 对要使用证书的virtualhost进行SSL相关配置:

server {listen 443 ssl http2 default_server;server_name www.yourdomain.com;  # www.yourdomain.com替换为你的domainroot /path/www;index index.htm index.html;charset utf-8;#配置SSL证书路径ssl_certificate /path/to/public.crt;ssl_certificate_key /path/to/private.key;ssl_prefer_server_ciphers on;# 分配50MB的共享内存缓存,不同工作进程共享TLS会话信息sl_session_cache shared:SSL:50m;# 设置会话缓存过期时间1天ssl_session_timeout 1d;#使用安全协议ssl_protocols TLSv1.2;#使用安全的加密算法ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-  SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-  ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-  SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-  AES128-SHA256';# OCSP Stapling ---# fetch OCSP records from URL in ssl_certificate and cache themssl_stapling on;ssl_stapling_verify on;# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)add_header Strict-Transport-Security max-age=15768000;

通过运行/usr/local/nginx/sbin/nginx -t或者nginx -t命令来检测是否配置正确。

  1. 重启Nginx。

检验HTTP/2和HTTPS
  • 检测网页是否支持HTTP/2,可访问https://www.ssllabs.com/ssltest/进行检测。

  • 在Chrome浏览器上可以通过HTTP/2 and SPDY indicator插件来检验,如果地址栏出现蓝色的闪电就是HTTP/2,也可以在chrome://net-internals/#http2 中检查。