新的HTTP / 2协议带来了一些有前途的功能。其中一些:
A" stream"是一个独立的双向帧序列 在HTTP / 2连接中在客户端和服务器之间交换。
这里解释了HTTP / 2背后的动机HTTP/2 FAQ:
HTTP / 1.1已经为网络提供了超过15年的服务,但是它 年龄开始显现。
和
工作组的目标是HTTP / 1.x的典型用法可以使用HTTP / 2并看到一些好处。
所以HTTP / 2很好,取而代之的是HTTP / 1.x.不幸的是,HTTP/2 does not support WebSockets。在这个问题Does HTTP/2 make websockets obsolete?中,明确指出HTTP / 2服务器推送不是替代方案,Server-Sent Events也不是。
现在提出一个问题:如果我们想通过HTTP / 2获得WebSockts功能,我们会使用什么?
答案 0 :(得分:3)
那么你的时机非常贴切!
新版本的互联网标准草案刚刚公布:
Bootstrapping WebSockets with HTTP/2
此处的其他信息:
https://github.com/mcmanus/draft-h2ws/blob/master/README.md
你可以在这里跟进讨论:
https://lists.w3.org/Archives/Public/ietf-http-wg/2017OctDec/0032.html
在批准之前,然后由浏览器和服务器实施,我会说Daniel Haxx’s post that you included in your question代表了当前状态的非常好的摘要。
答案 1 :(得分:3)
HTTP / 2连接以三种方式之一开始:
在使用ALPN(应用层协议协商)的加密连接(TLS / SSL)中。大多数浏览器都需要HTTP / 2的TLS / SSL,并使用此方法建立HTTP / 2连接。
以明文形式,使用HTTP / 1.1 Upgrade
标题(与Websockets相同)。大多数浏览器都需要TLS / SSL用于HTTP / 2,因此它的支持受到限制。
在明文中,在HTTP / 1.1连接的开头使用特殊字符串(可以允许HTTP / 2服务器以明文形式禁用HTTP / 1.1支持)。有限的客户支持。
目前,协商Websocket连接需要HTTP / 1.1支持并使用HTTP / 1.1 Upgrade
标头。
这通常由侦听HTTP / 1.1和HTTP / 2连接的同一应用程序服务器执行。支持并发(无论是基于协议还是基于线程)的Web应用程序通常是协议不可知的(只要保留HTTP语义)并且在两种协议上都能正常工作。
这允许在连接建立期间使用HTTP数据(并且可能影响Websocket连接状态/身份验证过程)。
一旦建立了Websocket连接,它就完全独立于HTTP语义/层。
在未来可能需要一段时间的HTTP / 2(仅)世界中,可能有许多可能的Websocket协议协商方法:基于ALPN的方法和HTTP / 2"隧道&# 34; (或" stream")方法。
ALPN方法以牺牲预升级(HTTP)阶段为代价来保持协议独立性,而"流"方法提供HTTP pre - "升级" (或Connect
)阶段以牺牲高耦合和复杂性为代价。
未来可能的一种方法是将Websocket协议添加到the ALPN negotiation表。
目前,ALPN用于选择(或默认)" http / 1.1"协议和Upgrade
请求由HTTP / 1.1服务器处理。这意味着Websocket在协议协商期间仍然向我们提供HTTP头数据(同时使用它自己的TCP / IP连接)
将来,ALPN可能会简单地添加" wss"作为一个可用的选择。
使用这种方法,可以使用ALPN扩展到TLS / SSL层轻松协商Websocket(目前使用HTTP / 1.1 Upgrade
标头建立的加密和明文形式)。 / p>
这将使Websocket协议独立于HTTP / 2协议,即使在不支持HTTP的情况下也可以使用它。
然而,这将带来的缺点是,作为协议协商的一部分,cookie和其他HTTP头可能不再可用。另一个区别(好的和坏的)是这种方法需要单独的TCP / IP连接。
另一种可能的未来方法,即反映in this proposed draft,将处理Websocket协议的HTTP / 1.1变体,转而支持HTTP / 2"流"方法
HTTP / 2"流"是HTTP / 2实现多路复用的方式,并允许同时处理多个请求。每个请求都会收到一个流号ID,并且使用相同的数字流ID识别与该请求有关的任何数据(标题,响应等)。
根据这种方法," Websocket"数据将包含在HTTP / 2包装器中,并且流ID将用于标识" Websocket"流。
虽然这可能会带来一些好处(HTTP标头和cookie可以作为Websocket协商的一部分提供),但它并非没有它的垮台。
更高的复杂性和更紧密的协议耦合只是两个例子,两者都是非常严重的垮台。
在撰写本文时,在使用明文(Upgrade
)和加密(ws
)连接时,Websocket连接都需要HTTP / 1.1 wss
语义。
未来尚未确定,可能需要很长时间才能逐步淘汰当前升级流程(使用HTTP / 1.1)
答案 2 :(得分:1)
你的一个链接实际上有一个答案:你可以使用SSE。
从语义上讲,您可以使用websockets或(SSE + POST)实现相同的功能。粗略地说,这两种技术针对不同用例的观点是围绕着#34;这种语法对此更好[34]。
目前正在努力将类似于websockets的东西移植到HTTP / 2,但除非这些技术使新用例或效率成为可能,否则我认为没有意义。