详解了解websocket协议

详解了解websocket协议

WebSocket是一种建立在TCP协议之上的全双工通信协议,它允许客户端与服务器之间进行实时双向数据通信。相比传统的HTTP请求-响应模式,WebSocket能够有效地减少网络延迟和带宽开销,广泛用于即时通信、实时游戏、股票行情等应用领域。


一、WebSocket的定义与特性

WebSocket是一种基于TCP连接的独立协议,其设计初衷是解决传统HTTP协议在实时通信上的不足:

  • 双向通信
    • 客户端和服务器都可以主动发送数据。
  • 持久连接
    • 建立连接后一直保持,直到客户端或服务器任意一方主动关闭。
  • 低延迟与高性能
    • 避免了HTTP请求头的多次传输,大幅降低延迟和传输的数据量。
  • 轻量级协议
    • 采用极小的协议头部,数据传输效率高。

二、WebSocket的工作原理与流程

WebSocket的连接生命周期分为三步:

1. 握手阶段(Handshake)

客户端通过HTTP请求建立与服务器的WebSocket连接:

复制代码
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

服务器接受并返回HTTP响应进行握手确认:

复制代码
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

握手完成后,TCP连接将从HTTP升级为WebSocket协议。

2. 数据传输阶段

连接建立后,客户端和服务器都可以主动向对方发送消息:

  • 客户端→服务器:客户端随时向服务器发送消息;
  • 服务器→客户端:服务器可以主动推送消息,无需客户端轮询。

传输的数据格式:

复制代码
Frame格式:
| FIN | RSV1 | RSV2 | RSV3 | Opcode | Mask | Payload length | Masking-key (optional) | Payload data |
  • Opcode(操作码) :表示数据帧类型:
    • 0x1 表示文本数据;
    • 0x2 表示二进制数据;
    • 0x8 表示关闭连接;
    • 0x9 表示Ping;
    • 0xA 表示Pong(对Ping的响应)。

3. 连接关闭阶段

任何一方可发送关闭帧来结束连接:

复制代码
客户端或服务器发送关闭帧:
Opcode: 0x8 (关闭帧)

对方收到关闭帧后,响应一个关闭帧,双方确认后TCP连接终止。


三、WebSocket与HTTP的区别

特性 WebSocket HTTP
连接方式 双向通信,长连接 请求-响应模式,短连接
实时性 高,实时推送数据 低,需频繁请求或轮询
网络流量 请求头较多,流量消耗大
延迟 较高,存在额外的握手开销
适用场景 聊天室、游戏 网页、API、资源加载

四、WebSocket常见应用场景

  • 在线聊天应用
    • 微信网页版、即时通讯工具
  • 实时数据推送
    • 股票交易系统、实时监控系统
  • 多人在线游戏
    • 实时游戏互动、实时操作同步
  • 协同编辑工具
    • 多用户协同文档编辑(如Google Docs)

五、WebSocket常用库和工具

后端(服务器端)

  • Java:NettySpring WebSocketJava-WebSocket
  • Node.js:wssocket.io
  • Python:websocketschannels(用于Django)
  • Golang:标准库 golang.org/x/net/websocket 或第三方 gorilla/websocket

前端(客户端)

  • 浏览器原生支持WebSocket API:

    javascript 复制代码
    const ws = new WebSocket("wss://example.com/chat");
    ws.onopen = () => ws.send("Hello!");
    ws.onmessage = event => console.log(event.data);
  • 常用库:

    • socket.io-client:提供重连、心跳、房间管理等扩展功能。

六、WebSocket安全性与注意事项

  • WebSocket本身并不强制提供安全保障,建议使用wss://(WebSocket Secure)进行加密传输;
  • 防止跨站请求伪造(CSRF)和跨域资源共享(CORS)攻击;
  • 对数据进行有效的身份认证与权限校验;
  • 服务端要注意WebSocket的最大连接数限制,合理控制资源使用。

七、WebSocket协议相关规范(RFC文档)


问答QA:

websocket和http协议的关系是什么?

WebSocket 和 HTTP 协议之间存在紧密关联,可以将 WebSocket 理解为一种基于 HTTP 协议升级而来的增强协议,它利用了 HTTP 进行初始握手(handshake),随后在此基础上将连接升级为双向持久连接的 WebSocket 协议。

