在当今高度互联且不断在线的世界中,我们希望即时获得信息。想一想我们用来发送消息或在一天内接收实时、最新通知的所有应用程序。WebSockets是用于构建提供即时、实时更新和通信的 Web 应用程序的众多不同工具之一。
WebSocket 协议在客户端和服务器之间建立全双工、双向通信。这种双向流是 WebSocket 连接所独有的,这意味着它们可以非常快速有效地传输数据。虽然 WebSockets 有很多很好的用途,但也有一些环境使用不同的方法会更好,比如长轮询。
在本指南中,我们将解释什么是 WebSocket,并详细说明将它们用于实时应用程序的一些好处。我们将回顾实现 WebSockets 的最佳用例,并讨论您可能想要使用的其他选项。到本文结束时,您将更清楚地了解 WebSockets 的用途以及 WebSockets 是否能满足您应用程序的特定需求。
虽然 WebSockets 听起来像是处理实时通信的绝佳方式,但在使用 WebSockets 进行实时通信时,请务必注意一些重大挑战。
要理解 WebSocket API,理解它的基础——HTTP(超文本传输协议)及其请求/响应模型也很重要。HTTP 是一个应用层协议,它是所有基于 Web 的通信和数据传输的基础。
使用 HTTP 时,客户端(例如 Web 浏览器)向服务器发送请求,然后服务器发回消息,称为响应。我们今天所知道的网络是建立在这个基本的客户端-服务器循环之上的,尽管 HTTP 已经进行了许多添加和更新以使其更具交互性。目前有几个可行且受支持的 HTTP 版本——HTTP/1.1 和 HTTP/2——以及一个称为 HTTPS 的安全版本。
基本 HTTP 请求适用于许多用例,例如当某人需要在网页上进行搜索并接收有关该主题的相关的、非时间敏感的信息时。但是,它并不总是最适合需要实时通信的 Web 应用程序,或需要以最小延迟快速更新的数据。
每次客户端发出新的 HTTP 服务器请求时,默认行为是打开一个新的 HTTP 连接。这是低效的,因为它在重复出现的非有效负载数据上使用带宽并增加了数据传输之间的延迟。
此外,HTTP 请求只能在一个方向上流动——从客户端。传统上没有服务器启动与客户端通信的机制。除非客户端先请求,否则服务器无法向客户端发送数据。对于需要从服务器端实时发出消息的用例,这可能会产生问题。
接收定期数据更新的第一个解决方案是 HTTP 轮询。轮询是一种客户端重复向服务器发送请求直到它响应更新的技术。例如,所有现代 Web 浏览器都支持 XMLHttpRequest,这是一种轮询服务器的原始方法。
这些早期的解决方案对于高效的实时通信仍然不是理想的——短轮询是密集的,因为对于每个请求,非有效负载数据都被重新发送并且必须被解析,包括标头 html、web url 和其他重复信息那会浪费资源。
改善延迟的下一个合乎逻辑的步骤是 HTTP 长轮询 。长轮询时,客户端轮询服务器,并且该连接保持打开状态,直到服务器有新数据为止。服务器发送带有相关信息的响应,然后客户端立即打开另一个请求,再次保持直到下一次更新。在自动发送另一个请求之前,长轮询可以使连接保持打开状态最多 280 秒。此方法有效地模拟 HTTP 服务器推送。
长轮询在许多环境中提供快速通信并被广泛使用,通常与 WebSocket 连接或服务器端事件 (SSE) 等真正基于推送的方法相反。长轮询在服务器端似乎很密集,因为它需要持续的资源来保持连接打开,但它使用的资源比重复发送轮询请求要少得多。
WebSockets 是由开发人员发明的,以有效地促进实时结果。WebSockets 通过在客户端和服务器之间发起连续的全双工通信来工作。这减少了不必要的网络流量,因为数据可以立即通过单个打开的连接双向传输。这提供了网络上的速度和实时能力。Websockets 还使服务器能够跟踪客户端并根据需要将数据“推送”给它们,这仅使用 HTTP 是不可能的。
WebSocket 连接支持通过消息流式传输文本字符串和二进制数据。WebSocket 消息包括帧、负载和数据部分。以这种方式通过现有网络连接发送的非有效负载数据很少,这有助于减少延迟和开销,尤其是与 HTTP 请求和流模型相比时。
谷歌浏览器是第一个在 2009 年包含对 WebSockets 标准支持的浏览器。RFC 6455——WebSocket 协议——于 2011 年正式在线发布。WebSocket 协议和WebSocket API 由 W3C 和 IETF 标准化,跨浏览器的支持非常好常见的。
在客户端和服务器可以交换数据之前,它们必须使用 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 是一种非常有用的协议,可用于跨 Web、移动和桌面变体构建实时功能,但它们并不是一种放之四海而皆准的方法。在开发基于实时通信的应用程序时,WebSockets 只是一种适合更大武器库的工具。可以构建基本的 WebSocket 协议并结合其他方法,如 SSE 或长轮询,并构建一个更好、更具可扩展性的实时应用程序。问题在于,如果您还不是构建实时系统的专家,那么这些缺点可能难以管理。