定义

WebSocket 是一种网络通信协议,可在单个 TCP 连接上提供全双工通信。它使得客户端和服务器之间可以进行实时的双向数据传输,而无需像 HTTP 那样每次都发起新的请求。

核心特点

  • 全双工通信: 客户端和服务器可以同时发送和接收数据。
  • 持久连接: 一旦连接建立,就会保持打开状态,直到客户端或服务器主动关闭。
  • 实时性: 数据可以立即传输,无需等待请求 - 响应周期。
  • 低延迟: 减少了 HTTP 协议中重复的握手和头部信息,降低了延迟。

工作原理

  1. 握手: 客户端发起 HTTP 请求,请求升级为 WebSocket 连接。服务器接受请求后,完成握手。
  2. 数据传输: 握手完成后,客户端和服务器可以通过已建立的 TCP 连接自由地发送和接收数据帧。
  3. 连接关闭: 客户端或服务器可以随时关闭连接。

应用

  • 实时聊天应用: 例如在线客服、聊天室等。
  • 在线游戏: 例如多人在线游戏,需要实时同步游戏状态。
  • 实时数据更新: 例如股票行情、体育赛事直播等。
  • 协同编辑: 例如多人在线文档编辑。
  • 物联网 (IoT): 设备与服务器之间的实时数据交换。

优缺点

  • 优点: - 实时性高,延迟低。 - 全双工通信,效率高。 - 减少了 HTTP 的头部开销。
  • 缺点: - 需要服务器支持 WebSocket 协议。 - 相比 HTTP,部署和维护可能更复杂。 - 安全性需要额外考虑。

与 HTTP 的比较

特性HTTPWebSocket
连接方式短连接,每次请求都需要建立新的 TCP 连接长连接,建立一次 TCP 连接后保持打开状态
通信方式半双工,请求 - 响应模式全双工,双向实时通信
实时性较低,需要轮询或长轮询模拟实时性高,实时性好
头部开销较大,每次请求都包含头部信息较小,只有在握手时有头部信息
适用场景适用于非实时性要求的场景适用于实时性要求高的场景

安全性

  • 防止跨站 WebSocket 劫持 (CSWSH): 验证 Origin 头部,确保请求来自信任的域名。
  • 输入验证: 对客户端发送的数据进行验证,防止恶意代码注入。
  • 使用 TLS 加密: 使用 wss:// 协议进行加密通信。

相关概念

  • Socket.IO: 一个基于 WebSocket 的库,提供了更多的功能和兼容性,例如自动降级到 HTTP 长轮询。

问答卡片

  • Q: WebSocket 是什么? - A: 一种在客户端和服务器之间提供持久连接的协议,用于实现实时双向数据传输。
  • Q: WebSocket 和 HTTP 有什么区别? - A: WebSocket 是全双工通信,而 HTTP 是半双工通信。WebSocket 建立一次连接后保持打开状态,而 HTTP 每次请求都需要建立新的 TCP 连接。

参考资料