菜单

HTTP/2 学习

2019年3月9日 - 金沙前端

HTTP Upgrade

为了更有益于地安顿新说道,HTTP/1.1 引入了 Upgrade
机制,它使得客户端和服务端之间能够凭借已有个别 HTTP
语法升级到任何协议。这几个机制在 MuranoFC7230 的「6.7
Upgrade」这一节中有详细描述。

要倡导 HTTP/1.1 协议升级,客户端必须在伸手底部中钦点那四个字段:

Connection: Upgrade Upgrade: protocol-name[/protocol-version]

1
2
Connection: Upgrade
Upgrade: protocol-name[/protocol-version]

客户端通过 Upgrade
底部字段列出所希望提高到的商议和版本,多少个体协会议时期用 ,(0x2C,
0x20)隔断。除了那多少个字段之外,一般每个新闻工我组织议还会须要客户端发送额外的新字段。

若果服务端不容许升级只怕不协理 Upgrade
所列出的商业事务,直接忽略即可(当成 HTTP/1.1 请求,以 HTTP/1.1
响应);若是服务端统一升级,那么需求这么响应:

HTTP/1.1 101 Switching Protocols Connection: upgrade Upgrade:
protocol-name[/protocol-version] [… data defined by new protocol
…]

1
2
3
4
5
HTTP/1.1 101 Switching Protocols
Connection: upgrade
Upgrade: protocol-name[/protocol-version]
 
[… data defined by new protocol …]

可以见见,HTTP Upgrade 响应的状态码是
101,并且响应正文能够运用新闻工我组织议定义的数额格式。

一经我们在此之前使用过 WebSocket,应该早就对 HTTP Upgrade
机制有所理解。上边是起家 WebSocket 连接的 HTTP 请求:

GET ws://example.com/ HTTP/1.1 Connection: Upgrade Upgrade: websocket
Origin: Sec-WebSocket-Version: 13 Sec-WebSocket-Key:
d4egt7snxxxxxx2WcaMQlA== Sec-WebSocket-Extensions: permessage-deflate;
client_max_window_bits

1
2
3
4
5
6
7
GET ws://example.com/ HTTP/1.1
Connection: Upgrade
Upgrade: websocket
Origin: http://example.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: d4egt7snxxxxxx2WcaMQlA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

那是服务端同意升级的 HTTP 响应:

HTTP/1.1 101 Switching Protocols Connection: Upgrade Upgrade: websocket
Sec-WebSocket-Accept: gczJQPmQ4Ixxxxxx6pZO8U7UbZs=

1
2
3
4
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: gczJQPmQ4Ixxxxxx6pZO8U7UbZs=

在那事后,客户端和服务端之间就足以应用 WebSocket
协议举办双向数据通信,跟 HTTP/1.1 没提到了。能够看到,WebSocket
连接的建立便是出类拔萃的 HTTP Upgrade 机制。

名高天下,那么些机制也能够用做 HTTP/1.1 到 HTTP/2 的磋商升级。例如:

GET / HTTP/1.1 Host: example.com Connection: Upgrade, HTTP2-Settings
Upgrade: h2c HTTP2-Settings:

1
2
3
4
5
GET / HTTP/1.1
Host: example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings:

在 HTTP Upgrade 机制中,HTTP/2 的商议名称是 h2c,代表 HTTP/2
ClearText。假诺服务端不补助 HTTP/2,它会忽略 Upgrade 字段,直接回到
HTTP/1.1 响应,例如:

HTTP/1.1 200 OK Content-Length: 243 Content-Type: text/html …

1
2
3
4
5
HTTP/1.1 200 OK
Content-Length: 243
Content-Type: text/html
 

假定服务端辅助 HTTP/2,那就能够回答 101
状态码及对应底部,并且在响应正文中得以直接行使 HTTP/2 二进制帧:

HTTP/1.1 101 Switching Protocols Connection: Upgrade Upgrade: h2c [
HTTP/2 connection … ]

1
2
3
4
5
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: h2c
 
[ HTTP/2 connection … ]

以下是因此 HTTP Upgrade 机制将 HTTP/1.1 升级到 HTTP/2 的 Wireshark
抓包(两张图能够对照来看):

金沙国际 1

金沙国际 2

听闻 HTTP/2 协议中的描述,额外补充几点:

HTTP Upgrade
机制自小编没什么难点,但很容易受网络中间环节影响。例如无法正确处理
Upgrade 底部的代理节点,很大概导致最终晋级失利。此前大家总括过
WebSocket 的联网意况,发现大批量举世闻名帮助 WebSocket
的浏览器却不能够晋级,只好选取降级方案。

前边的篇章也提到了眼下的运动端互连网常见质量难点,以及对应的优化策略,倘使把HTTP1.1
替换为 HTTP2.0,能够说是互联网品质优化的一步大棋。这几天对 iOS HTTP2.0
实行了简便的调查切磋、测试,在此做个大致的下结论

