HTTP/2 学习

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 的版本。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 在一战GRE后,我重新调整了自己下一个月的生活计划,改变原先一门心思地投入GRE备考,到针对攻克GRE单词适当做练...
    玖代乒乓球谱阅读 283评论 0 3
  • 和同事聊天,我说,练习打坐静心还有桩功对我帮助很大。 话还没说完,同事就问,那你以前什么样? 这可真是个好问题,以...
    斜杠青年大丹丹阅读 437评论 0 0