WebSocket 与 HTTP 的关系概述

WebSocket 是基于 HTTP 的扩展协议。简单地说:

  • HTTP协议

    • 是一种单向的请求-响应协议(客户端发起请求,服务器响应后连接即断开)。
    • 默认是无状态短连接(HTTP 1.x),适合于资源的请求、传输,不适合实时通信。
  • WebSocket协议

    • 在 HTTP 基础上引入了一种协议升级机制,通过升级请求,将 HTTP 转换为 WebSocket 协议。
    • 连接建立后,即切换为全双工通信,允许服务器主动推送数据到客户端。

因此,可以说:

WebSocket 是利用 HTTP 实现了协议升级(Upgrade),并最终独立于 HTTP 运作的实时双向通信协议。

HTTP 到 WebSocket 协议升级过程

握手阶段的过程:

  • 首先客户端向服务器发送一个标准的 HTTP 请求,并在请求头中附带 Upgrade: websocket 信息:
http 复制代码
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
  • 服务端收到 HTTP 请求后,如果同意协议升级,则返回 HTTP 响应状态 101 Switching Protocols
http 复制代码
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

此时协议从 HTTP 升级为 WebSocket。

  • 握手完成后,TCP 连接不再使用 HTTP 协议,而是直接使用 WebSocket 帧进行数据交互。

WebSocket 和 HTTP 的具体区别

区别点 HTTP协议 WebSocket协议
通信方式 请求-响应模式(半双工) 双向通信(全双工)
协议状态 无状态协议(每次请求独立) 有状态协议(持久连接)
数据流向 单向,由客户端主动请求 双向,服务器与客户端皆可主动发送数据
协议标识 http://https:// ws://wss://
连接持续时间 短连接,每次请求完成后连接断开 长连接,直至明确关闭连接
应用场景 网页加载、API请求、静态资源获取 实时消息推送、聊天系统、在线游戏、协同编辑

WebSocket 与 HTTP 在实践中的组合应用

实际应用中,WebSocket 常与 HTTP 组合使用:

  • 应用启动阶段(HTTP协议):

    • 身份验证(如登录、授权)。
    • 静态资源加载(HTML、CSS、JS文件等)。
  • 应用运行阶段(WebSocket协议):

    • 一旦建立了身份,进入实时互动环节,客户端和服务器之间的数据传输便切换到 WebSocket,实现实时通信。

例如:

  • 网页端使用 HTTP 加载页面和 JavaScript 后,通过 WebSocket 建立长连接,实时推送聊天信息、通知、股票行情等。

基于websocket之上的协议

基于 WebSocket 的协议有很多种,主要目的是在 WebSocket 基础之上实现更加规范化、结构化的消息通信,以满足不同场景的需求。

下面详细介绍常见的几种基于 WebSocket 的通信协议:

1. STOMP(Simple Text Oriented Messaging Protocol)

STOMP 是一种文本导向的简单消息传输协议,广泛应用于消息代理和实时通信领域。

特点:

  • 基于文本帧,简单易懂;
  • 支持消息订阅、广播、路由;
  • 可通过 RabbitMQ、ActiveMQ 等消息代理实现分布式消息传输;
  • 与 Spring Boot 等框架高度集成。

典型用途:

  • 即时通讯、聊天室、实时通知;
  • Spring 生态下的实时数据推送应用。

2. Socket.IO 协议

Socket.IO 是一个面向 WebSocket 和 HTTP 长轮询的实时通信库,内部定义了一套消息传输格式,用于 WebSocket 通信。

特点:

  • 自动降级机制(WebSocket、XHR长轮询、JSONP);
  • 提供房间(room)和命名空间(namespace)概念;
  • 内置心跳机制、断线重连;
  • 客户端库支持广泛(JS、Java、Python、Node.js)。

典型用途:

  • 实时聊天、互动应用;
  • 多人游戏、实时协作工具(如Figma、协作编辑)。

3. DDP(Distributed Data Protocol)

DDP 是 Meteor 框架提出的一种数据同步协议,定义了实时数据传输与远程过程调用(RPC)标准。