底部压缩:HTTP2.0 通过 HPACK
格式来压缩尾部,使用了哈夫曼编码压缩、索引表来对尾部大小做优化。索引表是把字符串和数字之间做二个一双两好,比如method:
GET对应索引表中的2,那么一旦在此以前发送过那么些值是,就会缓存起来,之后接纳时意识前边发送过该Header字段,并且值相同,就会沿用以前的目录来顶替那一个Header值。具体实验数据能够参见这里:HTTP/2
底部压缩技术介绍

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

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

HTTP/1.1 引入了 Update
机制,使得客户端和服务器能够切磋升级到任何协商,例如 WebSocket
协议。当然,也能够运用那种体制来提升到 HTTP/2。

只是 HTTP/2 和 HTTPS 平常是二只行使的,个中一个便宜正是,HTTPS
建立连接进度中,本就有协议的长河,所以可以在那一个历程中参与 HTTP
协议的商业事务。

谷歌 在 SPDY 商量中花费了 NPN 的 TLS 增加,随着 SPDY 被 HTTP/2
取代,NPN 也被合法修订为 ALPN(Application Layer Protocol
Negotiation,应用层协议协商)。

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

本来,须要客户端和劳务器端都援救 ALPN,不协助的话还能够通过 HTTP
Upgrade 进行磋商升级。

详细内容请阅读:

座谈 HTTP/2 的情商协商业机械制 – JerryQu

小结

观察此间,相信你势必可以很好地回答本文开始建议的题材。

HTTP/2 须求遵照 HTTPS 安插是现阶段主流浏览器的需要。假使你的 HTTP/2
服务要帮忙浏览器访问,这就务须遵照 HTTPS
布署;要是只给协调客户端用,能够不配备
HTTPS(本条页面列举了很多支撑
h2c 的 HTTP/2 服务端、客户端完结)。

帮忙 HTTP/2 的 Web Server 基本都匡助 HTTP/1.1。那样,就算浏览器不帮忙HTTP/2,双方也得以协商出可用的 HTTP 版本,没有包容性难题。如下表:

浏览器 服务器 协商结果
不支持 HTTP/2 不支持 HTTP/2 不协商,使用 HTTP/1.1
不支持 HTTP/2 支持 HTTP/2 不协商,使用 HTTP/1.1
支持 HTTP/2 不支持 HTTP/2 协商,使用 HTTP/1.1
支持 HTTP/2 支持 HTTP/2 协商,使用 HTTP/2

自然,本文商量的是通用情形。对于团结完结的客户端和服务端,若是打算采取HTTP/2 ClearText,由于 HTTP Upgrade
协商会扩充3次来回,能够须求双方必须帮衬 HTTP/2,直接发送 HTTP/2
数据,不走协商。

打赏支持笔者写出越来越多好小说,谢谢!

打赏小编

大礼包

GET /default.htmHTTP/1.1Host: server.example.comConnection: Upgrade,
HTTP2-Settings  Upgrade: h2c  HTTP2-Settings:

实践

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

有关作者:JerryQu

金沙国际 3

专注 Web 开发,关怀 Web
性能优化与克拉玛依。
个人主页 ·
小编的篇章 ·
2 ·
  

金沙国际 4

金沙国际 5

HTTP 2.0
使用新的二进制格式:基本的协商单位是帧,每一种帧都有两样的种类和用途,规范中定义了10种分化的帧。例如,报头(HEADE汉兰达S)和数据(DATA)帧组成了宗旨的HTTP
请求和响应;其余帧例如 设置(SETTINGS),窗口更新(WINDOW_UPDATE),
和推送承诺(PUSH_PROMISE)是用来落到实处HTTP/2的别样职能。那一个呼吁和响应的帧数据通过流来实行数据调换。新的二进制格式是流量控制、优先级、server
push等功能的底蕴。

HTTP/2 是什么?

HTTP/2 正是 HTTP 协议的新本子,于 2015年发表。最近主流浏览器基本都帮衬该协议,而众多网站也早就搬迁到了 HTTP/2
上。

HTTP/2 的前身是由 谷歌(Google) 与 贰零零捌 年颁发的实验性协议 SPDY,其主要对象是
“通过消除 HTTP/1.1 中盛名的一部分天性限制来收缩网页的加载延迟”

现有的 HTTP/1.1 的基本点质量难题总结:

注:摘自“HTTP/2 简介”

为增高品质,并且保持现有的 HTTP
语义和效应不变(那样前后端能够不做更改就能使用 HTTP/2
提供的天性优化),HTTP/2 进行了以下重点优化:

注:参考“HTTP 2 的新特征你 get 了呢? –
天涯论坛”

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

