WebSocket 是一种计算机网络通信协议,它在单个 TCP 连接上提供全双工、实时的通信。WebSocket 允许客户端和服务器之间进行持久化的、低延迟的双向通信,并且与传统的 HTTP 协议相比,WebSocket 能够提供更高效的数据交换。
WebSocket 由 IETF (Internet Engineering Task Force) 在 2011 年发布,RFC 6455 规范定义了它的工作方式。它常用于实时应用程序,如在线游戏、即时聊天、金融交易系统、股票市场监控等。
WebSocket 是一个 全双工协议,即客户端和服务器可以在同一连接上同时进行数据的发送和接收。这与传统的 HTTP 协议不同,HTTP 是基于请求-响应模型的,每次通信都需要建立新的连接,而 WebSocket 建立了一个持久的连接,允许双向数据流的持续交换。
WebSocket 协议避免了传统 HTTP 协议的请求-响应模式,减少了通信延迟。当 WebSocket 连接建立后,数据可以在客户端和服务器之间实时传输,而不需要每次发送请求或等待响应。
WebSocket 在建立连接后,通信双方可以通过一个 持久的 TCP 连接 进行多次数据交换。这意味着不需要频繁地建立和断开连接,从而减少了网络开销和资源消耗。
WebSocket 协议在数据传输时没有 HTTP 头的冗余信息,因此比传统的 HTTP 请求响应更加高效,适合需要实时传输大量数据的应用场景。
WebSocket 协议基于 HTTP 协议建立连接,因此它能够在现有的 HTTP 网络架构中运行,并且能够穿越现有的防火墙和代理服务器。
WebSocket 协议的通信过程通常包含两个阶段:握手 和 数据传输。
WebSocket 连接的建立通过 HTTP 协议的 握手 完成,客户端和服务器通过 HTTP 协议交换一些特定的头部信息来协商是否升级为 WebSocket 协议。WebSocket 的握手过程通常如下:
客户端发送握手请求: 客户端通过 HTTP 请求发送一个带有特殊头部的请求,请求升级协议到 WebSocket。示例请求如下:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9K5K1lQ==
Sec-WebSocket-Version: 13
Upgrade
:告诉服务器,客户端请求协议升级为 WebSocket。Connection: Upgrade
:表明希望升级协议。Sec-WebSocket-Key
:客户端生成一个随机的 Base64 编码字符串,服务器将基于这个值生成一个响应。Sec-WebSocket-Version
:指定 WebSocket 协议的版本(常见版本是 13)。服务器回应握手请求: 服务器在接收到客户端的请求后,如果支持 WebSocket 协议并且能够处理该请求,就会发送 HTTP 响应,升级连接到 WebSocket。响应示例如下:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: tYVczR3zV7ckFgM1BG0p0A==
101 Switching Protocols
:表示协议已经升级。Sec-WebSocket-Accept
:服务器使用客户端发送的 Sec-WebSocket-Key
和特定算法生成的回应值,确保连接的合法性。完成握手后,HTTP 连接就会升级为 WebSocket 连接,通信双方可以开始通过 WebSocket 协议进行数据交换。
一旦握手成功,客户端和服务器之间的通信就不再使用 HTTP 协议,而是采用 WebSocket 协议。WebSocket 连接建立后,客户端和服务器之间的数据交换可以是双向的、实时的,且数据传输非常高效。
WebSocket 数据传输是基于帧的(frame-based),每个帧包含数据包的头部和数据负载。数据帧可以是:
数据帧的结构如下:
WebSocket 消息由若干个帧(Frame)组成,每个帧有一定的格式:
WebSocket 协议非常适合需要实时双向通信的场景,常见的应用包括:
特性 | WebSocket | HTTP |
---|---|---|
连接方式 | 在握手后通过单个 TCP 连接进行双向通信 | 每个请求都需要建立独立的连接 |
通信方式 | 全双工、实时、双向通信 | 半双工、请求-响应模式 |
效率 | 高效,减少了请求-响应的开销 | 相对较低,每个请求都有头部信息的开销 |
延迟 | 低延迟,实时性强 | 较高,存在请求-响应的延迟 |
用途 | 实时应用(聊天、游戏、实时通知等) | 传统的网页请求、数据传输等 |
WebSocket 是一种提供全双工、实时、低延迟通信的协议,它通过 HTTP 协议的握手建立连接,然后通过单一的持久 TCP 连接进行数据的实时交换。WebSocket 在许多需要实时通信的应用场景中都非常有用,如即时通讯、在线游戏、实时数据流、股票行情等。它比传统的 HTTP 协议更加高效,特别适合用于处理大量实时数据的应用。