我正在学习HTTP/2协议。它是一种带有小消息帧的二进制协议。它允许在单个TCP连接上进行流多路复用。从概念上看,它与WebSockets非常相似。
有没有计划淘汰websockets,代之以某种无头HTTP/2请求和服务器发起的推送消息?或者WebSockets将补充HTTP/2?
我正在学习HTTP/2协议。它是一种带有小消息帧的二进制协议。它允许在单个TCP连接上进行流多路复用。从概念上看,它与WebSockets非常相似。
有没有计划淘汰websockets,代之以某种无头HTTP/2请求和服务器发起的推送消息?或者WebSockets将补充HTTP/2?
当前回答
到2020年4月为止,HTTP/2还没有淘汰WebSockets。WebSockets相对于HTTP2的最大优势是
HTTP/2 works only on Browser Level not Application Level
意味着HTTP/2不提供任何像WebSockets那样的JS API来允许通信和直接从应用程序(例如网站)向服务器传输某种JSON或其他数据。所以,就我所相信的,只有当HTTP/2开始提供类似WebSockets的API来与服务器通信时,WebSockets才会被淘汰。在此之前,它只是更新和更快的HTTP 1.1版本。
其他回答
根据我的理解,HTTP/2不是websocket的替代品,而是旨在标准化SPDY协议。
在HTTP/2中,服务器推送(server-push)在后台使用,以改善客户端从浏览器加载资源的情况。作为一名开发人员,你在开发过程中并不会真正关心它。然而,使用Websocket,开发者可以使用API,它可以使用唯一的全双工连接来消费和推送消息。
这些不是一回事,它们应该是相辅相成的。
到2020年4月为止,HTTP/2还没有淘汰WebSockets。WebSockets相对于HTTP2的最大优势是
HTTP/2 works only on Browser Level not Application Level
意味着HTTP/2不提供任何像WebSockets那样的JS API来允许通信和直接从应用程序(例如网站)向服务器传输某种JSON或其他数据。所以,就我所相信的,只有当HTTP/2开始提供类似WebSockets的API来与服务器通信时,WebSockets才会被淘汰。在此之前,它只是更新和更快的HTTP 1.1版本。
我说不(Websockets并没有过时)。
第一个也是最常被忽视的问题是HTTP/2推送是不可执行的,可能会被代理、路由器、其他中介甚至浏览器忽略。
即(来自HTTP2草案):
中介可以接收来自服务器的推送,并选择不将它们转发到客户端。换句话说,如何利用推送的信息取决于中介。同样,中介可能选择向客户端进行额外的推送,而不需要服务器采取任何操作。
因此,HTTP/2 Push不能取代WebSockets。
此外,HTTP/2连接也会在一段时间后关闭。
的确,该标准规定:
HTTP/2连接是持久的。为了获得最佳性能,预期客户端不会关闭连接,直到确定不需要与服务器进行进一步的通信(例如,当用户导航离开特定的网页时)或直到服务器关闭连接。
但是…
鼓励服务器尽可能长时间地保持打开的连接,但允许在必要时终止空闲连接。当任何一个端点选择关闭传输层TCP连接时,终止端点应该首先发送一个超时帧(章节6.8),以便两个端点可以可靠地确定之前发送的帧是否已经处理,并优雅地完成或终止任何必要的剩余任务。
即使相同的连接允许在打开时推送内容,即使HTTP/2解决了HTTP/1.1的“keep-alive”引入的一些性能问题……HTTP/2连接不会无限期地保持打开状态。
网页也不能在关闭后重新启动HTTP/2连接(除非我们又回到了长时间拖拉的状态)。
EDIT(2017,两年后)
HTTP/2的实现表明,多个浏览器选项卡/窗口共享一个HTTP/2连接,这意味着push永远不会知道它属于哪个选项卡/窗口,从而消除了使用push替代Websockets的情况。
编辑(2020)
我不知道为什么人们开始对答案投反对票。如果说有什么不同的话,那就是从最初的答案发布到现在的几年证明了HTTP/2不能取代WebSockets,而且它的设计初衷也不是这样的。
当然,HTTP/2可能被用于隧道WebSocket连接,但这些隧道连接仍然需要WebSocket协议,它们将影响HTTP/2容器的行为方式。
消息交换和简单的流(不是音频,视频流)可以通过Http/2多路复用和WebSockets来完成。所以有一些重叠,但是WebSockets有很好的协议,很多框架/ api和更少的头开销。 这里有一篇关于这个主题的好文章。
不,WebSockets并没有过时。然而,HTTP/2打破了为HTTP/1.1定义的websocket(主要是通过禁止使用Upgrade报头进行协议更新)。这就是为什么这个rfc:
https://datatracker.ietf.org/doc/html/rfc8441
定义了HTTP/2的websocket引导过程。