HTTP及其2.0版本综述

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/

猜你喜欢

转载自blog.csdn.net/taiyangdao/article/details/80873324