什么是 WebSockets,什么时候应该使用它们?

125 阅读7分钟

什么是 WebSocket?

在当今高度互联且不断在线的世界中,我们希望即时获得信息。想一想我们用来发送消息或在一天内接收实时、最新通知的所有应用程序。WebSockets是用于构建提供即时、实时更新和通信的 Web 应用程序的众多不同工具之一。

WebSocket 有什么用?

WebSocket 协议在客户端和服务器之间建立全双工、双向通信。这种双向流是 WebSocket 连接所独有的,这意味着它们可以非常快速有效地传输数据。虽然 WebSockets 有很多很好的用途,但也有一些环境使用不同的方法会更好,比如长轮询

在本指南中,我们将解释什么是 WebSocket,并详细说明将它们用于实时应用程序的一些好处。我们将回顾实现 WebSockets 的最佳用例,并讨论您可能想要使用的其他选项。到本文结束时,您将更清楚地了解 WebSockets 的用途以及 WebSockets 是否能满足您应用程序的特定需求。

WebSocket 的缺点

虽然 WebSockets 听起来像是处理实时通信的绝佳方式,但在使用 WebSockets 进行实时通信时,请务必注意一些重大挑战。

  • 如果通过 WebSockets 的连接丢失,则不包含用于负载平衡或重新连接的机制。
  • 许多代理服务器仍然不提供对 WebSockets 的支持。
  • WebSockets 不支持缓存,如 HTTP。
  • 在可能不支持 WebSockets 的环境中,仍然需要有回退选项,如 HTTP 流或长轮询。
  • 开源资源,如 Socket.io,不适合大规模操作或快速增长。
  • Presence 等功能在 WebSocket 连接上效果不佳,因为很难检测到断开连接。

Websockets vs HTTP vs. web 服务器 vs. 轮询

HTTP 连接与 websockets

要理解 WebSocket API,理解它的基础——HTTP(超文本传输协议)及其请求/响应模型也很重要。HTTP 是一个应用层协议,它是所有基于 Web 的通信和数据传输的基础。

使用 HTTP 时,客户端(例如 Web 浏览器)向服务器发送请求,然后服务器发回消息,称为响应。我们今天所知道的网络是建立在这个基本的客户端-服务器循环之上的,尽管 HTTP 已经进行了许多添加和更新以使其更具交互性。目前有几个可行且受支持的 HTTP 版本——HTTP/1.1 和 HTTP/2——以及一个称为 HTTPS 的安全版本。

基本 HTTP 请求适用于许多用例,例如当某人需要在网页上进行搜索并接收有关该主题的相关的、非时间敏感的信息时。但是,它并不总是最适合需要实时通信的 Web 应用程序,或需要以最小延迟快速更新的数据。

每次客户端发出新的 HTTP 服务器请求时,默认行为是打开一个新的 HTTP 连接。这是低效的,因为它在重复出现的非有效负载数据上使用带宽并增加了数据传输之间的延迟。

此外,HTTP 请求只能在一个方向上流动——从客户端。传统上没有服务器启动与客户端通信的机制。除非客户端先请求,否则服务器无法向客户端发送数据。对于需要从服务器端实时发出消息的用例,这可能会产生问题。

短轮询与 websockets

接收定期数据更新的第一个解决方案是 HTTP 轮询。轮询是一种客户端重复向服务器发送请求直到它响应更新的技术。例如,所有现代 Web 浏览器都支持 XMLHttpRequest,这是一种轮询服务器的原始方法。

这些早期的解决方案对于高效的实时通信仍然不是理想的——短轮询是密集的,因为对于每个请求,非有效负载数据都被重新发送并且必须被解析,包括标头 html、web url 和其他重复信息那会浪费资源。

长轮询 vs websockets

改善延迟的下一个合乎逻辑的步骤是 HTTP 长轮询 。长轮询时,客户端轮询服务器,并且该连接保持打开状态,直到服务器有新数据为止。服务器发送带有相关信息的响应,然后客户端立即打开另一个请求,再次保持直到下一次更新。在自动发送另一个请求之前,长轮询可以使连接保持打开状态最多 280 秒。此方法有效地模拟 HTTP 服务器推送。

长轮询在许多环境中提供快速通信并被广泛使用,通常与 WebSocket 连接或服务器端事件 (SSE) 等真正基于推送的方法相反。长轮询在服务器端似乎很密集,因为它需要持续的资源来保持连接打开,但它使用的资源比重复发送轮询请求要少得多。

什么是 WebSockets 图片 1

WebSocket 有什么用?

WebSockets 是由开发人员发明的,以有效地促进实时结果。WebSockets 通过在客户端和服务器之间发起连续的全双工通信来工作。这减少了不必要的网络流量,因为数据可以立即通过单个打开的连接双向传输。这提供了网络上的速度和实时能力。Websockets 还使服务器能够跟踪客户端并根据需要将数据“推送”给它们,这仅使用 HTTP 是不可能的。

WebSocket 连接支持通过消息流式传输文本字符串和二进制数据。WebSocket 消息包括帧、负载和数据部分。以这种方式通过现有网络连接发送的非有效负载数据很少,这有助于减少延迟和开销,尤其是与 HTTP 请求和流模型相比时。

谷歌浏览器是第一个在 2009 年包含对 WebSockets 标准支持的浏览器。RFC 6455——WebSocket 协议——于 2011 年正式在线发布。WebSocket 协议和WebSocket API 由 W3C 和 IETF 标准化,跨浏览器的支持非常好常见的。

WebSockets 如何工作(及其连接)

在客户端和服务器可以交换数据之前,它们必须使用 TCP(传输控制协议)层来建立连接。WebSockets 使用自己的 websocket 协议有效地作为 TCP 上的传输层运行。

通过 HTTP 请求/响应对连接后,客户端可以使用称为升级标头的 HTTP/1.1 机制将其连接从 HTTP 切换到 WebSockets。WebSocket 连接是通过 TCP 上的 websocket 握手建立的。在新的 websocket 握手过程中,客户端和服务器还会交流将用于其后续交互的子协议。建立后,连接将运行在 WebSocket 协议上。

需要注意的是,在 WebSocket 协议层上运行时,WebSocket 需要统一资源标识符 (URI) 才能使用“ws:”或“wss:”方案,类似于 HTTP URL 始终使用“http:”的方式或“https:”方案。

考虑使用 WebSockets 进行实时通信的原因

  • Websockets 提供实时更新和开放的通信线路。
  • Websockets 与 HTML5 兼容,并提供与旧 html 文档的向后兼容性。因此,它们受到所有现代网络浏览器的支持——Google Chrome、Mozilla Firefox、Apple Safari 等等。
  • WebSockets 还可以跨平台兼容——Android、iOS、Web 和桌面应用程序。
  • 单个服务器可以同时打开多个 WebSocket 连接,甚至可以与同一个客户端建立多个连接,这为可扩展性打开了大门。
  • WebSockets 可以流过许多代理和防火墙。
  • 有许多开源资源和教程可用于将 WebSockets 整合到应用程序中,例如 Javascript 库 Socket.io。

什么是 WebSockets 图片 2

总结

总而言之,WebSockets 是一种非常有用的协议,可用于跨 Web、移动和桌面变体构建实时功能,但它们并不是一种放之四海而皆准的方法。在开发基于实时通信的应用程序时,WebSockets 只是一种适合更大武器库的工具。可以构建基本的 WebSocket 协议并结合其他方法,如 SSE 或长轮询,并构建一个更好、更具可扩展性的实时应用程序。问题在于,如果您还不是构建实时系统的专家,那么这些缺点可能难以管理。