• 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的浏览器:

  • 相关阅读:
    矩阵价值和
    排列组合问题
    X国的军队
    石子合并加强版
    P1042 乒乓球
    Dinner 点餐
    一文看尽图像分类问题
    [Udemy] Recommender Systems and Deep Learning in Python
    推荐系统学习
    [NLP] 酒店名归类
  • 原文地址:https://www.cnblogs.com/milanleon/p/10900098.html
Copyright © 2020-2023  润新知