websocket 消息包粗解

最近在搞websocket解析,记录一下:
原始字符串

在这里插入图片描述

�~�{"t":"d","d":{"b":{"p":"comds/comdssqmosm7k","d":{"comdss":{"cmdn":"success","cmdv":"success","cmdvar":"success","rndm":"success"}}},"a":"d"}}�+{"t":"d","d":{"r":9,"b":{"s":"ok","d":{}}}}

转成字节
在这里插入图片描述

这里重点讲一下字节的前几位,也就是字符串乱码的部分
129 126 0 142

首先我们先看下定义

1.FIN(1 bit): 表示消息是否已经完成。如果是 1,表示这是消息的最后一个帧;如果是 0,表示后面还有帧。

2.RSV1, RSV2, RSV3(各占 1 bit): 这三个标志位一般用于扩展协议或自定义协议的使用。在通常情况下,它们都是 0。

3.Opcode(4 bit): 表示帧的类型,例如,Text Frame、Binary Frame 等。常见的值有:

0x1 表示 Text Frame
0x2 表示 Binary Frame
0x8 表示 Connection Close Frame
0x9 表示 Ping Frame
0xA 表示 Pong Frame

4.Mask(1 bit): 表示是否使用掩码。WebSocket 客户端发送给服务器的消息需要进行掩码处理,而服务器发送给客户端的消息则不需要。

5.Payload Length(7 bit 或 7+16 bit 或 7+64 bit): 表示消息负载的长度。如果长度小于等于 125 字节,则使用 7 位来表示。如果长度在 126 到 65535 之间,则使用 7 位加上 16 位来表示。如果长度大于 65535,则使用 7 位加上 64 位来表示。

6.Masking Key(0 或 4 个字节): 只有在 Mask 标志位被设置为 1 时才会有这个字段。它用于对负载进行异或运算,确保数据在传输过程中不容易被篡改。

7.Payload Data: 消息的实际数据。如果设置了 Mask 标志位,需要对 Payload Data 进行掩码处理。

开始分析过程

129 转成二进制是 10000001

第一位是FIN,这里的fin是1表示这是消息的最后一个帧。

第二,三,四位是RSV1, RSV2, RSV3,这里是000,表示没有扩展协议或自定义协议

后四位是Opcode(4 bit),这里是0001,表示是 Text Frame,即带有文本数据的帧(0x1其实就是16进制的1)

前八位就分析完了,得出结论这个websocket消息是文本类型,是最后一帧,且没有没有扩展协议或自定义协议,

然后是126转成二进制是01111111
第一位是Mask,这里是0,表示没有使用掩码
后7位表示数据长度,这里是11111111,看说明,那么表示数据长度超过了125位,具体长度就要看后面的数据了。再次说明一下,这里的规则是如果长度小于等于 125 字节,则使用 7 位来表示。如果长度在 126 到 65535 之间,则使用 7 位加上 16 位来表示。如果长度大于 65535,则使用 7 位加上 64 位来表示。

接下来是 0 142 转成二进制就是00000000 10001110
从这里可以看出长度只有16位,数据长度即为142.
然后再后面的就是具体的数据了。

差不多这样就能够理解了。

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

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

相关文章

Linux:docker的数据管理(6)

数据管理操作*方便查看容器内产生的数据 *多容器间实现数据共享 两种管理方式数据卷 数据卷容器 1.数据卷 数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数…

Ubuntu镜像与K8S冲突,容器持续Terminating

问题 记录一次软件冲突BUG: eclipse-temurin:11-jdk(底层Ubuntu 20.04.3 LTS)镜像创建的容器在K8S-1.25.5上无法正常terminating,造成资源浪费,甚至引发K8S资源CPU insufficient报错。具体表现 某些容器镜像在K8S上无…

Python手写数字识别

程序示例精选 Python手写数字识别 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《Python手写数字识别》编写代码,代码整洁,规则,易读。 学习与应用推荐首…

第5章 线程级并行 摘录

5.1 引言 在微处理器发展的推动下,单处理器性能的增长速度在1986年到2003年期间达到高峰。 由于利用ILP的收益越来越少,单处理器的性能增长开始放缓,再加上对功耗的日益关注,计算机体系结构进入了一个新时代。多处理器在从低端到…

MySQL官网推荐书籍

MySQL官网推荐书籍 图片有防盗链csdn转存失败。有图版传送门MySQL官网推荐书籍 高效的MySQL性能:Daniel Nichter的最佳实践和技术 Daniel Nichter 向您展示了如何应用直接影响 MySQL 性能的最佳实践和技术。您将学习如何通过分析查询执行、为常见 SQL 子句和表联接…

[论文阅读]VoxSet——Voxel Set Transformer

VoxSet Voxel Set Transformer: A Set-to-Set Approach to 3D Object Detection from Point Clouds 论文网址:VoxSet 论文代码:VoxSet 简读论文 这篇论文提出了一个称为Voxel Set Transformer(VoxSeT)的3D目标检测模型,主要有以下几个亮点: 提出了基于…

传统算法: Pygame 实现深度优先搜索(DFS)

使用 Pygame 模块实现了深度优先搜索(DFS)的动画演示。首先,它通过邻接矩阵表示了一个图的结构,其中每个节点表示一个字符,每个字符的邻居表示与之相邻的节点。然后,通过深度优先搜索算法递归地访问所有节点,过程中通过动画效果可视化每一步的变化。每次访问一个节点,该…

leetcode-206-反转链表(C语言实现)

题目: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示例 3&…

hash_hmac函数讲解

hash_hmac函数的概述 PHP中的hash_hmac函数是一种基于加密哈希算法的函数,用于计算消息的哈希值。它返回一个哈希值字符串,并且可以用于验证消息的完整性和认证。 哈希是一种将任意长度的消息映射到固定长度的值的算法。哈希函数可以将任意大小的数据转…

Windows系列:Windows的13个版本以及 Windows Server详解(配置)

Windows的13个版本以及 Windows Server详解(配置) 一. Windows的13个版本的区别,企业版、教育版、专业版、工作站版、SE版的主要区别家庭版专业版教育版企业版Servers版 二. Windows Server VS Windows,两者有啥区别?什…

计算机服务器中了_locked勒索病毒如何处理,_locked勒索病毒解密数据恢复

网络技术的不断发展,给企业的生产生活提供了极大便利,越来越多的企业走向数字化办公时代,但网络的发展也为网络安全埋下隐患,网络安全威胁不断增加。近期,云天数据恢复中心陆续接到很多企业的求助,企业的计…

基于Python Flask 的全流程全栈项目自己的实战心得

我基于Python Flask框架开发全流程全栈项目的实战经验和心得。我将介绍整个项目的架构设计、前后端交互、数据库管理以及部署等方面,并提供具体的代码示例。通过这个实例项目,你将学习到如何使用Flask构建一个完整的Web应用,并了解一些常见的…