HTTP/2 简介 – Google
Developers

那篇文章图像和文字并茂,讲得也尤其健全,完整的英文版在这:

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

打赏帮忙本人写出更多好文章,谢谢!

任选一种支付格局

金沙国际 6
金沙国际 7

1 赞 1 收藏
评论

正文的大概思路是介绍 HTTP1.1 的弊病、HTTP2.0 的优势、HTTP2.0
的合计机制、iOS 客户端怎样对接
HTTP2.0,以及如何对其开始展览调节。首要仍然加深回想、方便前期查阅,文末的资料比较本文大概是更有价值的。

使用 NSURLSession 代替 NSURLConnection

ALPN 扩展

HTTP/2 合计本人并从未须要它必须依照HTTPS(TLS)布置,不过由于以下五个原因,实际应用中,HTTP/2 和 HTTPS
差不离都以松绑在共同:

即使前方几个原因还不足以说服你,最终这么些相对有说服力,除非您的 HTTP/2
服务只打算给协调客户端用。

金沙国际,上边介绍在 HTTPS 中,浏览器和服务端之间怎么协商是不是利用 HTTP/2。

依据 HTTPS 的协商协商卓殊不难,多了 TLS 之后,双方必须等到成功建立 TLS
连接之后才能发送应用数据。而要建立 TLS 连接,本来就要开始展览 CipherSuite
等参数的说道。引入 HTTP/2 之后,供给做的只是在原本的磋商业机械制中把对 HTTP
协议的情商加进去。

谷歌 在 SPDY 商事中开发了2个名为 NPN(Next Protocol
Negotiation,下一代协议协商)的 TLS 扩大。随着 SPDY 被 HTTP/2 取代,NPN
也被官方修订为 ALPN(Application Layer Protocol
Negotiation,应用层协议协商)。二者的指标和兑现原理基本一致,那里只介绍后者。如图:

金沙国际 8

能够见到,客户端在建立 TLS 连接的 Client Hello 握手中,通过 ALPN
扩展列出了祥和协理的种种应用层协议。个中,HTTP/2 协议名称是 h2

金沙国际 9

设若服务端援助 HTTP/2,在 Server Hello 中内定 ALPN 的结果为 h2
就足以了;倘使服务端不帮衬 HTTP/2,从客户端的 ALPN
列表中选三个和好援助的即可。

并不是负有 HTTP/2 客户端都协理 ALPN,理论上确立 TLS
连接后,照旧能够再经过 HTTP Upgrade
实行协商升级,只是这样会额外引入贰遍来回。

HTTP 1.1

与此同时简单狂暴,直接在 iOS 代码中打字与印刷,_CFUMuranoLResponse 中包涵了
httpversion,获取形式正是基于 CFNetwork 相关的 API
来做,那里直接丢出主要代码,完整代码能够参照getHTTPVersion

议论 HTTP/2 的协商协商业机械制

2016/04/16 · 基本功技术 ·
HTTP/2

本文小编: 伯乐在线 –
JerryQu
。未经小编许可,禁止转发!
欢迎参预伯乐在线 专栏撰稿人。

文章目录

在过去的多少个月里,笔者写了许多有关 HTTP/2
的文章,也做过一些场相关分享。作者在向大家介绍 HTTP/2
的进度中,有局地难点平常会被问到。例如要配置 HTTP/2 一定要先晋级到 HTTPS
么?升级到 HTTP/2 之后,不援助 HTTP/2
的浏览器仍是能够正常访问么?本文重点介绍 HTTP/2
的合计机制,精晓了服务端和客户端怎么着协商出最后采用的 HTTP
协议版本,这多个难点就消除了。

HTTP2.0

在 HTTP2.0中,上边的题材差不离都不存在了。HTTP2.0 的筹划来源于 谷歌 的
SPDY 协议,如若对 SPDY 协议不打听的话,也足以先对 SPDY
进行摸底,但是那不影响三番五次读书本文

流(Stream):1个Stream是富含一条或多条音信、ID和事先级的双向通道

新闻(Message):信息由帧组成

帧(Frame):帧有分化的项目,并且是老婆当军的。他们通过stream
id被再一次组建进消息中

金沙国际 10

金沙国际 11

金沙国际 12

金沙国际 13

除了上面讲到的特点,HTTP2.0
还有流量控制、流优先级和依赖等职能。更加多细节可以参照:Hypertext
Transfer Protocol Version 2
(HTTP/2)

金沙国际 14

HTTP 2.0的商谈机制

地点说了一堆排名,什么NPN、ALPN呀,还有h② 、h2c之类的,有点懵逼。NPN(Next
Protocol Negotiation)是3个 TLS 扩张,由 谷歌(Google) 在开发 SPDY
商事时提议。随着 SPDY 被 HTTP/2 取代,NPN 也被修订为 ALPN(Application
Layer Protocol
Negotiation,应用层协议协商)。二者指标一致,但贯彻细节不雷同,互相不匹配。以下是它们首要不一样:

