http2升级过程

更新于 阅读 2

http2升级过程

Http2要求nginx版本在1.9.5以上才支持**--with-http_v2_module**模块,同时需要配合https使用

  1. 使用
nginx -v

查看是否支持模块

--with-http_v2_module
  1. 修改nginx配置
listen 443 ssl http2; listen [::]:443 ssl http2;
  1. 重启nginx
service nginx restart

这时可以在浏览器访问页面,打开开发者工具,选择network,查看Protocol是否为h2

http2介绍

  • 帧:最小的传输单元、乱序(在客户端按照首部的标记拼接起来)

  • 消息: 由多个帧组合起来

  • 多路复用:浏览器在多请求并发时对同一个域名由连接数限制,一般在http/1个,所以http/1在并发时会被挂起一段时间,http/2所有的请求都在一个链接上,减少了延迟和内存消耗

  • 优先级:http/2每个请求都可以携带一个31bit的优先值,为0时优先级最高,数值越大优先级越低。根据优先级客户端和服务器就可以对不同的流采取不同的策略,以最优的方式发送流、消息和帧。

  • 服务器推送:

    • 服务器可以主动推送资源
    • 推送的资源有自己独立的URL,可以缓存,可以被多页面共享
    • 资源遵守同源策略,不可以推送第三方资源
    • 客户端可以拒绝推送的资源

    给基于以上特征:

    • 客户端可以在http头部中列出哪些资源需要被推送,
    • 服务器根据请求的html,推测出客户端接下来需要哪些资源
  • 头部压缩:

    • http/2通过"首部表"来跟踪和存储之前发送的键—值对,对于相同的键—值对,不再通过每次请求和响应发送
    • “首部表”存在于连接的存续期内,由客户端和服务器共同维持
    • 对于新的键—值对,要么添加到表的末尾,要么更新
  • ALPN:应用层协商协议

    客户端、服务器需要升级才能使用http/2,在此过程中必然存在http/2、http/1共同存在的情况,端口都是80,这是就需要通过应用层协商协议:

    • 客户端发起的请求,如果是http/2,会带有upgrade头部
    • 如果服务器不支持,拒绝升级协议,使用http1.1返回
    • 服务器支持,接受升级,切换到新分帧,使用http/2通信