定义
WebSocket 是一种网络通信协议,可在单个 TCP 连接上提供全双工通信。它使得客户端和服务器之间可以进行实时的双向数据传输,而无需像 HTTP 那样每次都发起新的请求。
核心特点
- 全双工通信: 客户端和服务器可以同时发送和接收数据。
- 持久连接: 一旦连接建立,就会保持打开状态,直到客户端或服务器主动关闭。
- 实时性: 数据可以立即传输,无需等待请求 - 响应周期。
- 低延迟: 减少了 HTTP 协议中重复的握手和头部信息,降低了延迟。
工作原理
- 握手: 客户端发起 HTTP 请求,请求升级为 WebSocket 连接。服务器接受请求后,完成握手。
- 数据传输: 握手完成后,客户端和服务器可以通过已建立的 TCP 连接自由地发送和接收数据帧。
- 连接关闭: 客户端或服务器可以随时关闭连接。
应用
- 实时聊天应用: 例如在线客服、聊天室等。
- 在线游戏: 例如多人在线游戏,需要实时同步游戏状态。
- 实时数据更新: 例如股票行情、体育赛事直播等。
- 协同编辑: 例如多人在线文档编辑。
- 物联网 (IoT): 设备与服务器之间的实时数据交换。
优缺点
- 优点: - 实时性高,延迟低。 - 全双工通信,效率高。 - 减少了 HTTP 的头部开销。
- 缺点: - 需要服务器支持 WebSocket 协议。 - 相比 HTTP,部署和维护可能更复杂。 - 安全性需要额外考虑。
与 HTTP 的比较
特性 | HTTP | WebSocket |
---|---|---|
连接方式 | 短连接,每次请求都需要建立新的 TCP 连接 | 长连接,建立一次 TCP 连接后保持打开状态 |
通信方式 | 半双工,请求 - 响应模式 | 全双工,双向实时通信 |
实时性 | 较低,需要轮询或长轮询模拟实时性 | 高,实时性好 |
头部开销 | 较大,每次请求都包含头部信息 | 较小,只有在握手时有头部信息 |
适用场景 | 适用于非实时性要求的场景 | 适用于实时性要求高的场景 |
安全性
- 防止跨站 WebSocket 劫持 (CSWSH): 验证 Origin 头部,确保请求来自信任的域名。
- 输入验证: 对客户端发送的数据进行验证,防止恶意代码注入。
- 使用 TLS 加密: 使用 wss:// 协议进行加密通信。
相关概念
- Socket.IO: 一个基于 WebSocket 的库,提供了更多的功能和兼容性,例如自动降级到 HTTP 长轮询。
问答卡片
- Q: WebSocket 是什么? - A: 一种在客户端和服务器之间提供持久连接的协议,用于实现实时双向数据传输。
- Q: WebSocket 和 HTTP 有什么区别? - A: WebSocket 是全双工通信,而 HTTP 是半双工通信。WebSocket 建立一次连接后保持打开状态,而 HTTP 每次请求都需要建立新的 TCP 连接。