菜单

HTTP协议缓存机制

2019年4月18日 - jQuery

座谈 HTTP/贰 的情商协商业机械制

2016/04/16 · 基础技巧 ·
HTTP/2

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

小说目录

在过去的多少个月里,作者写了许多关于 HTTP/二的篇章,也做过一些场相关分享。作者在向大家介绍 HTTP/二的进程中,有部分主题素材平常会被问到。例如要布局 HTTP/二 一定要先进级到 HTTPS
么?进级到 HTTP/二 之后,不协助 HTTP/2的浏览器仍是能够健康访问么?本文重点介绍 HTTP/贰的磋商业机械制,精通了服务端和客户端怎么着协商出终极选择的 HTTP
协议版本,这多少个问题就解决了。

缓存相关的请求头

HTTP Upgrade

为了更便利地配备新闻工小编组织议,HTTP/壹.一 引进了 Upgrade
机制,它使得客户端和服务端之间能够凭借已部分 HTTP
语法晋级到别的协议。这么些机制在 RFC7230 的「6.7
Upgrade
」那壹节中有详细描述。

要倡导 HTTP/壹.一 协议进级,客户端必须在伸手尾部中钦赐那五个字段:

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/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/贰,它会忽略 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/二 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/壹.一 晋级到 HTTP/二 的 Wireshark
抓包(两张图能够对照来看):

图片 1

图片 2

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

HTTP Upgrade
机制自小编没什么难题,但很轻巧受网络中间环节影响。例如不能够正确处理
Upgrade 尾部的代理节点,相当的大概产生最后进级战败。此前大家总计过
WebSocket 的连接意况,发现大批量明显协理 WebSocket
的浏览器却胸中无数进级,只可以选取降级方案。

区分与关系

ALPN 扩展

HTTP/二 合计自个儿并从未要求它必须遵照HTTPS(TLS)铺排,然而由于以下五个原因,实际应用中,HTTP/二 和 HTTPS
大致都是松绑在联合签名:

若是面前多少个原因还不足以说服你,最终那么些相对有说服力,除非你的 HTTP/2服务只打算给自个儿客户端用。

上面介绍在 HTTPS 中,浏览器和服务端之间怎么协商是不是选取 HTTP/2。

依据 HTTPS 的协商协商卓殊简单,多了 TLS 之后,双方必须等到成功建立 TLS
连接之后技术发送应用数据。而要建立 TLS 连接,本来将要拓展 CipherSuite
等参数的合计。引进 HTTP/二 之后,须要做的只是在原来的说道机制中把对 HTTP
协议的协商加进去。

谷歌 在 SPDY 商业事务中开采了二个名字为 NPN(Next Protocol
Negotiation,下一代协议协商)的 TLS 扩张。随着 SPDY 被 HTTP/2 替代,NPN
也被合法修订为 ALPN(Application Layer Protocol
Negotiation,应用层协议协商)。贰者的对象和促成原理基本1致,那里只介绍后者。如图:

图片 3

能够看出,客户端在确立 TLS 连接的 Client Hello 握手中,通过 ALPN
增加列出了和睦帮助的各样应用层协议。在那之中,HTTP/二 协议名称是 h2

图片 4

设若服务端扶助 HTTP/二,在 Server Hello 中内定 ALPN 的结果为 h2
就能够了;如若服务端不匡助 HTTP/二,从客户端的 ALPN
列表中选四个温馨扶助的就能够。

并不是装有 HTTP/二 客户端都援救 ALPN,理论上树立 TLS
连接后,如故能够再通过 HTTP Upgrade
实行商议晋级,只是这样会额外引进贰回来回。

小结

旁观此间,相信您早晚能够很好地回答本文初步提出的主题素材。

HTTP/贰 须求依据 HTTPS 计划是近日主流浏览器的渴求。假使您的 HTTP/2服务要帮忙浏览器访问,那就务须依照 HTTPS
铺排;若是只给本人客户端用,能够不配备
HTTPS(以此页面历数了过多协助
h2c 的 HTTP/二 服务端、客户端完毕)。

支撑 HTTP/2 的 Web Server 基本都帮助 HTTP/一.1。那样,就算浏览器不扶助HTTP/贰,双方也能够钻探出可用的 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
协商会扩张二回来回,能够需求双方必须扶助 HTTP/二,直接发送 HTTP/2数据,不走协商。

打赏支持笔者写出越多好文章,多谢!


打赏作者

打赏接济笔者写出越多好小说,多谢!

任选1种支付办法

图片 5
图片 6

1 赞 1 收藏
评论

关于作者:JerryQu

图片 7

专注 Web 开采,关切 Web
品质优化与安全。https://imququ.com
个人主页
·
笔者的稿子
·
2
·
  

图片 8

相关文章

发表评论

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

网站地图xml地图