Skip to main content

3.1.2. Skippable Frames (可跳过帧)

+==============+============+===========+
| Magic_Number | Frame_Size | User_Data |
+==============+============+===========+
| 4 bytes | 4 bytes | n bytes |
+--------------+------------+-----------+

表 19: 可跳过帧

可跳过帧允许将用户定义的元数据插入到连接帧的流中。

此规范中定义的可跳过帧与 [LZ4] 中的可跳过帧兼容。

从兼容解码器的角度来看,可跳过帧只需要被跳过,其内容被忽略,在可跳过帧之后恢复解码。

应该注意的是,可跳过帧可用于给连接帧流添加水印,嵌入任何类型的跟踪信息(甚至只是通用唯一标识符 (UUID))。警惕此类可能性的用户应扫描连接帧流,以尝试检测此类帧以进行分析或删除。

字段说明

Magic_Number (魔数)

大小: 4 字节,小端格式
: 0x184D2A5?,表示从 0x184D2A50 到 0x184D2A5F 的任何值

所有 16 个值都有效地标识可跳过帧。此规范不详细说明可跳过帧的任何特定标记方法。

魔数范围:

  • 最小值: 0x184D2A50
  • 最大值: 0x184D2A5F
  • 总共: 16 个有效魔数

Frame_Size (帧大小)

大小: 4 字节,小端格式,无符号 32 位
含义: 后续 User_Data 的大小(以字节为单位)(不包括魔数和大小字段本身)

这意味着 User_Data 不能大于 (2^32 - 1) 字节。

最大 User_Data 大小: 4,294,967,295 字节(约 4 GB)

User_Data (用户数据)

大小: 可变(由 Frame_Size 指定)
内容: 任意数据

此字段可以是任何内容。数据将被解码器跳过。

使用场景

1. 元数据嵌入

  • 版本信息
  • 创建时间戳
  • 作者信息
  • 许可证数据

2. 水印和追踪

  • UUID 嵌入
  • 来源追踪
  • 分发渠道标识

3. 应用特定数据

  • 自定义头部
  • 应用程序配置
  • 扩展信息

兼容性说明

解码器行为

符合规范的解码器必须:

  1. 识别魔数: 检测 0x184D2A5? 范围内的魔数
  2. 读取大小: 解析 Frame_Size 字段
  3. 跳过数据: 跳过 Frame_Size 字节的 User_Data
  4. 继续解码: 在可跳过帧后继续处理

编码器建议

编码器可以:

  1. 任意放置: 在帧流的任何位置插入可跳过帧
  2. 多个帧: 插入多个可跳过帧
  3. 自定义标记: 使用 16 个魔数中的任何一个进行内部标记

安全考虑

隐私问题

可跳过帧可能用于:

  • 跟踪数据流
  • 嵌入隐藏信息
  • 识别数据来源

建议措施

对于关注隐私的用户:

  1. 扫描检测: 扫描输入流以检测可跳过帧
  2. 分析内容: 检查 User_Data 的内容
  3. 选择性删除: 根据需要删除可跳过帧
  4. 日志记录: 记录检测到的可跳过帧以供审计

示例

嵌入 UUID

Magic_Number: 0x184D2A50
Frame_Size: 16 (0x10000000, 小端)
User_Data: [16 字节 UUID]

嵌入时间戳

Magic_Number: 0x184D2A51
Frame_Size: 8
User_Data: [8 字节 Unix 时间戳]

与 LZ4 的兼容性

可跳过帧格式与 LZ4 兼容,允许:

  • 跨格式工具互操作
  • 统一的元数据处理
  • 简化的解码器实现

注意: 可跳过帧不影响解压缩数据的内容,仅影响流的元数据。