HTTP / 2世界中的WebSockets替代方案是什么?

时间:2017-10-15 08:41:23

标签: websocket server-sent-events http2 server-push

新的HTTP / 2协议带来了一些有前途的功能。其中一些:

  • 多路复用 - 单个TCP连接可用于发出多个HTTP / 2请求并接收多个响应(到单个来源)
  • HTTP / 2服务器推送 - 向客户端发送服务器响应而不接收请求,即由服务器启动
  • 双向连接 - HTTP/2 spec - Streams and Multiplexing
  

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功能,我们会使用什么?

3 个答案:

答案 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协议协商:

HTTP / 2连接以三种方式之一开始:

  1. 在使用ALPN(应用层协议协商)的加密连接(TLS / SSL)中。大多数浏览器都需要HTTP / 2的TLS / SSL,并使用此方法建立HTTP / 2连接。

  2. 以明文形式,使用HTTP / 1.1 Upgrade标题(与Websockets相同)。大多数浏览器都需要TLS / SSL用于HTTP / 2,因此它的支持受到限制。

  3. 在明文中,在HTTP / 1.1连接的开头使用特殊字符串(可以允许HTTP / 2服务器以明文形式禁用HTTP / 1.1支持)。有限的客户支持。

  4. 谈判Websocket协议,现在时:

    目前,协商Websocket连接需要HTTP / 1.1支持并使用HTTP / 1.1 Upgrade标头。

    这通常由侦听HTTP / 1.1和HTTP / 2连接的同一应用程序服务器执行。支持并发(无论是基于协议还是基于线程)的Web应用程序通常是协议不可知的(只要保留HTTP语义)并且在两种协议上都能正常工作。

    这允许在连接建立期间使用HTTP数据(并且可能影响Websocket连接状态/身份验证过程)。

    一旦建立了Websocket连接,它就完全独立于HTTP语义/层。

    在HTTP / 2世界中协商Websocket协议:

    在未来可能需要一段时间的HTTP / 2(仅)世界中,可能有许多可能的Websocket协议协商方法:基于ALPN的方法和HTTP / 2"隧道&# 34; (或" stream")方法。

    ALPN方法以牺牲预升级(HTTP)阶段为代价来保持协议独立性,而"流"方法提供HTTP pre - "升级" (或Connect)阶段以牺牲高耦合和复杂性为代价。

    ALPN方法:

    未来可能的一种方法是将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连接。

    HTTP / 2"隧道" /" stream"方法

    另一种可能的未来方法,即反映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,但除非这些技术使新用例或效率成为可能,否则我认为没有意义。