特点:

  • 基于 JSON 消息格式,简单高效;
  • 实现数据实时同步(客户端和服务端数据自动增量同步);
  • 支持 RPC(远程过程调用);
  • Meteor 生态默认使用,数据集合概念明确。

典型用途:

  • 实时数据更新场景,如在线仪表盘;
  • Meteor 应用开发。

4. MQTT over WebSocket 协议

MQTT 是一种面向物联网领域的轻量级发布-订阅(Pub/Sub)协议,可通过 WebSocket 实现从浏览器客户端直接访问 MQTT 服务器。

特点:

  • 非常轻量级(头部只有2字节),适合设备受限环境;
  • Pub/Sub 模式,异步消息传输;
  • QoS 质量保证机制(消息至少发送一次);
  • 广泛用于物联网设备。

典型用途:

  • 物联网设备实时数据收集;
  • 智能家居、工业监控、实时监控系统。

SpringBoot中,推荐使用的是哪种基于websocket的协议?

在 Spring Boot 应用中,推荐使用的基于 WebSocket 的协议主要有两种:

  • 标准 WebSocket 协议(JSR-356 标准实现)
  • STOMP 协议(Simple Text Oriented Messaging Protocol)

而在 Spring Boot 中,官方推荐且最常使用的是:

STOMP over WebSocket


1. 为什么 Spring Boot 推荐 STOMP over WebSocket?

Spring Boot 官方推荐使用 STOMP 的原因包括:

  • 标准化的消息结构

    • STOMP 定义了清晰的消息格式(文本消息头与负载),简化客户端和服务器的通信。
  • 高级消息特性

    • 支持订阅(Subscription)、消息广播(Broadcast)、消息路由(Routing)。
    • 可以轻松实现"一对一"、"一对多"、"多对多"的消息传递。
  • 与 Spring 生态兼容性好

    • Spring 提供了对 STOMP 的原生支持,包括安全认证、消息代理、事务管理、错误处理等。
  • 易于扩展

    • 使用消息代理(如 RabbitMQ、ActiveMQ、Kafka 等)可以轻松实现分布式消息推送。
  • 安全性与权限控制

    • 与 Spring Security 无缝集成,轻松实现权限认证与授权控制。

2. 其他协议对比(Spring Boot 中的选择建议)

协议 是否推荐 使用难度 Spring支持程度 特点
STOMP over WS 推荐 简单 非常好 易集成,消息广播、订阅路由,兼容消息代理
纯WebSocket 🔸 可用 中等 一般 原生,不提供高级功能(路由、订阅需手动实现)
Socket.IO ⚠️ 不推荐 一般 差(Spring无官方支持) 更适合 Node.js,Spring 生态不兼容
DDP ⚠️ 不推荐 困难 一般 强绑定 Meteor 框架,Spring生态不支持
SignalR ⚠️ 不推荐 一般 不支持 微软生态,非Java原生支持,需额外实现

因此,Spring Boot 中最推荐的是 STOMP over WebSocket


参考链接:

相关推荐
安全系统学习15 分钟前
【网络安全】Qt免杀样本分析
java·网络·安全·web安全·系统安全
逃逸线LOF33 分钟前
Spring Boot论文翻译防丢失 From船长&cap
网络
计算机毕设定制辅导-无忧学长1 小时前
从 AMQP 到 RabbitMQ:核心组件设计与工作原理(二)
网络·rabbitmq·ruby
midsummer_woo1 小时前
【2025年】解决Burpsuite抓不到https包的问题
网络协议·http·https
光芒Shine2 小时前
【物联网-TCP/IP】
网络·网络协议·tcp/ip
小白杨树树4 小时前
【WebSocket】SpringBoot项目中使用WebSocket
spring boot·websocket·网络协议
云计算-Security4 小时前
如何理解 IP 数据报中的 TTL?
网络协议·tcp/ip
Sherry0075 小时前
实时数据传输协议:WebSocket vs MQTT
前端·websocket
stormsha5 小时前
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
服务器·网络·网络安全·gateway
itachi-uchiha5 小时前
命令行以TLS/SSL显式加密方式访问FTP服务器
服务器·网络协议·ssl