当前位置: 首页 > news >正文

浅谈WebSocket

浅谈WebSocket

在我们日常访问一些网站的时候,我们会点击某个页面,或是点击某个板块,才出现对应的信息。

但是后端有数据更新了,我们需要查看实时的数据的话,此时,需要刷新操作,来重新获取后端返回的数据。

一些普通的网站还好,像一些实时性较强的,比如一些网页游戏、股票网站之类的,难道我们想获取数据,就一直刷新页面吗?显然是不适合的!所以为了解决这个问题,WebSocket协议应运而生。

什么是WebSocket协议?

WebSocket是一种在单个TCP连接上进行全双工通信的协议,它由HTML5规范定义,允许客户端和服务器之间

进行双向、实时、低延迟的数据交换。

与传统的HTTP不同,HTTP是客户端发出请求,服务端做出相应,一问一答是形式,而WebSocket在建立连接后,客户端和服务器可以任意时刻互相发送数据,而无需重复建立连接,极大程度下,减少了通信开销。

那么要是WebSocket没有出现之前,没有办法实现实时通信了吗?

显然不是,还是有一些办法的,比如:
1.轮询(polling):客户端定时发送服务器发送请求,询问是否有新数据

2.长轮询(Long polling):客户端发送请求后,服务端保持长时间连接直到有新数据或是连接超时

3.SSE(Server-Sent-Events):服务器主动单向发送数据到客户端,但仅支持文本

WebSocket的连接建立:握手过程

WebSocket连接建立始于一个HTTP升级请求,这个过程称之为"握手"。

1.客户端发起请求

客户端通过HTTP发送一个包含特殊请求头信息的请求

举例:

Java
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Origin: http://example.com

Upgrade :  websocket:表示希望升级到WebSocket协议

Connection  : Upgrade:表示当前连接需要升级

Sec-WebSocket-Key:客户端随机生成的Base64的编码字符串,用于安全验证

Sec-WebSocket-Version:表示WebSocket当前的版本

Origin:请求来源

2.服务端响应握手

如若,服务端支持WebSocket,会返回一个101状态码

Java
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

其中的Sec-WebSocket-Accept 是服务器根据客户端的Sec-WebSocket-Key计算得出来的值

计算方式为:

  1. Sec-WebSocket-Key 与某一固定字符串 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接。
  1. 对拼接结果进行 SHA-1 哈希。
  1. 将哈希结果进行 Base64 编码。

握手成功后,TCP连接将不再传输HTTP数据,而是进入WebSocket通信模式。

WebSocket的报文格式

WebSocket数据以“帧”(Frame)形式传输,一个消息可以由多个帧组成,每个帧都有固定的二进制结构

如图所示:

图片来源:https://www.timefly.cn/learn-websocket-protocol-2/

字段解释:

字段

长度

说明

FIN

1bit

是否是消息的最后一个帧。1表示完整消息或是最后一片

RSV1/2/3

1bit

扩展保留位

Opcode

4bits

操作码,定义帧类型:• 0x0:延续帧(Continuation)• 0x1:文本帧(UTF-8 编码)• 0x2:二进制帧• 0x8:关闭连接(Close)• 0x9:Ping • 0xA:Pong

MASK

4bit

是否启用掩码,此时客户端发送的帧必须为1,服务器发送的帧为0

PayLoad Length

7bit

有效载荷长度: 0–125:直接表示  126:后接 2 字节(16 位) 127:后接 8 字节(64 位)长度

Extended payLoad length

0/2/8

bytes

根据PayLoad len 决定是否出现

Masking-key

4bytes

当Mask=1时存在,用于XOR解码 payload Data

Payload Data

变长

实际数据内容

既然WebSocket是一个长连接,需要网络一直保持畅通状态,但网络状态变化又有多种原因。那么又是如何检测连接是否存活呢?

Ping/Pong 心跳机制:保持连接活跃

大致工作原理:

1.任意一方(通常是服务器)可以发送一个Ping帧(Opcode=0x9)

2.接收方必须立即回复一个Pong帧(Opcode=OxA),内容与Ping帧相同。

3.如若长时间没有收到Pong,可以认为连接已经断开

消息分片

传输的数据过多的话,可以拆分为多个帧进行传输

第一帧:FIN=0,Opcode=0x1 或0x2

中间帧:FIN=0,Opcode=0x0(延续帧)

最后一帧:FIN=1,Opcode=0x0

这也允许流式传输大文件和音视频教程

连接关闭流程

关闭连接通过Close帧(Opcode=0x8)完成

一方发送close帧(可带状态码和原因)

另一方收到后应答close帧

双方关闭TCP连接

常见状态码:

  • 1000:正常关闭
  • 1001:服务端重启
  • 1003:不支持的数据类型
  • 1007:无效数据(如非 UTF-8)
  • 1011:服务器内部错误

Websocket典型应用场景

  •  实时聊天室 / IM 系统
  •  股票/加密货币行情推送
  •  多人在线游戏
  •  实时数据监控与可视化
  •  协同编辑(如 Google Docs、飞书)
  •  IoT 设备远程控制
  •  实时通知系统
http://www.dtcms.com/a/426891.html

相关文章:

  • 做网站背景wordpress登录样式
  • 自动化通信谜团:耐达讯自动化Modbus RTU如何变身 Profibus连接触摸屏
  • 调节阀控制的“语言障碍“:耐达讯自动化一招破解,让Modbus RTU变身Profibus!
  • LE AUDIO之助听器Hearing Access Profile
  • 提升学习自主性:听写自动化对儿童习惯养成的技术支持
  • MySql的存储过程以及JDBC实战
  • 中国电建地产北京山谷:以“三好”战略绘就文旅康养与乡村振兴融合新图景
  • 中国网站建设中心做旅游网站公司
  • 【PyCharm】远程本地的WSL2如何配置copilot的Tab不冲突
  • 49.多路转接epoll
  • flash网站源码下载北京网站建设案例
  • 景德镇做网站代理游戏平台赚钱吗
  • 开源AI大模型、AI智能名片与S2B2C商城小程序:用户需求满足的底层逻辑与实践路径
  • Git 命令配置别名、Git命令缩写(Mac版)
  • 部署Tomcat11.0.11(Kylinv10sp3、Ubuntu2204、Rocky9.3)
  • SCL-90症状自评量表抖音快手微信小程序看广告流量主开源
  • 合肥网站公司微信商城开发需要多少钱
  • 企业在拥抱 Al技术过程中面临安全风险是什么
  • Claude Sonnet 4.5:一次面向落地的常规升级(性能、安全、开发者工具)
  • Linux内核命名空间隔离机制在容器安全强化中的实战应用标准
  • 灵雀云六度入选 Gartner 中国 ICT 技术成熟度曲线报告,ACP以安全、稳定、智能三大核心能力定义企业级云原生数字底座
  • 中文的网站做不成二维码记事本做网站怎么改字体颜色
  • 近场通讯(NFC)在工厂智能化中的应用:从工具管理到身份识别
  • 计算机网络-RIP协议
  • Cortex-M3深入理解
  • python进阶_Day2
  • Python14-SVM⽀持向量机
  • 无锡做网站价格手机网站排名怎么做
  • 大模型价格战背后的技术革命:剖析DeepSeek-V3.2的DSA稀疏注意力
  • 用 AI 驱动 Unity 开发:Unity3d MCP