菜单

HTTP协议缓存机制

2019年4月21日 - Json

座谈 HTTP/二 的构和协商业机械制

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

正文小编: 伯乐在线
JerryQu
。未经作者许可,禁止转发!
欢迎参加伯乐在线 专辑作者

作品目录

在过去的多少个月里,笔者写了很多关于 HTTP/2的篇章,也做过好几场有关分享。我在向我们介绍 HTTP/二的长河中,有部分标题时常会被问到。举个例子要安插 HTTP/二 一定要先晋级到 HTTPS
么?升级到 HTTP/二 之后,不扶助 HTTP/2的浏览器还是能健康访问么?本文入眼介绍 HTTP/二的磋商业机械制,通晓了服务端和客户端怎样协商出终极选用的 HTTP
协议版本,那多少个难点就消除了。

缓存相关的伸手头

HTTP Upgrade

为了更有利于地配备新闻工作者组织议,HTTP/壹.壹 引进了 Upgrade
机制,它使得客户端和服务端之间能够借助已某些 HTTP
语法进级到任何协议。这些机制在 KugaFC7230 的「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 请求,以 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: http://example.com 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/壹.一 没提到了。能够看来,WebSocket
连接的树立正是卓绝的 HTTP Upgrade 机制。

显然,这么些机制也足以用做 HTTP/一.一 到 HTTP/贰 的情商进级。举个例子:

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/二,它会忽略 Upgrade 字段,直接回到
HTTP/一.一 响应,举个例子:

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/贰,这就能够答应 101
状态码及对应尾部,并且在响应正文中得以直接使用 HTTP/二 二进制帧:

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/二 的 Wireshark
抓包(两张图能够对照来看):

图片 1

图片 2

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

HTTP Upgrade
机制自小编没什么难题,但很轻易受互连网中间环节影响。举个例子不可能正确管理
Upgrade 底部的代办节点,很恐怕变成最后升任失利。在此之前大家总计过
WebSocket 的对接情况,发掘多量由此可见扶助 WebSocket
的浏览器却无计可施晋升,只好利用降级方案。

分别与调换

ALPN 扩展

HTTP/二 协商自个儿并不曾须求它必须依靠HTTPS(TLS)安顿,不过由于以下三个原因,实际应用中,HTTP/二 和 HTTPS
差不多都是松绑在一同:

万一前方三个原因还不足以说服你,最终那么些相对有说服力,除非您的 HTTP/二服务只筹算给和睦客户端用。

上边介绍在 HTTPS 中,浏览器和服务端之间怎么着协商是不是使用 HTTP/二。

依据 HTTPS 的说道教协会谈商讨卓殊简单,多了 TLS 之后,双方必须等到成功建立 TLS
连接之后才干发送应用数据。而要建立 TLS 连接,本来将在开始展览 CipherSuite
等参数的磋商。引进 HTTP/2 之后,需求做的只是在原来的情商业机械制中把对 HTTP
协议的商谈加进去。

谷歌 在 SPDY 研讨中成本了一个名叫 NPN(Next Protocol
Negotiation,下一代协议协商)的 TLS 扩大。随着 SPDY 被 HTTP/二 替代,NPN
也被合法修订为 ALPN(Application Layer Protocol
Negotiation,应用层协议协商)。二者的对象和贯彻原理基本一致,这里只介绍后者。如图:

图片 3

能够看看,客户端在建立 TLS 连接的 Client Hello 握手中,通过 ALPN
扩张列出了投机辅助的种种应用层协议。当中,HTTP/二 协议名称是 h2

图片 4

1旦服务端援助 HTTP/2,在 Server Hello 中钦命 ALPN 的结果为 h2
就足以了;如若服务端不协理 HTTP/贰,从客户端的 ALPN
列表中选1个和好支持的就可以。

并不是具有 HTTP/2 客户端都支持 ALPN,理论上确立 TLS
连接后,还能再通过 HTTP Upgrade
实行协商升级,只是那样会额外引进三遍来回。

小结

看样子此间,相信您料定能够很好地回应本文早先建议的主题素材。

HTTP/贰 供给依靠 HTTPS 计划是日前主流浏览器的渴求。倘诺您的 HTTP/二服务要支持浏览器访问,那就必须依据 HTTPS
陈设;固然只给本人客户端用,能够不配备
HTTPS(本条页面历数了数不清支撑
h2c 的 HTTP/2 服务端、客户端完毕)。

帮忙 HTTP/二 的 Web Server 基本都协助 HTTP/壹.一。这样,纵然浏览器不支持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/贰,直接发送 HTTP/二数据,不走协商。

打赏帮助笔者写出更加多好小说,谢谢!


打赏笔者

打赏帮衬作者写出更加多好小说,多谢!

任选壹种支付办法

图片 5
图片 6

1 赞 1 收藏
评论

有关小编:JerryQu

图片 7

专注 Web 开辟,关怀 Web
品质优化与安全。https://imququ.com
个人主页
·
笔者的小说
·
2
·
  

图片 8

相关文章

发表评论

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

网站地图xml地图