什么是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归属到各自不同的服务端请求里面。
原理图
HTTP 1.1 vs. HTTP 2
新二进制格式(Binary Format)
HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑 HTTP 2.0 的协议解析决定采用二进制格式,实现方便且健壮。实现关键之一就是在应用层(HTTP/2)和传输层(TCP 或 UDP)之间增加一个二进制分帧层。
Header压缩
HTTP/2.0使用了Header压缩技术,压缩算法使用HPACK。可让报头更紧凑,更快速传输,有利于移动网络环境。
需要注意的是,HTTP/2.0关注的是报头(header)压缩,而我们常用的gzip等是报文内容(body)的压缩。二者不仅不冲突,且能够一起达到更好的压缩效果。
以一个空文档(body大小可忽略)为例:
HTTP/1.1的大小为252B
HTTP/2的大小为140B,压缩了100B,接近50%
服务端推送(server push)
Server Push:即服务端能通过push的方式将客户端需要的内容预先推送过去,也叫“cache push”。
传统方式:客户端请求,服务器响应,客户端逐一解析需要后续请求的图片、样式等资源,再次一一发送资源请求。
HTTP/2服务器:根据客户端请求,计算出响应内容所包含的资源,在客户端发起请求之前提前发送给客户端。 这样做节省了客户端主动发起请求的时间的往返时间。
优势
提升网站访问速度
通过使用最新的Chrome浏览器或者Firefox浏览器访问演示网站,页面加载效果对比图如下:
降低服务器压力
HTTP/2.0多路复用的特性可以减少服务器端的并发连接数,在一定程度上,可以允许更多的用户访问网站资源,从而降低对服务器的压力。
部分替代异步加载的使用
HTTP/2.0的优势在于多连接的并发下载,对于图片资源、js、css文件较多,使用异常加载的站点来说,HTTP/2.0的优势是明显的。但对于仅使用异步加载加载文字内容的站点来说,效果不明显。
声明:使用HTTP/2.0不代表可以不优化就能达到与HTTP/1.1优化一样的效果,针对HTTP/2.0做优化还是有必要的。
保护网站安全
HTTP/2.0现阶段必须使用HTTPS加密,在很大程度上保证了网站的数据安全。
如何实现
准备工作
Web服务器:Nginx 1.9.5或更高版本才集成http_v2_module模块。
操作系统:Window 10与Window Server 2016中的IIS 10才支持HTTP/2.0。
OpenSSL 1.0.2及以上版本。
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个参数,如果没有需重新编译。
配置
主要是配置Nginx的server块。根据各自的环境,修改相关
.conf
文件。一般在 /usr/local/nginx/conf/vhost/ 或者 /etc/nginx/conf/。对要使用证书的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
命令来检测是否配置正确。
重启Nginx。
检验HTTP/2和HTTPS
检测网页是否支持HTTP/2,可访问https://www.ssllabs.com/ssltest/进行检测。
在Chrome浏览器上可以通过HTTP/2 and SPDY indicator插件来检验,如果地址栏出现蓝色的闪电就是HTTP/2,也可以在chrome://net-internals/#http2 中检查。