【译】什么是 WebSocket 以及为何使用它们?

164 阅读7分钟

原文链接:What are WebSockets and Why are they Used?

Websockets是一种通信协议,通过在客户端和服务器之间建立双向连接来构建实时功能

image.png

想象一款在线多人游戏,其中排行榜会随着玩家得分而立即更新,显示所有玩家的实时排名

这种即时更新感觉无缝且让您保持参与,但它实际上是如何工作的呢?

这种实时体验背后的魔力通常由 WebSockets 提供支持。

WebSockets通过单个 TCP 连接实现客户端(通常是 Web 浏览器)和服务器之间的全双工、双向通信

与传统的 HTTP 协议不同,客户端向服务器发送请求并等待响应,而 WebSocket 允许客户端和服务器在建立连接后独立且连续地相互发送消息。

在本文中,我们将探讨 websockets 的工作原理、为什么/在哪里使用它们、它与其他通信方法的比较、挑战和注意事项以及如何在代码中实现它们。

WebSocket 如何工作?

WebSocket 连接始于客户端向服务器发出的标准 HTTP 请求。

但是,服务器并没有完成请求并关闭连接,而是以 HTTP 101 状态代码进行响应,表明协议正在切换到 WebSockets。

这次握手之后,WebSocket 连接就建立了,客户端和服务器都可以通过这个打开的连接互相发送消息。

image.png

连接过程:

1. 握手

客户端使用标准 HTTP GET 请求发起连接请求,并将“Upgrade”标头设置为“websocket”。

image.png

如果服务器支持 WebSockets 并接受请求,它将以特殊的 101 状态代码进行响应,表示协议将更改为 WebSocket。

image.png

2. 连接

握手完成后,WebSocket 连接即建立。此连接保持打开状态,直到客户端或服务器明确关闭。

3. 数据传输

客户端和服务器现在都可以实时发送和接收消息。

这些消息以称为的小数据包的形式发送,与传统的 HTTP 请求相比,其开销最小。

4. 结束

客户端或服务器可以随时关闭连接,通常使用 “关闭”帧 来指示关闭的原因。

为什么使用 WebSocket?

WebSocket 具有多种优势,使其成为某些类型应用程序的理想选择:

  • 实时更新:WebSockets 支持即时数据传输,非常适合需要实时更新的应用程序,如实时聊天、游戏或金融交易平台。
  • 减少延迟:由于连接是持久的,因此无需为每条消息建立新连接,从而显著减少延迟。
  • 高效资源使用:WebSocket 比传统轮询技术更高效,因为它们不需要客户端不断向服务器询问更新。
  • 双向通信:客户端和服务器均可发起通信,从而实现更加动态和交互式的应用程序。
  • 更低的开销:初次握手之后,WebSocket 帧有一个较小的报头(只有 2 个字节),从而减少了传输的数据量。

WebSockets 与 HTTP、轮询和长轮询

为了了解 WebSocket 的优势,将其与其他通信方法进行比较会很有帮助:

HTTP:

  • 请求-响应模型:在 HTTP 中,客户端发送请求,服务器响应,然后关闭连接。此模型无状态,不适合实时通信。
  • 延迟:由于每次交互都需要新的请求,因此与 WebSockets 相比,HTTP 具有更高的延迟。

轮询:

image.png

  • 重复请求:客户端以固定的时间间隔向服务器重复发送请求以检查更新。虽然这可以模拟实时更新,但效率低下,因为许多请求不会返回新数据。
  • 延迟:轮询会引入延迟,因为仅定期检查更新。

长轮询:

image.png

  • 持久连接:在长轮询中,客户端发送请求,服务器保持连接打开,直到有数据要发送。一旦数据发送完毕或发生超时,连接就会关闭,客户端会立即发送新的请求。
  • 延迟: 这种方法降低了请求的频率,但与 WebSocket 相比仍然会受到更高的延迟的影响,因为它要求客户端在每个先前的请求完成后重复发送新的 HTTP 请求。
  • 资源使用:长轮询可能导致服务器资源耗尽,因为它必须管理许多打开的连接并处理频繁的重新连接。

WebSocket 接口:

image.png

  • 双向:与 HTTP、轮询和长轮询不同,WebSocket 允许双向通信。
  • 低延迟:由于连接保持打开,因此可以以最小的延迟发送和接收数据。
  • 效率:WebSocket 在资源使用和带宽方面更高效。

挑战和注意事项

虽然 WebSocket 提供了许多好处,但也存在一些挑战需要考虑:

  • 代理服务器:某些代理服务器不支持 WebSocket 连接,并且某些防火墙可能会阻止它们。
  • 可扩展性问题:管理大量 WebSocket 连接可能具有挑战性。考虑使用负载平衡器和分布式 WebSocket 服务器来处理大规模部署。
  • 回退机制:并非所有客户端或网络都支持 WebSocket,这可能会导致连接问题。为无法建立 WebSocket 连接的客户端实施长轮询等回退机制。
  • 网络可靠性: WebSocket 依赖于持久连接,而网络问题可能会中断该连接。实施重新连接策略心跳机制(定期发送 ping/pong 消息)有助于保持连接的稳定性并检测连接何时丢失。
  • 安全性: WebSocket 容易受到跨站点 WebSocket 劫持和分布式拒绝服务 (DDoS) 等攻击。实施安全的 WebSocket 连接 (wss://) 、对用户进行身份验证并验证输入,以防止常见的漏洞。

WebSocket 在哪里使用?

1.实时协作工具

像 Google Docs 这样的应用程序可能会使用 WebSockets 让多个用户同时编辑一个文档。一个用户所做的更改会立即反映给所有其他用户,从而带来无缝的协作体验。

2.实时聊天应用程序

WebSockets 最流行的用途之一是实时聊天应用程序。

像 Slack 这样的消息平台使用 WebSockets 即时传递消息。这允许实时对话和即时消息传递通知。

3. 实时通知

社交媒体平台使用 WebSockets 在用户收到新消息、点赞或评论时向他们推送实时通知。

一旦有更新发生,服务器就可以立即将更新推送给客户端,而不需要客户端不断检查是否有新的通知。

4. 多人在线游戏

在在线多人游戏中,低延迟对于无缝游戏体验至关重要。

WebSockets提供游戏服务器和玩家之间必要的实时通信,确保所有玩家同时看到相同的游戏状态。

5. 金融市场数据源

WebSockets 广泛用于金融应用程序中,以传输实时市场数据,例如股票价格、外汇汇率和加密货币价值。

6.物联网(IoT)应用

在物联网应用中,设备经常需要与服务器实时通信。

WebSockets 为发送传感器数据、接收命令和同步设备状态提供了一种轻量级且高效的通信通道。

7. 直播和广播

虽然实际的视频流通常使用其他协议,但 WebSocket 可用于直播期间的实时聊天、观众计数和其他交互功能。

实现 WebSockets

为了演示 WebSockets 的工作原理,让我们看一个在服务器端使用 Node.js 、在客户端使用 JavaScript 的简单实现。

服务器端(Node.js):

image.png

客户端(JavaScript):

image.png

结论

WebSockets 彻底改变了我们构建实时 Web 应用程序的方式,提供了支持全双工数据交换的高效、低延迟的通信通道。

从聊天应用程序和实时通知到在线游戏和物联网设备,WebSockets 支持创建响应迅速且引人入胜的用户体验。

然而,能力越大,责任越大。实现 WebSocket 需要仔细考虑可扩展性、安全性和资源管理,以确保您的应用程序在任何条件下都能正常运行。