1.HTTP的历史
HTTP出现已有近30年的历史了。
最早的版本HTTP 0.9发布于1991。
随后的HTTP 1.0发布于1996.5,提供了缓存相关的Head,如If-Modified-Since,Expires等。
1999年发布的HTTP 1.1是使用最广泛的版本,其改进的特征如下:
- 增强了缓存相关的Head: Entity tag,If-Unmodified-Since, If-Match, If-None-Match
- 对象请求更精确,提供的请求Head: Range
- 为了支持共享IP的多个虚拟服务器,提供的请求Head为Host: www.sina.com.cn
- 客户端与服务器之间的长连接(persistent connection),提供的Head为Connection: keep-alive
- 客户端与服务器之间的连接顺序流水线处理pipeline
- 更丰富的错误响应状态码
但是HTTP1.1仍然有如下明显的不足:
- 连接可以串联,但是无法并发
- 明文传输
- Header体积过于庞大
- keep-alive造成服务器压力山大
2.SPDY
由于HTTP继续改进缓慢,忍无可忍的Google在2009发布了 SPDY。SPDY仍然是一个应用层协议,在TCP之上,在SSL/TLS和HTTP之间。主要是从会话的角度增强了HTTP 1.1以提高Web页面的访问速度。HTTP 2.0主要就是基于SPDY标准化推出的,可以说SPDY几乎完全被HTTP 2.0接受。SPDY的最后版本是SPDY 3.1,HTTP 2.0发布后就终止独立发展了。
SPDY从一开始就建立在SSL/TLS安全会话的基础上,因而强制要求HTTPS,为此还提供了专门的安全会话协商协议NPN。
NPN (Next Protocol Negotiation)是一个TLS的扩展,以支持在应用层的443端口使用SPDY协议。NPN自始至终都只是RFC内部草案,随着SPDY向HTTP 2.0的标准化推进,2012年10月就已经终止了(Chrome 51以后的浏览器就不支持了)。用以替代NPN的是ALPN。
ALPN (Application-Layer Protocol Negotiation)也一个TLS的扩展,以支持在应用层的443端口使用HTTP2协议。ALPN于2014年7月发布为RFC 7301标准。
3.HTTP2.0
万事俱备,HTTP 2.0终于横空出世了。HTTP 2.0也被称为HTTP/2,或H2。2015年5月IETF发布,是SPDY 2的标准化。
HTTP 2.0规范由两个部分组成:
- Hypertext Transfer Protocol version 2,RFC7540
- HPACK - Header Compression for HTTP/2,RFC7541
HTTP 2.0规范的特点:
- 数据以二进制编码传输(通过二进制分帧层Binary framing,该层属于应用层,位于SSL/TLS与HTTP之间,也导致无法向后兼容)
与SPDY不同的是,HTTP 2.0支持密文传输,也支持明文传输;而SPDY只支持密文传输。
- 消息头压缩传输以降低网络的流量
与SPDY不同的是,HTTP 2.0采用HPACK压缩算法,而SPDY采用DEFLATE压缩算法
- 多路复用,即一个TCP连接可以一次发生多个请求,一次接收多个响应;并发的请求或响应之间无互相阻塞
- 服务端主动把静态JS/CSS等资源推送给客户端
4. 对HTTP 2.0的支持情况
支持HTTP 2.0的服务器或客户端实现列表如下:
https://github.com/http2/http2-spec/wiki/Implementations
4.1 服务器
服务器要支持HTTPS 2.0,除了TLS 1.2+,还需要一个TLS扩展ALPN,不同的服务器实现不同。目前服务器的支持情况如下:
- Nginx 1.9.5+
- NodeJS 8.4.0+ (node-http2)
- Apache 2.4.17+ (mod_http2)
a2enmod http2
site配置文件中:Protocols h2 http/1.1
- Apache Tomcat 8.5+ (libtcnative,JDK8)
- Apache Tomcat 9.0+ (JDK9)
- Undertow 1.3 (alpn_boot)
- Undertow 1.4+
- Jetty 9.4.8 (alpn_boot)
4.2 浏览器
支持HTTP 2.0的浏览器:
- Google Chrome 49, 65~69
- Mozilla Firefox 59~62
- Microsoft Edge 16~18
- Safari 11.1, 12, TP
- IE 11
4.3 支持HTTP 2.0的客户端工具
- OpenSSL 1.0.2+
- LibreSSL 2.5.0+
- curl 7.36.0 , libcurl(基于nghttp2)
curl --http2
- Wireshark
4.4 支持HTTP 2.0的开发类库
- C语言
nghttp2
- Java语言
JDK 9, 10
Apache HttpComponents 5.0-beta1(2018.1.18)
OkHttp
Netty
Jetty
5. 验证服务器是否支持HTTP 2.0
https://tools.keycdn.com/http2-test
chrome://net-internals/#http2
6. 对比HTTP1.1与HTTP2.0加载图片的效果
https://http2.akamai.com/demo
参考链接:
http://dev.chromium.org/spdy
https://github.com/http2
https://nghttp2.org/