WebSocket 协议介绍

前言

一.通用协议设计

参考链接

/*
+---------------------------------------------------------------+
| 魔数 2byte | 协议版本号 1byte | 序列化算法 1byte | 报文类型 1byte  |
+---------------------------------------------------------------+
| 状态 1byte |        保留字段 4byte     |      数据长度 4byte     | 
+---------------------------------------------------------------+
|                   数据内容 (长度不定)          | 校验字段 2byte |
+---------------------------------------------------------------+
*/

待补充

正文

二.WebSocket 协议

2.1 基础数据帧

WebSocket数据帧

术语说明大小
FIN如果是 1,表示这是消息(message)的最后一个分片(fragment);如果是 0,表示不是是消息(message)的最后一个分片(fragment)1bit
RSV1, RSV2, RSV3一般情况下全为 0。当客户端、服务端协商采用 WebSocket 扩展时,这三个标志位可以非 0,且值的含义由扩展进行定义。如果出现非零的值,且并没有采用 WebSocket 扩展,连接出错每个1 bit
Opcode操作代码,Opcode 的值决定了应该如何解析后续的数据载荷(data payload)。如果操作代码是不认识的,那么接收端应该断开连接(fail the connection)4 bits
Mask表示是否要对数据载荷进行掩码操作。
从客户端向服务端发送数据时,需要对数据进行掩码操作;从服务端向客户端发送数据时,不需要对数据进行掩码操作。
如果服务端接收到的数据没有进行过掩码操作,服务端需要断开连接。
如果 Mask 是 1,那么在 Masking-key 中会定义一个掩码键(masking key),并用这个掩码键来对数据载荷进行反掩码。所有客户端发送到服务端的数据帧,Mask 都是 1。
1bit
Payload length数据载荷的长度,单位是字节。假设数 Payload length === x,如果:
x 为 0~126:数据的长度为 x 字节。
x 为 126:后续 2 个字节代表一个 16 位的无符号整数,该无符号整数的值为数据的长度。
x 为 127:后续 8 个字节代表一个 64 位的无符号整数(最高位为 0),该无符号整数的值为数据的长度。
此外,如果 payload length 占用了多个字节的话,payload length 的二进制表达采用网络序(big endian,重要的位在前)。
7 bits, 7+16 bits, 或者 7+64 bits
Masking-key所有从客户端传送到服务端的数据帧,数据载荷都进行了掩码操作,Mask 为 1,且携带了 4 字节的 Masking-key。如果 Mask 为 0,则没有 Masking-key。
备注:载荷数据的长度,不包括 mask key 的长度。
0 or 4 bytes
Payload data“负载数据”定义为“扩展数据”连接“应用数据”。
-Extension data: x byte
“扩展数据”是 0 字节除非已经协商了一个扩展。任何扩展必须指定“扩展数据”的长度,或长度是如何计算的,以及扩展如何使用必须在打开阶段握手期间协商。如果存在,“扩展数据”包含在总负载长度中。
- Application data: y bytes
任意的“应用数据”,占用“扩展数据”之后帧的剩余部分。“应用数据”的长度等于负载长度减去“扩展数据”长度。
(x+y) bytes

Opcode:

  • %x0 代表一个继续帧
  • %x1 代表一个文本帧
  • %x2 代表一个二进制帧
  • %x3-7 保留用于未来的非控制帧
  • %x8 代表连接关闭
  • %x9 代表 ping
  • %xA 代表 pong
  • %xB-F 保留用于未来的控制帧
