一点一滴成长

导航

HTTP 2.0

  HTTP/2 可以说是google早些年推出的SPDY方案的升级版,HTTP2.0 跟 SPDY 不同的地方主要是以下两点:

  • HTTP2.0 支持HTTPS但也支持明文 HTTP 传输,SPDY 则强制使用 HTTPS
  • HTTP2.0 消息头的压缩算法采用 HPACK,而非 SPDY 采用的 DEFLATE

  关于HTTP/2的讨论仍在持续,所以不能排除会发生重大改变的可能性——《图解HTTP》。

 HTTP/2 相较与HTTP/1.1 基本语义是不变的,主要的变化在于以下几点:

1、多路复用

  多路复用允许同时通过单一的 HTTP连接发起多重的请求-响应消息,这样就可以实现多流并行而不用依赖建立多个 TCP 连接,如下图所示。 HTTP/2 引入二进制数据帧和流的概念,其中帧对数据进行顺序标识,这样浏览器收到数据之后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况。同样是因为有了序列,服务器就可以并行的传输数据。

  

2、二进制帧

  HTTP/1.1报文是文本格式,HTTP/2中则为二进制格式:

  

3、首部压缩

  HTTP2.0在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送;通信期间几乎不会改变的通用键-值对(用户代理、可接受的媒体类型,等等)只需发送一次。事实上, 如果请求中不包含首部(例如对同一资源的轮询请求),那么首部开销就是零字节。此时所有首部都自动使用之前请求发送的首部。

  如果首部发生变化了,那么只需要发送变化了数据在Headers帧里面,新增或修改的首部帧会被追加到“首部表”,如下图所示。首部表在 HTTP2.0的连接存续期内始终存在,由客户端和服务器共同渐进地更新。

  

4、服务端推送

  在HTTP/1.1中,当浏览器请求一个网页后,服务器将会发回HTML,服务器需要等待浏览器解析HTML后发送所有内嵌资源的请求,在浏览器发送了资源的请求后服务器才开始发送这些JavaScript、图片和CSS。HTTP/2 的服务器推送所作的工作就是,服务器在收到客户端对某个资源的请求时,会判断客户端十有八九还要请求其他的什么资源,然后一同把这些资源都发送给客户端,即便客户端还没有明确表示它需要这些资源。客户端可以选择把额外的资源放入缓存中(所以这个特点也叫 Cache push),也可以选择发送一个 RST_STREAM frame 拒绝任何它不想要的资源。

  

  服务器推送是 HTTP/2 协议里面,唯一一个需要开发者自己配置的功能。其他功能都是服务器和浏览器自动实现,不需要开发者关心。

  服务器推送有一个很麻烦的问题。所要推送的资源文件,如果浏览器已经有缓存,推送就是浪费带宽。即使推送的文件版本更新,浏览器也会优先使用本地缓存。一种解决办法是,只对第一次访问的用户开启服务器推送。下面是 Nginx 官方给出的示例,根据 Cookie 判断是否为第一次访问:

  server { listen 443 ssl http2 default_server; ssl_certificate ssl/certificate.pem; ssl_certificate_key ssl/key.pem; root /var/www/html;http2_push_preload on; location = /demo.html { add_header Set-Cookie "session=1"; add_header Link $resources; }}map $http_cookie $resources {"~*session=1""";default"</style.css>; as=style; rel=preload";}

  服务器推送可以提高性能,大概会比HTTP/1.1快了几百毫秒,提升程度也不是特别多,而且,也不建议一次推送太多资源,这样反而会拖累性能,因为浏览器不得不处理所有推送过来的资源。只推送 CSS 样式表可能是一个比较好的选择。

5、主动重置链接

  HTTP消息被送出之后,我们就很难中断它了。当然,通常我们可以断开整个TCP链接(但也不总是可以这样),但这样导致的代价就是需要重新通过三次握手建立一个新的TCP连接。比如,很多app客户端都有取消图片下载的功能场景,对于http1.x来说,是通过设置tcp segment里的reset flag来通知对端关闭连接的,这种方式会直接断开连接,下次再发请求就必须重新建立连接。http2.0引入RST_STREAM类型的frame,使用它来让客户端在已有的连接中发送重置请求,这样可以在不断开连接的前提下取消某个request的stream,即中断或者放弃响应。当浏览器进行页面跳转或者用户取消下载时,它可以防止建立新连接。

 

 

 现在 nginx、tomcat 都有支持 http2 的配置  ,一些支持http2的浏览器:

posted on 2019-05-21 15:57  整鬼专家  阅读(1908)  评论(0编辑  收藏  举报