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

Websocket帧

在浏览器升级为websocket协议,数据的传输就会开始传输websocket帧

第一个字节:

2

FIN:1或0,1代表最后分片,0代表后面还有

rsv1/2/3:扩展保留位,必须为0,除非协商了扩展。

Opcode:操作码,例如:0x0– 继续帧 ,0x1– 文本帧

第2个字节

MASK:负载数据是否掩码,0代表无,1代表有,客户端到服务端一定要掩码,服务端到客户端一定不需要

Payload length:1.负载数据长度(1-125),直接将长度存在这里 2.负载数据长度(126-65535),存126 3.负载数据大于65535,存127

Payload length根据Payload length的不同取值来决定大小

Payload length为126时,16bit(2字节)

Payload length为127时,64bit(8字节)

当为其他值,0bit

Masking-key根据MASK的值决定是否存在

这里存放了4个字节码,后面的数据需要通过这个码来解码

浏览器发送数据的时候会使用这个4个字节码,对数据进行一次异或操作,在服务端需要对数据在进行一次异或操作,就会还原数据

后面就是数据实际存储位置了

以下是我的python代码模拟

def websockencode(self,mes): date=bytes([0b10000001,len(mes)]) date+=mes.encode() return date def websockdecode(self,data): if not(data[0]>>7)&1:return mask=(data[1]>>7)&1 l=data[1]&0b01111111 head_len=2 if l<126: lens=l elif l==126: bt=data[2:4] head_len=4 lens=bt[0]*256+bt[1] elif l==127: lens=0 j=1 for i in range(9,1,-1): lens+=data[i]*j j*=256 head_len=10 maskdata=data[head_len:head_len+4] head_len+=4 mes=data[head_len:head_len+lens] return bytes([mes[i]^maskdata[i%4] for i in range(len(mes))]) def first_link_res(self,date): httplines=date.split("\r\n") KEY="" for i in httplines: if i.startswith("Sec-WebSocket-Key"): KEY=i.split(": ")[1] print(KEY) acc=base64.b64encode(hashlib.sha1((KEY+self.WEBSOCKKEY).encode()).digest()) response = ( "HTTP/1.1 101 Switching Protocols\r\n" "Upgrade: websocket\r\n" "Connection: Upgrade\r\n" f"Sec-WebSocket-Accept: {acc.decode()}\r\n" "\r\n" ) return response

最后是完整图片

http://www.jsqmd.com/news/765691/

相关文章:

  • 22_AIGC从一句创意到女宇航员定稿,AI全流程实操
  • 保姆级教程:在ROS Melodic下用realsense-ros库同时驱动4个D435i相机(含USB端口冲突排查)
  • STM32非阻塞DS18B20驱动:状态机+FreeRTOS实现高效温度采集
  • 跟着 MDN 学 HTML day_20:(Web 媒体容器格式完全指南)
  • 2026届必备的六大AI论文网站实测分析
  • Windows系统thumbcache.dll文件丢失无法启动程序解决
  • 【金融机构内部禁传】R VaR计算黑盒揭秘:如何用quantmod+rugarch+PerformanceAnalytics构建通过银保监现场检查的VaR系统
  • 别再死记硬背状态转移方程了!用‘数字三角形’这道题,5分钟带你彻底搞懂动态规划的自底向上思想
  • 别再让DC/PT默认0延时坑了你!手把手教你用set_drive命令精确建模输入驱动
  • 三步快速备份QQ空间历史说说:GetQzonehistory零配置解决方案
  • 深度学习如何入门?
  • RAG 一接特性开关文档就开始答错默认值:从 Flag Snapshot 到 Variant-Aware Retrieval 的工程实战
  • 跟着 MDN 学 HTML day_21:(Web 视频编解码器完全指南)
  • Spotify下载器终极指南:快速免费下载Spotify音乐并保存完整元数据
  • 终极指南:如何用OpenCore Legacy Patcher让旧款Mac免费运行最新macOS系统
  • 5分钟快速上手:国家中小学智慧教育平台电子课本下载工具完整指南
  • 如何3分钟掌握缠论可视化:面向交易者的通达信插件终极指南
  • 从零开始的多线程生活
  • 告别模拟器:实战派教你用真机+BurpSuite高效抓包安卓App(附最新绕过证书锁定技巧)
  • 3步完全掌控Alienware灯光与风扇:告别AWCC臃肿软件的高效方案
  • 初阶模板(C++)
  • 3个必学Xournal++数字笔记技巧:从PDF批注到专业绘图
  • 别再只盯着阻抗了!FR4板材的损耗角正切(Df)如何悄悄吃掉你的高速信号?
  • ColabFold:让蛋白质结构预测变得简单高效的神器
  • 手把手教你用Simulink搞定Boost PFC电流环:从扫频到PI参数整定(附避坑指南)
  • 独立开发者如何通过Taotoken管理多个项目的AI密钥与权限
  • WHEELTEC N100 AHRS模块调平校准避坑指南:告别姿态角漂移与数据偏差
  • GetQzonehistory:一站式自动化备份QQ空间历史说说的智能开源工具
  • todg6.ocx文件丢失无法启动程序解决
  • 从用量看板观测API调用延迟与token消耗的日常波动