2.2 数据帧另外一种表达方式
    ws-frame                = frame-fin           ; 1 bit in lengthframe-rsv1          ; 1 bit in lengthframe-rsv2          ; 1 bit in lengthframe-rsv3          ; 1 bit in lengthframe-opcode        ; 4 bits in lengthframe-masked        ; 1 bit in lengthframe-payload-length   ; either 7, 7+16,; or 7+64 bits in; length[ frame-masking-key ]  ; 32 bits in lengthframe-payload-data     ; n*8 bits in; length, where; n >= 0frame-fin               = %x0 ; more frames of this message follow/ %x1 ; final frame of this message; 1 bit in lengthframe-rsv1              = %x0 / %x1; 1 bit in length, MUST be 0 unless; negotiated otherwiseframe-rsv2              = %x0 / %x1; 1 bit in length, MUST be 0 unless; negotiated otherwiseframe-rsv3              = %x0 / %x1; 1 bit in length, MUST be 0 unless; negotiated otherwiseframe-opcode            = frame-opcode-non-control /frame-opcode-control /frame-opcode-contframe-opcode-cont       = %x0 ; frame continuationframe-opcode-non-control= %x1 ; text frame/ %x2 ; binary frame/ %x3-7; 4 bits in length,; reserved for further non-control framesframe-opcode-control    = %x8 ; connection close/ %x9 ; ping/ %xA ; pong/ %xB-F ; reserved for further control; frames; 4 bits in lengthframe-masked            = %x0; frame is not masked, no frame-masking-key/ %x1; frame is masked, frame-masking-key present; 1 bit in lengthframe-payload-length    = ( %x00-7D )/ ( %x7E frame-payload-length-16 )/ ( %x7F frame-payload-length-63 ); 7, 7+16, or 7+64 bits in length,; respectivelyframe-payload-length-16 = %x0000-FFFF ; 16 bits in lengthframe-payload-length-63 = %x0000000000000000-7FFFFFFFFFFFFFFF; 64 bits in lengthframe-masking-key       = 4( %x00-FF ); present only if frame-masked is 1; 32 bits in lengthframe-payload-data      = (frame-masked-extension-dataframe-masked-application-data); when frame-masked is 1/ (frame-unmasked-extension-dataframe-unmasked-application-data); when frame-masked is 0frame-masked-extension-data     = *( %x00-FF ); reserved for future extensibility; n*8 bits in length, where n >= 0frame-masked-application-data   = *( %x00-FF ); n*8 bits in length, where n >= 0frame-unmasked-extension-data   = *( %x00-FF ); reserved for future extensibility; n*8 bits in length, where n >= 0frame-unmasked-application-data = *( %x00-FF ); n*8 bits in length, where n >= 0
2.3 WebSocket掩码的作用

WebSocket的掩码算法是一种数据加密方法,‌用于保护数据传输的安全性。‌这种算法通过异或运算对数据进行处理,‌以防止早期版本的协议中存在的代理缓存污染攻击等问题。‌具体来说,‌掩码算法的实现过程如下:‌

  1. 掩码的作用:‌掩码算法并不是为了防止数据泄密,‌而是为了防止代理缓存污染攻击等问题。‌它通过对数据进行异或运算,‌使得原始数据在传输过程中被改变,‌只有在接收端使用相同的掩码进行反向操作,‌才能还原出原始数据。‌

  2. 算法描述:‌对于每个需要发送的字节,‌它通过与掩码密钥进行异或运算来生成传输的数据。‌具体来说,‌对于原始数据中的每个字节original-octet-i,‌它首先计算j = i MOD 4来获取掩码密钥中的对应字节masking-key-octet-j,为mask key第j个字节。‌然后,‌将original-octet-i与masking-key-octet-j进行异或运算,‌得到的结果即为传输的数据
    即:j = i MOD 4
    transformed-octet-i = original-octet-i XOR masking-key-octet-j。‌

void umask(char *payload, int len, char *mask)
{int i = 0;for (i = 0; i < len; i++){payload[i] ^= mask[i % 4];}
}
  1. 示例:‌以客户端发送语音文件到服务端的场景为例,‌客户端首先发送txt消息文件名称,‌然后再发送bin消息二进制流数据。‌在这个过程中,‌客户端对需要发送的字符与掩码进行异或运算,‌生成用于网络传输的数据。‌例如,‌字符’t’的ASCII值为116,‌与掩码14进行异或运算后,‌得到的结果用于传输。‌

