【网络协议】WebSocket简介
WebSocket 的简介
目录
- WebSocket 的简介
- 一、什么是WebSocket
- 1.1 HTTP通信流程
- 1.2 WebSocket通信流程
- 1.3 WebSocket 握手请求包
- 二、WebSocket 与 Socket的区别
- 2.1 Socket 套接字
- 三、MQTT Over Websocket
- 3.1 MQTT协议
- 3.2 WebSocket:实现高级实时通信
- 3.3 MQTT VS WebSocket
- 3.4 MQTT Over Websocket
- 总结
一、什么是WebSocket
WebSocket 是一种网络通信协议,它在单个、持久的 TCP 连接上提供全双工(双向同时)通信通道,位于OSI模型的应用层。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket 通信流程中,客户端和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输。
1.1 HTTP通信流程
HTTP协议是采用客户端-服务器模型的应用层协议,同样是基于TCP连接的通信。每次通信时,由客户端主动发起请求,服务端收到请求后响应,服务器无法主动向客户端发送数据(除非使用轮询/长轮询等变通方法)。
HTTP通信时序图如下:
HTTP 默认工作在 TCP 协议 80 端口,用户访问网站 http:// 打头的都是标准 HTTP 服务。由于HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
HTTPS是HTTP的安全加密版本,工作在TCP协议的443端口, https:// 开头的url 表明使用HTTPS服务。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
1.2 WebSocket通信流程
WebSocket通过HTTP端口80
和443
进行工作,并支持HTTP代理和中介,从而使其与HTTP协议兼容。 为了实现兼容性,WebSocket握手使用HTTP Upgrade头从HTTP协议更改为WebSocket协议。
同HTTP协议类似,默认情况下,WebSocket协议使用80端口;加密的WebSocket运行在TLS/SSL之上时,默认使用443端口。 Websocket与HTTP和HTTPS使用相同的TCP端口,可以绕过大多数防火墙的限制。
类似于 HTTPS 是 HTTP 的安全版本,WebSocket Secure协议 (wss://
) 是 WebSocket ( ws://
) 的安全版本,它使用 TLS/SSL 对 WebSocket 连接进行加密。
WebSocket的 url 如下:
ws://example.com/wsapi
wss://secure.example.com/wsapi
WebSocket的通信时序图如下:
WebSocket的通信流程分为三个阶段:
-
握手阶段 (HTTP Upgrade):
- 客户端发起一个看起来像 HTTP GET 的请求,但包含特殊的升级头 (
Upgrade: websocket
,Connection: Upgrade
) 和 WebSocket 特定的头 (Sec-WebSocket-Key
,Sec-WebSocket-Version
)。 - 服务器同意升级则返回
101 Switching Protocols
响应和对应的Sec-WebSocket-Accept
。 - 此时,底层的 TCP 连接被“升级”,不再用于 HTTP 通信,后续所有数据都遵循 WebSocket 协议帧格式。
- 客户端发起一个看起来像 HTTP GET 的请求,但包含特殊的升级头 (
-
WebSocket 通信阶段:
- 持久连接: TCP 连接在握手成功后保持打开状态。
- 双向通信: 服务器和客户端都可以随时、独立地发送 WebSocket 数据帧。服务器不再需要等待客户端请求即可推送数据 (
Data1
,Data2
,Data3
)。 - 低开销帧: 传输的数据被封装在 WebSocket 帧中,其头部开销极小(最小 2 字节),远小于 HTTP 头部。
- 全双工: 客户端发送
MessageA
/MessageB
和服务器推送Data
可以同时发生。
-
关闭阶段:
- 通信结束时,任一方(通常是客户端或服务器根据应用逻辑)可以发送一个特殊的 WebSocket 控制帧 (
Close Frame
) 来优雅地关闭连接。另一方回应Close Frame
后,TCP 连接终止。
- 通信结束时,任一方(通常是客户端或服务器根据应用逻辑)可以发送一个特殊的 WebSocket 控制帧 (
1.3 WebSocket 握手请求包
WebSocket 连接始于一个特殊的 HTTP 请求,握手阶段:
- 客户端发起“升级”请求: 客户端发送一个标准的 HTTP GET 请求,但包含特殊的头部:
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key:
(一个随机生成的 Base64 编码密钥)Sec-WebSocket-Version:
(协议版本,通常是 13)
- 服务器响应“切换协议”: 如果服务器支持 WebSocket 并同意升级:
- 返回 HTTP 状态码
101 Switching Protocols
。 - 包含头部:
Connection: Upgrade
,Upgrade: websocket
。 - 包含
Sec-WebSocket-Accept:
(基于客户端发送的 Key 计算出的响应值)。
- 返回 HTTP 状态码
- 连接升级: 一旦握手完成,底层的 TCP 连接不再用于 HTTP 通信,而是被**“升级”**为 WebSocket 连接。后续所有的数据交换都使用 WebSocket 协议定义的二进制帧格式进行传输。
- 支持子协议: 握手时可以协商使用一个特定的“子协议”(如
mqtt
,soap
,wamp
),允许在 WebSocket 连接之上承载更高级别的应用协议(这正是 MQTT over WebSocket 的实现方式),例如Sec-WebSocket-Protocol: mqtt
则是MQTT Over WebSocket的握手请求包中的设置。
二、WebSocket 与 Socket的区别
2.1 Socket 套接字
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,它把复杂的TCP/IP协议族隐藏在Socket接口后面,它是操作系统提供给应用程序用于网络通信的一种机制。
Socket通信流程如下图所示:
- Socket (套接字): 是一个通用的、底层的网络编程接口。它位于操作系统层面(传输层和应用层之间),是构建任何网络通信(HTTP、FTP、SSH、SMTP、你自己的私有协议…)的基础。它定义了创建连接、发送/接收数据的基本操作。
- WebSocket: 是一个应用层通信协议。它建立在 TCP 之上(所以底层也使用了 Socket)。它的主要目的是在 Web 浏览器和服务器之间提供全双工、双向的实时通信通道。它从一次 HTTP 握手升级协议开始,WebSocket 协议本身定义了消息格式、握手过程、心跳机制等。
三、MQTT Over Websocket
3.1 MQTT协议
MQTT 是一种专为资源受限的环境设计的轻量级 **发布-订阅(Publish/Subscribe)**消息传输协议,MQTT协议运行于TCP协议之上,提供了一对多的消息分发机制,非常适合功率低、带宽有限或网络不稳定的场合。它的数据包尺寸小、基于主题的消息路由和多种服务质量(QoS)级别,使其在需要高效率和可靠性的物联网应用中表现出色。
MQTT的通信模型
MQTT 的关键特性
- 轻量化:降低资源消耗,适合功能有限的设备。
- 高可靠性:提供多级服务质量(QoS),确保在不稳定的网络环境中也能传递消息。
- 安全通讯:支持 TLS/SSL 加密和客户端认证,保障数据安全。
- 双向通信:通过发布-订阅模式实现双向交流。
- 有状态会话:管理连接状态,提升通信可靠性。
- 高扩展性:在带宽消耗最小的情况下处理大规模部署。
- 多语言支持:支持多种编程语言,易于集成。
3.2 WebSocket:实现高级实时通信
WebSocket 协议通过单个 TCP 连接实现全双工通信。它始于一个 HTTP 握手,该握手将连接从 HTTP 升级到 WebSocket,从而允许不间断的双向数据流,避免了重复建立连接的开销。
WebSocket 的工作原理
WebSocket 从一个握手动作开始。客户端请求从 HTTP 升级到 WebSocket,一旦得到服务器的批准,就会建立一个持久的 TCP 通道。这样就消除了 HTTP 连接周期的延迟,使数据交换能够即时进行。
WebSocket 的关键特性
- 双向通信:促进实时的双向交互。
- 低延迟:通过保持连接开放,减少通信延迟。
- 高效率:有效处理频繁的小型消息和大量数据。
- 广泛兼容:在现代浏览器和服务器技术中得到广泛支持。
实际应用场景
- 互动游戏:在多人游戏中提供流畅的玩家互动体验。
- 实时通知:为金融交易和社交媒体即时发送提醒。
- 实时内容更新:动态更新新闻动态和体育比分。
- 协作工具:支持文档和项目的实时共同编辑。
3.3 MQTT VS WebSocket
以下是两种协议的一个详细的对比,突出了这些差异和相似点
特性 | MQTT | WebSocket |
---|---|---|
架构 | 发布/订阅模式,可选请求/响应机制 | 双向通信,类 Socket API |
通信类型 | 异步通信,支持广播(一对多) | 异步通信,点对点(一对一) |
连接类型 | 通过 Broker 实现长期连接 | 持久化直接连接 |
安全连接 | TLS over TCP | TLS over TCP |
消息格式 | 二进制数据 | 二进制数据(基于帧的结构) |
消息大小 | 最大 256 MB | 每帧最大 2^63 字节 |
消息开销 | 最小,起始于 2 字节 | 最小 2 字节,掩码帧 6 字节 |
消息分发 | Broker 可为离线订阅者缓存消息 | 不支持原生消息队列;依赖额外软件 |
消息 QoS | 0(最多一次),1(至少一次),2(仅一次) | 无内置 QoS;依赖 TCP |
消息排队 | 由 Broker 支持 | 原生不支持 |
标准和协议合规 | 遵循 OASIS 标准,具备全面安全特性 | 符合 RFC 6455,遵守网络标准 |
数据效率 | 由于头部开销极小,效率高 | 由于帧结构开销较大,效率略低 |
可扩展性 | 通过 Broker,具有广泛的扩展性 | 受限于直接连接,需要额外层 |
集成复杂度 | 中等,取决于 Broker 配置 | 一般较低,易于与 HTTP/S 环境集成 |
维护和运营成本 | 需要 Broker 管理 | 较低,除非进行水平扩展 |
实时能力 | 高,但 Broker 可能引入延迟 | 极高,支持即时数据传输 |
受限网络条件下的表现 | 适应性强,适合各种网络条件 | 在稳定网络条件下表现最佳 |
协议成熟度 | 成熟,物联网领域广泛使用 | Web 开发中流行 |
适用场景 | 物联网、车联网、网络受限环境 | 实时网络应用、游戏、互动平台 |
3.4 MQTT Over Websocket
指的是基于WebSocket的MQTT协议,把mqtt消息封装为Websocket消息,首先使用WebSocket建立连接,然后在WebSocket通道上使用MQTT协议进行通信。
使用WebSocket方式主要有以下优势:
- 使基于浏览器的应用程序可以像普通设备一样,具备与服务端建立MQTT长连接的能力。
- WebSocket方式使用443端口,消息可以顺利穿过大多数防火墙。
- 由于浏览器直接支持WebSocket,因此可以直接在Web应用程序中使用MQTT,无需任何插件或额外的软件。
- 使用WebSocket,MQTT可以更容易地与现代Web技术(如HTML5, JavaScript, CSS)结合,提供实时的Web应用体验。
MQTT over WebSocket 在物联网应用与 Web 技术之间架起了一座桥梁,使得通过浏览器进行实时交互成为可能。
总结
WebSocket 是现代 Web 应用实现真正实时、高效、双向通信的基石。它克服了传统 HTTP 轮询/长轮询的缺点,为聊天、游戏、金融交易、物联网监控等需要低延迟和高频数据交换的场景提供了强大的基础通信能力。