协议 / 二进制序列化

WebSocket 帧解析看清每一帧

从帧头开始粘贴十六进制字节,可先试掩码、分片和截断示例。

WebSocket 帧解析

帧字节(十六进制)

从帧头开始:81 05 48 65 6c 6c 6f。完整字节可用空白、逗号或冒号分隔;0x 逐字节使用。

结果

输入帧字节或选择示例。

全部处理在当前浏览器标签页完成,不发送或保存输入。

选项

输入帧字节或选择示例。

抓包里看到的字节段不一定对应应用收到的一条消息。WebSocket 帧解析把每个帧头与载荷分开列出,让夹在分片之间的 ping 保持独立。排查长度计算偏差时,可以用结果中的绝对字节偏移对照原始记录,找出下一帧应从哪里开始。

WebSocket 帧解码需要的是 HTTP 升级之后、从帧头开始的原始数据。浏览器消息事件通常已经移除了帧头;直接把事件中的文本当作帧字节,会得到与真实线路无关的字段。先确认采集层级,再判断解析结果。

为什么使用 WebSocket 帧解析

连续查看多帧边界

WebSocket 帧解析按实际头部与载荷长度向后推进,每张结果卡保留原始偏移。后面的帧不完整时,前面已完成的帧仍可查看,但报告导出会禁用,避免把部分捕获误当成完整结果。

连续字节流拆成独立数据帧,两个分片之间保留一个较小的控制帧。

对照掩码前后的字节

WebSocket 掩码键有四个字节,循环作用于每个载荷位置。结果同时列出线路字节与 XOR 后的字节,每遇到新帧就从该帧密钥的首字节重新开始。去掩码只改变内容,不改变载荷长度。

四个不同颜色的掩码键字节循环作用于载荷,并生成另一行解掩码字节。

先确认采集位置,再判断解析结果

01

选择同一方向的数据

来源方向只负责检查客户端帧是否掩码、服务端帧是否未掩码。“不指定”跳过这项检查,不会自动拆分交错的双向流。请按原顺序粘贴同一方向的连续帧。

02

区分预览裁短与捕获截断

每帧仅预览前 256 字节;捕获截断则表示现有字节少于头部声明的长度。前者不影响完整报告,后者会给出偏移与缺少的数据数量,并禁用导出。两种情况不能混为一谈。

03

掌握刷新与撤销时机

默认在修改后等待 350 毫秒解析,关闭自动开关后出现解析按钮,也可按 Ctrl/Cmd+Enter。修改输入或方向后旧结果立即过期。示例和清空先预览替换数量,应用后可撤销并恢复输入与结果。

从头部字段追到载荷内容

读取三种长度形式

头部的短长度直接表示字节数;126 和 127 则转向后续扩展字段。WebSocket 有效载荷长度按网络字节序读取,超大声明先用精确整数判断上限,不按声明值直接分配内存。非最短编码会保留并提示。

识别控制帧

关闭、ping 和 pong 单独列出。关闭载荷的前两字节作为状态码,其后作为 UTF-8 原因;控制帧被分片、载荷过长或状态码异常都会显示警告。读出关闭帧并不能证明双方完成了关闭握手。

谨慎解释文本

独立完整文本帧使用严格 UTF-8 检查。二进制帧即使有可读预览,也仍然是二进制帧。显示边界切到半个字符时不会制造乱码;分片或扩展载荷不冒充完整文本,也不把单个分片的半字符误报为消息损坏。

保留故障位置

头部、扩展长度、掩码键或载荷不足会停止解析,并显示从零开始的字节偏移及从一开始的输入行列。保留 opcode 或 RSV 非零等异常仍可展示已知边界,便于检查原始证据。

支持的输入与明确边界

只接受帧字节
支持连续偶数位十六进制,也支持空白、逗号或冒号分隔的完整字节;0x 只能修饰一个字节。不接受 Base64、位串、文件导入或带地址列的完整 hexdump,请先移除外层格式。
提示分片,不拼接消息
WebSocket 分片会标明开始、继续、结束、缺少首片和未结束状态。中间控制帧不改变活动分片。工具不拼接载荷,也不跨分片验证 UTF-8,所以解析完成不等于消息完整有效。
不猜扩展或应用协议
只报告 RSV 标志,不推断协商了哪种扩展;不解压 permessage-deflate,不解密 TLS,也不自动识别 JSON、Socket.IO、Protobuf 或 MessagePack。掩码是可逆异或,不是保密加密。
资源与显示上限
输入最多 1 MiB 解码字节、6 MiB 字符和 1000 帧,单帧声明载荷也不能超过 1 MiB。结果每批展示 50 帧。JSON 报告包含限制内的完整载荷十六进制与可用文本,不受 256 字节预览限制。
异常不自动修复
协议警告保留原数据并允许导出;结构错误禁用报告导出。关闭码按基础协议与已知范围检查,不证明应用已注册该码,也不确认关闭握手完成。工具不会改写长度、掩码或操作码。

WebSocket 帧解析常见问题

为什么客户端的载荷需要掩码?

客户端使用四字节随机键改变线路上的载荷,避免可控字节误导中间设备。对载荷再次执行相同的循环异或即可还原。密钥就在帧中,因此它不提供保密性;基础协议要求服务端发出的帧不带掩码。

载荷长度字段中的 126 和 127 表示什么?

126 和 127 是长度形式的标记,不是实际载荷字节数。前者读取后续两字节,后者读取后续八字节,均为大端序。八字节长度的最高位必须为零。实际载荷长度不包含帧头,也不包含四字节掩码键。

可以一次粘贴多个帧吗?

可以。请粘贴同一方向、按线路顺序排列的连续帧。解析器按每帧的声明长度推进,保留空载荷和中间控制帧。遇到不完整帧时,需要补全或修正捕获数据后才能导出完整报告。

关闭帧会如何解析?

空载荷表示没有状态码;非空时,前两字节为状态码,余下内容为 UTF-8 关闭原因。只有一个字节、使用禁止在线路发送的状态码或原因编码无效,都会提示。空关闭帧不会被擅自填成正常关闭。

这个工具能解码 WebSocket 的 HTTP 握手吗?

不支持。HTTP Upgrade 请求与响应属于帧格式之前的握手阶段。请先提取升级之后的原始帧字节。本页不剥离 TCP/IP 或 TLS 头部,不建立连接,也不校验服务端握手。

发现计算或校验问题?

回到原始帧字节

用 WebSocket 帧解析对照偏移、掩码键和第一处截断,再决定是否需要修改应用里的协议解析器。