同时,近年来游人如织地点初阶甘休对NPN的援助,仅扶助ALPN,所以公司利用以来,最佳是从来利用 ALPN。

上边就从来来看望 ALPN 的商谈进程是何等的,ALPN 作为 TLS
的二个扩展,其经过可以因此 WireShark 查看 TLS握手进程来查阅

金沙国际 15

下边通过 WireShark 来进展调节和测试,接入真机,然后终端输入
rvictl -s 设备 UDID来创设四个炫耀到 诺基亚 的虚拟网卡,UUID 可以在
iTunes 中赢获得,运营命令后会看到成功创办 rvi0 虚拟网卡的,双击 rvi0
起先调剂。

金沙国际 16

进入之后,在手提式有线电话机上访问页面会有接踵而来的请求展现在 WireShark
的界面上,数据太多而不方便人民群众大家针对调节和测试,你能够过滤下域名,只关怀您想测试的
ip 地址,比如: ip.addr==111.89.211.191 ,当然你的 ip 要协助HTTP2.0才会有预期的成效啊

金沙国际 17

上边,就从头通过翻看 TLS 握手的过程分析HTTP2.0 的合计进度,刚才也说道
ALPN 协商结果是在 Client hello 和 Server hello
中显示的,那就先来看一下Client hello

金沙国际 18

能够观察客户端在 Client hello 中列出了友好支持的各个应用层协议,比如
spdy叁 、h2。那么随着看 Server hello 是什么回复的

金沙国际 19

劳动端会依据 client hello
中的协议列表,发过去要好援助的网络协议,假诺服务端接济h2,则平素回到h2,协商成功,若是不支持h2,则赶回一个其余帮忙的协议,比如HTTP1.① 、spdy3

以此是h2的磋商进程,对于刚(Yu-Gang)刚事关的 h2c 的情商进程,与此区别,h2c
利用的是HTTP Upgrade 机制,客户端会发送3个 http
1.1的乞求到服务端,这一个请求中含有了 http2的升级换代字段,例如:

  GET /default.htm HTTP/1.1
  Host: server.example.com
  Connection: Upgrade, HTTP2-Settings
  Upgrade: h2c
  HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>

服务端收到这么些请求后,假使支持 Upgrade 中 列举的情商,这里是
h2c,就会重返支持的响应:

  HTTP/1.1 101 Switching Protocols
  Connection: Upgrade
  Upgrade: h2c

  [ HTTP/2 connection ...

当然,不帮衬的话,服务器会回来三个不带有 Upgrade 的报头字段的响应。

帧(Frame):帧有区别的品类,并且是滥竽充数的。他们通过stream
id被重复组建进音讯中

本人的客户端辅助了呢?

整个准备稳妥之后,也是时候对结果进行求证了,除了刚才波及的 WireShark
之外,你还足以选取上边包车型大巴多少个工具来对 HTTP 2.0 实行测试

金沙国际 20

点击小雷暴,会跻身三个页面,列举了当下浏览器访问的全体http2.0的请求,所以,你能够把您想要测试的客户端接口在浏览器访问,然后在那几个页面验证下是不是帮助http2.0

金沙国际 21

上面就一贯来探望 ALPN 的商谈进度是何等的,ALPN 作为 TLS
的3个恢弘,其经过可以透过 WireShark 查看 TLS握手进程来查阅

iOS 客户端接入HTTP 2.0

iOS 怎么着对接 HTTP 2.0啊?其实非常粗大略:

服务端收到这么些请求后,要是帮衬 Upgrade 中 列举的合计,这里是
h2c,就会回到帮助的响应:

charles:那些大家应该都用过,4.0 以上的新本子对
HTTP2.0做了支撑,为了便于,你也足以在 charles
上进展调剂,不过自身发觉接近存在 http2.0的部分 bug,目前还没搞明白什么来头

rvictl -s 设备 UDID来成立贰个炫耀到 OPPO 的虚拟网卡,UUID 能够在
iTunes 中获取到,运营命令后会看到成功开创 rvi0 虚拟网卡的,双击 rvi0
开始调节和测试。

进入之后,在三弟大上访问页面会有接连不断的央求显示在 WireShark
的界面上,数据太多而不便宜大家本着调试,你能够过滤下域名,只关注你想测试的
ip 地址,比如: ip.addr==111.89.211.191 ,当然你的 ip 要帮忙HTTP2.0才会有预料的效率哦

金沙国际 22

服务端不能够主动推送财富到客户端

金沙国际 23

iOS 客户端接入HTTP 2.0

金沙国际 24

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图