HTTP/2 就是 HTTP 协议的新版本,于 2015 年发布。目前主流浏览器基本都支持该协议,而不少网站也已经迁移到了 HTTP/2 上。javascript
HTTP/2 的前身是由 Google 与 2009 年发布的实验性协议 SPDY,其主要目标是 “经过解决 HTTP/1.1 中广为人知的一些性能限制来减小网页的加载延迟”。css
现有的 HTTP/1.1 的主要性能问题包括:html
注:摘自“HTTP/2 简介”java
为提升性能,而且保持现有的 HTTP 语义和功能不变(这样先后端能够不作更改就能利用 HTTP/2 提供的性能优化),HTTP/2 进行了如下主要优化:git
注:参考“HTTP 2 的新特性你 get 了吗? - 知乎”github
详细介绍请阅读这篇文章:web
HTTP/2 简介 - Google Developers
这篇文章图文并茂,讲得也很是全面,完整的英文版在这:npm
HTTP/2 - High Performance Browser Networking
做者 Ilya Grigorik
浏览器与服务器并不肯定对方必定支持 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 的版本。