菜单

HTTP协议缓存机制

2019年4月15日 - JavaScript

商讨 HTTP/2 的说道教协会谈商讨业机械制

2016/04/16 · 基础才能 ·
HTTP/2

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

小说目录

在过去的多少个月里,小编写了成都百货上千有关 HTTP/贰的稿子,也做过一些场相关分享。作者在向大家介绍 HTTP/二的长河中,有一些难点日常会被问到。例如要安排 HTTP/二 一定要先进级到 HTTPS
么?晋级到 HTTP/2 之后,不协理 HTTP/2的浏览器还是能符合规律访问么?本文重点介绍 HTTP/贰的协议机制,精通了服务端和客户端怎么样协商出最后使用的 HTTP
协议版本,那多个难点就缓解了。

缓存相关的伸手头

HTTP Upgrade

为了更便利地配备新说道,HTTP/壹.壹 引进了 Upgrade
机制,它使得客户端和服务端之间能够重视已有的 HTTP
语法晋级到此外协议。那一个机制在 QX56FC7230 的「6.7
Upgrade
」那1节中有详细描述。

要提倡 HTTP/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.一响应);假设服务端统一晋级,那么供给如此响应:

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

图片 1

图片 2

听他们说 HTTP/二 协议中的描述,额外补充几点:

HTTP Upgrade
机制自笔者没什么难题,但很轻易受互连网中间环节影响。例如不可能正确处理
Upgrade 底部的代办节点,很可能引致最终升任退步。以前大家总计过
WebSocket 的联网意况,发现大批量醒目帮忙 WebSocket
的浏览器却无计可施提拔,只好选取降级方案。

有别于与联系

ALPN 扩展

HTTP/二 协议本人并不曾要求它必须根据HTTPS(TLS)安顿,不过出于以下多个原因,实际使用中,HTTP/二 和 HTTPS
大约都是松绑在同步:

壹旦前边八个原因还不足以说服你,最终这些相对有说服力,除非你的 HTTP/二服务只打算给自个儿客户端用。

下边介绍在 HTTPS 中,浏览器和服务端之间什么协商是或不是利用 HTTP/2。

依照 HTTPS 的协商协商卓殊轻便,多了 TLS 之后,双方必须等到成功建立 TLS
连接之后才干发送应用数据。而要建立 TLS 连接,本来将在实行 CipherSuite
等参数的商谈。引进 HTTP/二 之后,须求做的只是在原本的商议机制中把对 HTTP
协议的协议加进去。

谷歌 在 SPDY 合计中支出了叁个名叫 NPN(Next Protocol
Negotiation,下一代协议协商)的 TLS 扩张。随着 SPDY 被 HTTP/二 替代,NPN
也被官方修订为 ALPN(Application Layer Protocol
Negotiation,应用层协议协商)。二者的靶子和达成原理基本1致,那里只介绍后者。如图:

图片 3

能够看看,客户端在创建 TLS 连接的 Client Hello 握手中,通过 ALPN
扩大列出了自身支持的种种应用层协议。当中,HTTP/二 协议名称是 h2

图片 4

壹经服务端帮助 HTTP/二,在 Server Hello 中内定 ALPN 的结果为 h2
就可以了;假诺服务端不补助 HTTP/2,从客户端的 ALPN
列表中选三个谈得来协理的就可以。

并不是持有 HTTP/二 客户端都扶助 ALPN,理论上建立 TLS
连接后,依旧能够再经过 HTTP Upgrade
举办商榷进级,只是那样会十二分引入3次来回。

小结

看到此间,相信您一定能够很好地回复本文发轫建议的难点。

HTTP/二 须要基于 HTTPS 布署是日前主流浏览器的渴求。就算你的 HTTP/贰服务要协理浏览器访问,那就无法不依照 HTTPS
安顿;假若只给本人客户端用,能够不安排HTTPS(这么些页面列举了无数补助
h2c 的 HTTP/2 服务端、客户端完结)。

支撑 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/二 ClearText,由于 HTTP Upgrade
协商会增添1遍往返,能够供给双方必须协助 HTTP/二,直接发送 HTTP/二数据,不走协商。

打赏支持我写出愈来愈多好小说,谢谢!


打赏作者

打赏帮忙本身写出更加多好小说,谢谢!

任选1种支付办法

图片 5
图片 6

1 赞 1 收藏
评论

至于小编:JerryQu

图片 7

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

图片 8

相关文章

发表评论

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

网站地图xml地图