HTTP/2 学习

作者: NARUTO_86 | 来源:发表于2018-03-21 09:37 被阅读167次

    HTTP/2 是什么?

    HTTP/2 就是 HTTP 协议的新版本,于 2015 年发布。目前主流浏览器基本都支持该协议,而很多网站也已经迁移到了 HTTP/2 上。

    HTTP/2 的前身是由 Google 与 2009 年发布的实验性协议 SPDY,其主要目标是 “通过解决 HTTP/1.1 中广为人知的一些性能限制来减少网页的加载延迟”

    现有的 HTTP/1.1 的主要性能问题包括:

    • HTTP/1.x 客户端需要使用多个连接才能实现并发和缩短延迟
    • HTTP/1.x 不会压缩请求和响应标头,从而导致不必要的网络流量
    • HTTP/1.x 不支持有效的资源优先级,致使底层 TCP 连接的利用率低下
    • ...

    注:摘自“HTTP/2 简介”

    为提高性能,并且保持现有的 HTTP 语义和功能不变(这样前后端可以不做更改就能利用 HTTP/2 提供的性能优化),HTTP/2 进行了以下主要优化:

    • 多路复用的单一长连接:提高吞吐量
    • 头部压缩和二进制格式:减少传输量
    • 服务端推送Server Push:提前获取资源

    注:参考“HTTP 2 的新特性你 get 了吗? - 知乎

    详细介绍请阅读这篇文章:

    HTTP/2 简介 - Google Developers

    这篇文章图文并茂,讲得也非常全面,完整的英文版在这:

    HTTP/2 - High Performance Browser Networking
    作者 Ilya Grigorik

    浏览器与服务器是怎样建立 HTTP/2 连接的呢?

    浏览器与服务器并不确定对方一定支持 HTTP/2,所以会有一个“协商”的过程。

    HTTP/1.1 引入了 Update 机制,使得客户端和服务器可以协商升级到其他协议,例如 WebSocket 协议。当然,也可以采用这种机制来升级到 HTTP/2。

    不过 HTTP/2 和 HTTPS 通常是一起使用的,其中一个好处就是,HTTPS 建立连接过程中,本就有协商的过程,所以可以在这个过程中加入 HTTP 协议的协商。

    Google 在 SPDY 协议中开发了 NPN 的 TLS 扩展,随着 SPDY 被 HTTP/2 取代,NPN 也被官方修订为 ALPN(Application Layer Protocol Negotiation,应用层协议协商)。

    ALPN 的目的就是在建立 HTTPS 连接过程中,顺便进行协议的协商,比如升级到 HTTP/2。

    当然,需要客户端和服务器端都支持 ALPN,不支持的话还是可以通过 HTTP Upgrade 进行协议升级。

    详细内容请阅读:

    谈谈 HTTP/2 的协议协商机制 - Jerry Qu

    实践

    Node.js 从 v8.4.0 开始支持 HTTP/2,一个简化的 HTTP/2 server push 示例:

    const http2 = require('http2')
    
    http2.createSecureServer({
      key: fs.readFileSync('localhost-private.pem'),
      cert: fs.readFileSync('localhost-cert.pem')
    })
    
    h2server.on('stream', (stream, headers) => {
      const path = headers[':path']
    
      if (path === '/') {
        stream.pushStream({':path': '/index.css'}, (pushStream) => {
          stream.respondWithFile('index.css', {
            'content-type': 'text/css'
          })
        })
    
        stream.respondWithFile('index.html', {
          'content-type': 'text/html'
        })
      }
    })
    
    http2.listen(443)
    

    试着写了一个简单的 HTTP/2 DEMO,可以本地运行后验证下 HTTP/2 的一些特性:

    http2-demo - github

    下载到本地后,执行:

    npm start
    

    然后访问本地的 https://localhost:8001/https://localhost:8002/ 就可以分别查看 DEMO 页面的 HTTP/1 和 HTTP/2 版本了。

    注意:需要 Node.js 高于 v8.4.0 的版本。

    相关文章

      网友评论

        本文标题:HTTP/2 学习

        本文链接:https://www.haomeiwen.com/subject/winbqftx.html