HTTP Keep-Alive和Websockets之间的行为差异是什么?

49

最近我一直在深入研究WebSockets。创建了自己的服务器,还有一个公共演示。虽然我在HTTP方面没有如此详细的经验或知识(尽管由于WebSocket请求被升级为HTTP请求,所以我有一些)。

在我的服务器端,它会记录每个请求的详细信息,其中包括一堆HTTP保持活动的请求。我的服务器不处理它们,因为它们不是WebSocket请求。但这引起了我的好奇心。

WebSockets的整个大事情就是连接保持活动状态。然后你可以在两个方向(甚至同时)传递消息。我读到过Keep-Alive HTTP连接是相对较新的发展(我不知道在人类时间中有多少年,只知道它只包含在最新的标准1.1中,现在是否已经老了?)

我想我可以假设两者之间有行为上的区别,否则就没有websocket标准的理由了?它们之间有什么区别呢?

3个回答

75

HTTP的保活头自HTTP 1.0以来一直存在,用于指示HTTP客户端希望与HTTP服务器保持持久连接。主要目的是消除为每个HTTP请求打开TCP连接的需要。但是,在保持持久连接的同时,客户端和服务器之间的通信协议仍然遵循基本的HTTP请求/响应模式。换句话说,服务器无法向客户端推送数据。

WebSocket是完全不同的机制,用于建立一个持久的全双工连接。通过这种全双工连接,服务器可以向客户端推送数据,并且客户端应该随时准备处理来自服务器端的数据。

引用维基百科上的相关条目供参考: 1) http://en.wikipedia.org/wiki/HTTP_persistent_connection 2) http://en.wikipedia.org/wiki/WebSocket


6
好的。那正是我的菜。即使使用持久连接,HTTP仍然是请求/响应模式。Websockets非常棒! - Roger F. Gay
为什么他们没有添加一个能力/HTTP本身的头部,使它表现得像本地TCP连接一样,其中任何一方(发送者/接收者)都可以随时发送任意次数?他们是否实际上引入了一个新的协议WebSocket!只是为了通过升级选项实现“类固醇的HTTP”,一旦使用正常的HTTP机制设置了初始握手(TCP)? - Karan Kaw
2
委员会最初是一个HTTP委员会,但WebSocket的人想要的与众不同,所以他们决定分开。 WebSocket协议握手确实始于HTTP请求,并带有将“Upgrade”参数设置为“Websocket”。 - Roger F. Gay
你说的“主要对象是消除...”,是不是应该是“主要目标是消除...”? - Douglas Miranda
但既然它是一种持久连接,这是否意味着即使数据不符合HTTP协议的格式,仍然可以发送任何内容? - Dragas

9
你应该了解COMET,这是一种设计模式,展示了HTTP Keep-Alive的局限性。Keep-Alive现在已经超过12年了,因此它不是HTTP的新特性。问题在于它不够充分;客户端和服务器不能真正地异步通信。客户端必须始终使用“挂起”请求才能从服务器获取消息;服务器可能不能随时向客户端发送消息。

8

HTTP vs Websockets

REST (HTTP)

  • 资源的表现形式不经常变化或需要多个客户端检索资源时,资源受益于缓存。
  • HTTP方法具有良好的幂等性和安全属性。如果请求可以多次发出而不导致唯一结果,则请求是“幂等”的。
  • HTTP设计允许响应描述请求错误、资源错误或提供细微的状态信息,以区分成功场景。
  • 具有请求和响应功能。
  • HTTP v1.1 可能允许多个请求重用单个连接,但通常会有小的超时期限来控制资源消耗。

以下情况可能意味着您使用HTTP有误:

  • 您的设计依赖于客户端经常轮询服务,而用户没有采取任何行动。
  • 您的设计需要频繁调用服务以发送小消息。
  • 客户端需要快速响应资源更改,但无法预测更改时间。
  • 由此产生的设计成本过高。请问:WebSocket解决方案是否在设计、实施、测试和操作方面都更加简单?

WebSockets

  • WebSocket设计不允许显式或透明代理缓存消息,这可能会降低客户端性能。
  • WebSocket协议仅支持影响连接建立的错误场景。一旦建立连接并交换消息,任何其他错误场景都必须在消息层面设计中解决,但WebSockets允许比REST更高的效率,因为它们不需要每个发送和接收的消息的HTTP请求/响应开销。
  • 当客户端需要快速响应更改(特别是无法预测的更改)时,WebSocket可能最适合。
  • 这使得该协议非常适合用于“fire and forget”消息场景,并且对于事务要求并不太适用。
  • WebSockets专门为长时间连接场景而设计,避免了建立连接和发送HTTP请求/响应头的开销,从而大大提高了性能。

以下情况可能意味着您使用WebSockets有误:

  • 连接仅用于非常少量事件或非常短的时间,而客户端不需要快速响应事件。
  • 您的功能要求同时向同一服务打开多个WebSocket。
  • 您的功能打开WebSocket,发送消息,然后关闭它,然后稍后重复该过程。
  • 您正在消息层重新实现请求/响应模式。
  • 由此产生的设计成本过高。请问:HTTP解决方案是否在设计、实施、测试和操作方面都更加简单?

参考:https://blogs.windows.com/buildingapps/2016/03/14/when-to-use-a-http-call-instead-of-a-websocket-or-http-2-0/

当需要进行单向通信或定期轮询时,HTTP调用是一个不错的选择。但是,在需要双向通信或实时数据传输时,WebSocket或HTTP 2.0是更好的选择。这是因为HTTP调用在每次请求和响应之间都要建立新的连接,而WebSocket和HTTP 2.0可以保持长时间连接并实时传输数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接