待补充

2.4 分片(Fragmentation)
2.5 控制帧
2.5.1 Close
2.5.2 Ping
2.5.3 Pong
2.6 数据帧(payload)

三、私有协议示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/391108.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从0开始搭建vue + flask 旅游景点数据分析系统( 六):搭建后端flask框架

这一期开始开发header部分&#xff0c;预期实现两个目标&#xff1a; 创建 Flask 项目导入旅游数据后端实现旅游数据的查询 1 python 环境 & 开发环境 python 安装和pycharm安装需要去网上找包&#xff0c;建议python使用3.8 或者3.9版本 2 新建项目 我们新建一个文件…

还没排上 SearchGPT ?比 Perplexity 更好用的国产开源平替了解一下?

有 AI 在的科技圈,似乎没有中场休息。除了大模型发布不断,各家科技大厂也在寻找着第一个「杀手级」AI 应用的落脚之地。 OpenAI 首先瞄准的是谷歌 1750 亿美元的搜索业务市场。7 月 25 日,OpenAI 带着 AI 搜索引擎——SearchGPT 高调入场。在演示 demo 中,搜索引擎的使用体…

贪吃蛇(使用QT)

贪吃蛇小游戏 一.项目介绍**[贪吃蛇项目地址](https://gitee.com/strandingzy/QT/tree/zyy/snake)**界面一&#xff1a;游戏大厅界面二&#xff1a;关卡选择界面界面三&#xff1a;游戏界面 二.项目实现2.1 游戏大厅2.2关卡选择界面2.3 游戏房间2.3.1 封装贪吃蛇数据结构2.3.2 …

【CTFWP】ctfshow-web40

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 题目介绍&#xff1a;题目分析&#xff1a;payload&#xff1a;payload解释&#xff1a;payload2&#xff1a;payload2解释&#xff1a;flag 题目介绍&#xff1a; …

第一阶段面试问题(后半部分)

1. c语言中const *p的用法 &#xff08;1&#xff09;const int *p; 或 int const *p; 指向常量整数的指针&#xff0c;通过这个指针不能修改它所指向的整数值&#xff0c;但可以修改指针本身来指向其他地址 const int a 10; const int *p &a; // *p 20; // 错误&…

vector中 resize()和reserve()

1.resize()改变容器大小 resize除了预留内存以外&#xff0c;还会调用容器元素的构造函数&#xff0c;不仅分配了N个对象的内存&#xff0c;还会构造N个对象。从这个层面上来说&#xff0c;resize()在时间效率上是比reserve()低的。 2.reserve()容器大小管理 用于预留内存。 …

Flask目录结构路由重定向简单实例讲解——轻量级的 Python Web 框架

假设一个flask目录结构如下&#xff1a; my_flask_app/ │ ├── app.py ├── routes/ │ ├── __init__.py │ ├── ZhejiangProvince/ │ │ ├── __init__.py │ │ ├── la.py │ │ └── el.py │ ├── GuangdongProvince/ │ │ ├…

C语言项目实战FTP文件传输(windows网络编程基础)

文章目录 前言一、客户端和服务端介绍二、客户端和服务器之间进行通信的过程客户端和服务器建立通信的流程通信过程的示例图流程说明 三、客户端代码编写代码解释 四、服务端代码编写代码解释 总结 前言 本篇文章开始将带大家来学习FTP文件传输助手的项目实现&#xff0c;这个…

【单片机毕业设计选题24099】-室内空气质量检测及净化系统

系统功能: 系统上电后OLED显示“欢迎使用请稍后”两秒后进入正常界面显示&#xff0c; 第一行显示温湿度和MQ2值 第二行显示采集到的甲醛值 第三行显示采集到的PM2.5值 第四行显示设定的PM2.5值 短按B4按键增加PM2.5设定阈值 短按B5按键减小PM2.5设定阈值 如果PM2.5采集…

达梦数据库dsc集群动态添加节点

前提条件&#xff1a;在安装好的的dsc集群&#xff1a;达梦数据库dsc集群保姆级部署文档_达梦数据库文档-CSDN博客上动态添加节点 1、环境信息 扩展节点信息&#xff1a; 操作环境&#xff1a;VMware Workstation 16 Pro dmdsc集群 机器ip 主机名 操作系统 资源配置 实…

【传知代码】基于标签相关性的多标签学习(论文复现)

在当今信息爆炸的时代&#xff0c;数据中包含的标签信息对于理解和分析复杂问题至关重要。在诸如文本分类、图像识别和推荐系统等应用中&#xff0c;如何有效地利用标签相关性提升多标签学习的效果成为了研究的热点之一。基于标签相关性的多标签学习方法&#xff0c;通过挖掘不…

JAVA项目基于SpringBoot的外卖点餐管理系统

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着生活节…

Flink笔记整理(六)

Flink笔记整理&#xff08;六&#xff09; 完整系列在公众号&#xff1a;是十三不是四十三&#xff0c;欢迎关注~ 文章目录 Flink笔记整理&#xff08;六&#xff09;八、状态管理8.1 Flink中的状态概述状态的分类 8.2 按键分区状态&#xff08;Keyed State&#xff09;值状态…

Windows 添加自定义服务实现开机(用户登录之前)自动运行 Python 脚本

实现效果 使用 Python 编写的一个脚本, 希望在 Windows 系统启动时, 用户登录之前就自动运行. 准备工作 首先确保 Python 脚本可以手动正常运行, 演示起见, 编写下面的一个简单的脚本用于在 C 盘根目录中生成一个包含脚本运行时间戳的文本文件. Python 脚本存放在 C:\Python…

python爬虫实践

两个python程序的小实验&#xff08;附带源码&#xff09; 题目1 爬取http://www.gaosan.com/gaokao/196075.html 中国大学排名&#xff0c;并输出。提示&#xff1a;使用requests库获取页面的基本操作获取该页面&#xff0c;运用BeautifulSoup解析该页面绑定对象soup&#x…

搭建jenkins一键部署java项目

一、搭建jenkins 链接: https://pan.baidu.com/s/1jzx15PiyI8EhLd_vg7q8bw 提取码: ydhl 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 直接使用docker导入镜像&#xff0c;运行就好 docker run -di --name jenkins -p 8080:8080 -v /home/jenkins_home:/var/je…

【人工智能】NLP入门指南:自然语言处理基础全解析

文章目录 前言一、NLPNLP&#xff08;自然语言处理&#xff09;NLU&#xff08;自然语言理解&#xff09;NLG&#xff08;自然语言生成&#xff09; 二、分词1.什么是分词2.常见的分词工具3.jieba分词 三、词向量1.什么是词向量2.文本张量表示方法3.常见的词向量模型3.1 ont-ho…

15.4 zookeeper java client之Curator使用(❤❤❤❤❤)

Curator使用 1. 为什么使用Curator对比Zookeeper原生2. 集成Curator2.1 依赖引入curator-frameworkcurator-recipes2.2 `yml`配置连接信息2.3 CuratorConfig配置类2.4 Curator实现Zookeeper分布式锁业务2.4.1 业务:可重入锁和不可重入锁可重入锁和不可重入锁InterProcessMutex …

scratch魔法门 2024年6月scratch四级 中国电子学会图形化编程 少儿编程等级考试四级真题和答案解析

目录 scratch魔法门 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、pyt…

基于JAVA的美甲店员工管理系统,源码、部署+讲解

摘 要 随着社会科技的飞速发展和进步&#xff0c;网络技术的应用已经深入到生活的方方面面。在这样的背景下&#xff0c;企事业单位的绩效考评体系也受到了极大的影响和冲击。传统的绩效考评方式已经无法满足现代社会的高效需求&#xff0c;因此&#xff0c;研发一款智能化、高…