什么是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证书、在MPKI中申请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替换为你的domain
root /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 them
ssl_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,可访问myssl.com进行检测。
- 在Chrome浏览器上可以通过HTTP/2 and SPDY indicator插件来检验,如果地址栏出现蓝色的闪电就是HTTP/2,也可以在chrome://net-internals/#http2 中检查。