Bedrock Wiki
  • QQ
  • 原站
新手入门指南
  • Guide
    • 1. 简介
      指南
    • 2. 附加组件详解
    • 3. 软件与准备工作
    • 4. 项目设置
    • 5. 创建自定义物品
    • 6. 创建自定义实体
    • 7. Blockbench:建模、贴图与动画制作
    • 8. 添加战利品表、生成规则与合成配方
  • Extra
    • a. 理解JSON
    • b. 下载示例包
    • c. 故障排除
      帮助
    • d. 高级清单文件指南
    • e. 格式版本
    • f. Android 项目设置
JSON UI
  • General
    • JSON UI 入门指南
      指南
    • 最佳实践
      指南
  • Tutorials
    • Aseprite 动画
    • 保留标题文本
      中级
    • 修改服务器表单
      中级
    • 字符串与数字转换
      中级
    • 按钮与开关
      新手
    • 添加HUD界面元素
      新手
  • Documentation
    • JSON UI 文档
Meta
  • Style Guide
  • 使用JSON模式(Schemas)
  • 实用链接
  • 版本控制
  • 附加包性能优化
  • Q&A
    • GameTest 问答集 2021/08/06
    • 世界生成问答 2024/11/15
    • 延迟渲染技术预览问答 2024/02/23
    • 方块与物品问答 2024/08/30
    • 脚本与编辑器问答 2023/09/22
NBT
  • General
    • .mcstructure
  • Tutorials
    • 扩展结构限制
      简单
    • 教育版中的实验功能
      简单
  • NBT in Depth
    • NBT 库列表
      专家
    • NBT读取示例
      专家
    • 关于NBT(命名二进制标签)
      专家
世界生成
  • General
    • 世界生成入门
      指南
      实验性
    • 特性类型
      实验性
    • 生物群系
      指南
      实验性
  • Tutorials
    • 特征(Feature)的方块条件
      实验性
    • 生成地表区块
      实验性
    • 生成自定义矿石
      实验性
    • 生成自定义结构
      实验性
    • 高度图噪声地形
      实验性
  • Documentation
    • 生物群系标签
动画控制器
  • 动画控制器入门指南
    指南
  • 实体命令
    中级
  • AFK检测器
  • 将Molang变量转换为计分板数值
  • 死亡指令
  • 重生指令
命令
  • General
    • 命令方块入门指南
    • 函数
    • NBT 命令
    • 坐标系
    • 方块状态
    • 理解目标选择器
    • 记分板操作
  • Commands
    • Execute
      简单
    • Playanimation
    • 伤害
    • 播放音效
  • On Event Systems
    • 玩家首次加入时
    • On Player Join
    • 玩家离开时触发
    • 玩家死亡事件
    • 玩家重生事件系统
    • 首次加载世界时
  • Scoreboard Systems
    • 实体计数器
    • 计分板计时器
    • 比较与获取分数
  • Techniques
    • 执行逻辑门
    • MBE - Max的方块实体
    • FMBE - 创建显示实体的新方法
    • 视线检测
    • 移动状态检测
    • 轨道摄像机
  • Useful Creations
    • 多人位置重排系统
      函数
    • 自定义合成台
      简单
实体
  • General
    • Intro to Entities BP
      指南
      新手
    • 实体资源包入门
      指南
      新手
    • 实体问题排查指南
      帮助
    • NPC对话系统
      中级
    • 实体事件
      新手
    • 实体属性
    • 渲染控制器
      新手
    • 生成规则
  • Tutorials
    • 任意坐标系间的坐标转换(世界、实体、骨骼)
      中级
    • 创建船只
      中级
    • 实体手持物品
      中级
    • 实体攻击机制
      中级
    • 实体睡眠机制
      中级
    • 实体碰撞体
      中级
    • 实体移动
    • 实体计时器
      中级
    • 无敌实体
      新手
    • 村庄机制实现指南
    • 检测其他实体
      中级
    • 生成已驯服的实体
      脚本
      中级
    • 视线检测实体
      中级
    • 禁用队友伤害
      中级
    • 范围效果云入门指南
      中级
    • 虚拟实体
      新手
    • 飞行实体控制
      中级
  • Documentation
    • Vanilla Usage Spawn Rules
    • 原版使用组件
    • 抛射物
    • 虚拟组件
    • 运行时标识符
    • 非生物实体运行时标识符
战利品、配方与交易
  • General
    • 交易行为
  • Documentation
    • 战利品表
    • 交易表
    • 合成配方
    • 物品函数
  • Tutorials
    • 随机化结构战利品
      简单
文档
  • Shared Constructs
  • Molang 查询详解
  • Vanilla Materials
    专家
  • 声音定义
  • 文件类型
  • 材质配置文件说明
    专家
  • 菜单分类
  • 资源包文件夹结构
  • 雾效ID
  • 高级Molang指南
方块
  • General
    • 方块入门指南
      指南
      新手
    • 方块组件
    • Block Tags
    • 方块状态
    • Block Traits
    • 方块排列组合
    • 方块事件
      脚本
    • 方块事件迁移指南
      帮助
    • 方块物品化
      中级
    • 方块问题排查指南
      帮助
  • Visuals
    • 方块剔除
      中级
    • 方块模型
      指南
      新手
      简单
    • 方块着色
      简单
    • 方块纹理动画
      中级
    • 方块纹理变体
      中级
  • Tutorials
    • Precise Interaction
      专家
      脚本
    • Precise Rotation
      专家
      脚本
    • 伪方块
      中级
    • 可旋转方块
    • 应用持续效果
      简单
      脚本
    • 矿石战利品表
      简单
      脚本
    • 规避状态值限制
      专家
  • Vanilla Re-Creations
    • 自定义作物
      中级
      脚本
    • 自定义活板门
      中级
      脚本
    • 自定义玻璃
      新手
      简单
      已弃用
    • 自定义釉面陶瓦
      简单
  • Documentation
    • 原版方块模型
      新手
    • 方块形状
    • 方块格式历史
    • 方块音效
服务器
  • Software
    • Bedrock Server Software
  • Protocols
    • Bedrock Protocol
    • NetherNet 协议
    • RakNet 协议
概念
  • contents.json
  • Molang
    中级
  • Rawtext
  • textures_list.json
  • 命名空间
  • 子包
  • 文本与本地化
  • 着色器
  • 纹理图集
    中级
  • 表情符号与特殊字符
  • 覆盖资源
    中级
  • 音效
    中级
物品
  • General
    • 物品入门指南
      指南
      新手
    • 物品组件
    • 物品标签
    • 物品事件
      脚本
    • Item Event Migration
      帮助
    • 物品问题排查指南
      帮助
  • Tutorials
    • Custom Pottery Sherds
    • 可投掷物品
      中级
    • 生成物品
      中级
    • 自定义武器
      简单
    • 自定义盔甲
    • 自定义食物
      简单
      脚本
    • 通过装备物品执行命令
      实验性
      中级
    • 高分辨率物品
  • Documentation
    • 附魔
    • Numerical Item IDs
    • Vanilla Usage Components
    • 原版物品标识符
      已弃用
    • 可附着物
      新手
    • 物品格式历史记录
视觉效果
  • General
    • 实体视觉效果简介
      指南
    • 基岩版建模指南
    • 动画中的特效
    • 基于数学的动画
      中级
    • 材质
      专家
    • 材质创作
      专家
    • 皮肤包制作指南
    • 自定义死亡动画
      中级
  • Tutorials
    • Glowing Entity Texture
    • 受伤动画
      中级
    • 实体纹理动画
      中级
    • 栓绳位置调整
      简单
    • 玩家几何模型
      新手
    • 移除实体阴影
      中级
    • 重绘生成蛋纹理
      新手
  • Ideas
    • 结构展示技巧
粒子效果
  • General
    • 粒子效果入门
      指南
  • Tutorials
    • 禁用粒子效果
      新手
  • Documentation
    • 原版粒子效果
脚本编写
  • General
    • 脚本编程入门
    • 什么是Script API?
    • API 模块
  • Tutorials
    • GameTests
      实验性
    • 简易聊天命令
      实验性
    • 脚本核心功能
    • 脚本表单
      实验性
    • 脚本请求API
      实验性
    • 阻止方块放置
  • Documentation
    • JavaScript 问题排查指南
    • Script Resources
    • Script Watchdog
      实验性
    • TypeScript
    • 引擎环境
虚拟现实
  • General
    • 启用VR模式
      指南
    • 配置资源包
      专家
  • Tutorials
    • 编辑你的第一个模型
      专家

Bedrock Protocol

Bedrock Protocol
  • 数据类型
  • 编码方式
  • 游戏数据包头
  • 压缩
  • 加密
  • 缓存
  • 登录流程
    • 网络设置请求
    • 网络设置
    • 登录
    • 服务端到客户端握手(可选)
    • 客户端到服务端握手(可选)
    • 资源包信息
    • 客户端缓存状态(可选)
    • 资源包客户端响应
    • 资源包堆栈
    • 资源包客户端响应
    • 游戏状态
    • 开始游戏数据包
    • 游戏状态
  • 发送资源包
  • 发送区块
  • 发送库存内容
  • 实现方案

数据类型 ​

类型大小说明
i8 (字节)1
u8 (无符号字节)1
i16 (短整型)2通常采用小端序编码,有时使用大端序
u16 (无符号短整型)2通常采用小端序编码,有时使用大端序
i32 (整型)4通常采用小端序编码,有时使用大端序
u32 (无符号整型)4通常采用小端序编码,有时使用大端序
i64 (长整型)8通常采用小端序编码,有时使用大端序
u64 (无符号长整型)8通常采用小端序编码,有时使用大端序
varint i32 (变长整型)可变可变长度编码的i32
varint u32 (变长无符号整型)可变可变长度编码的u32
varint i64 (变长长整型)可变可变长度编码的i64
varint u64 (变长无符号长整型)可变可变长度编码的u64
f32 (单精度浮点数)4始终采用小端序编码
f64 (双精度浮点数)8始终采用小端序编码

编码方式 ​

Bedrock协议支持多种整数编码方式,包括:

  • 小端序(Little Endian)
  • 大端序(Big Endian)
  • 变长整数(VarInts)

这些编码方式决定了整数的读写顺序。小端序和大端序都属于字节序(Endianness),主要区别在于字节的读取顺序。更多信息可参考维基百科。

而VarInts是一种可变长度编码方案,可以根据数值大小使用最少的字节数表示整数。与固定字节数(如32位整数固定使用4字节)不同,VarInts会根据数值大小动态调整字节数,这在编码较小数值时能有效节省空间。该编码方式被广泛应用于Google Protocol Buffers、Minecraft等协议中。更多细节请参阅Google Protocol Buffers文档。

游戏数据包头 ​

在Bedrock协议中,GamePacket头部是数据包结构的关键部分。它包含了数据包的元信息,如长度、类型以及源客户端和目标客户端的信息。头部采用紧凑格式编码,通过使用变长整数来减少带宽占用。

GamePacket头部由以下部分组成:

  • 数据包长度(varint u32):包含头部和有效载荷的总大小
  • 数据包头(14位,编码为varint u32),包含:
    • 数据包ID(10位):标识特定的数据包类型
    • 发送方子客户端ID(2位):在多客户端场景中标识发送方
    • 目标子客户端ID(2位):在多客户端场景中标识接收方

数据包ID最大为10位,意味着最多有2^10(1024)种可能的数据包ID。其中200-299号ID保留给衍生版本使用,可用于自定义数据包等用途。

子客户端字段(发送方和目标方)各占2位,取值范围0-3。这允许在多个玩家共享同一连接(如分屏游戏)的场景下区分最多4个不同客户端。

压缩 ​

Bedrock协议经常使用数据压缩来优化网络性能并减少带宽占用。当出站数据包超过特定阈值大小时,就会启用压缩。压缩算法可根据实际需求配置,主要目标是在保证解压效率的前提下最小化数据大小。

Bedrock支持多种压缩算法,各算法在效率、速度和压缩率方面各有特点。每个连接可以协商使用的算法,不同压缩方法在通信时通过唯一标识符区分。主要使用的算法包括:

  • Zlib: 广泛使用的压缩技术,提供可配置的压缩级别。该算法在速度和压缩率之间取得平衡,更高级别的压缩会产生更小的输出但需要更多计算资源。适合压缩大型数据包。
  • Snappy: 专为高速压缩和解压设计的算法,更注重性能而非最高压缩率。通常在对速度要求较高的小型数据包场景中使用。
  • 无压缩: 某些情况下(如小型数据包或调试目的)可能不需要压缩。如果数据包大小低于特定阈值,可能会完全跳过压缩以避免额外开销。

(简而言之...在生产环境中始终使用Zlib,因为它是最佳选择,其他算法要么存在问题,要么不适合生产环境)

只有当待压缩数据大小超过预设阈值时才会启用压缩。每个算法都有可配置的阈值,若数据大小低于此阈值,数据包将直接发送而不压缩。

在Bedrock中,每个数据包开头都包含压缩标识符,这是关键的元数据,用于指示数据包是否压缩以及使用的压缩算法。该标识符让接收端知道如何处理传入数据——是需要解压还是可以直接读取。

以下是可用压缩方法对应的标识符:

  • Zlib: 0x00
  • Snappy: 0x01
  • 无压缩: 0xFF或0xFFFF(在网络设置中)

该压缩ID以u8类型存储在每个游戏数据包之前,在网络设置中则以u16类型存储,用于定义默认的压缩方法。

加密 ​

待完善...

缓存 ​

待完善...

登录流程 ​

Bedrock协议的登录序列包含多个阶段:

  • 预登录(PreLogin)
  • 登录(Login)
  • 生成(Spawn)
  • 游戏(Play)

网络设置请求 ​

(客户端 -> 服务器)

官方文档参考

自v554(1.19.20)版本起,这是客户端发送的第一个数据包。NetworkSettingsRequestPacket仅包含一个字段,即客户端当前的协议版本。

这是第一个预登录阶段的数据包。

网络设置 ​

(服务器 -> 客户端)

官方文档参考

用于设置连接信息,这是初始化压缩配置的地方。有关压缩的更多信息,请参阅压缩部分。

这是最后一个预登录阶段的数据包。

登录 ​

(客户端 -> 服务器)

官方文档参考

LoginPacket包含大量客户端信息,如客户端协议版本(再次出现)。由于在新版本中已弃用,不应再使用此字段。

它还包含一个JSON格式的JWT数组(称为证书链),以字符串形式编码。这些JWT包含经过验证的客户端信息。该数组至少包含1个JWT(未通过Xbox Live服务认证),最多包含3个JWT(已通过Xbox Live服务认证)。它们存储了玩家显示名称、xuid和uuid等数据,认证状态下还会包含沙盒和标题ID。如果缺少第2和第3个JWT,则表示玩家未登录Xbox Live账户,当前未认证,因此发送的数据不可信任。

LoginPacket还包含另一个以字符串编码的JWT,即原始令牌(raw token)。它包含玩家相关信息,如:

  • SelfSignedId
  • ServerAddress = (未解析的URL,如适用)
  • ClientRandomId
  • 皮肤ID
  • 皮肤数据
  • 皮肤图像宽度
  • 皮肤图像高度
  • 披风数据
  • 披风图像宽度
  • 披风图像高度
  • 皮肤资源补丁
  • 皮肤几何数据
  • 皮肤几何数据引擎版本
  • 皮肤动画数据
  • PlayFabId
  • 动画图像数据 = 包含以下字段的数组:
    • 类型
    • 图像
    • 图像宽度
    • 图像高度
    • 帧数
    • 动画表达式
  • 手臂尺寸
  • 皮肤颜色
  • 角色部件 = 包含以下字段的数组:
    • 包ID
    • 部件ID
    • 是否默认
    • 部件类型
    • 产品ID
  • 部件色调颜色 = 包含以下字段的数组:
    • 部件类型
    • 颜色 = 颜色十六进制字符串数组
  • 是否教育版模式(如适用)
  • 租户ID(教育版)
  • AD角色(教育版)
  • 是否编辑器模式
  • 游戏版本
  • 设备型号
  • 设备操作系统 = (参见枚举:BuildPlatform)
  • 默认输入模式 = (参见枚举:InputMode)
  • 当前输入模式 = (参见枚举:InputMode)
  • UI配置文件 = (参见枚举:UIProfile)
  • GUI缩放比例
  • 语言代码
  • 平台用户ID
  • 第三方名称
  • 仅第三方名称
  • 平台在线ID
  • 平台离线ID
  • 设备ID
  • 受信任的皮肤
  • 高级皮肤
  • 角色皮肤
  • 覆盖皮肤
  • 经典皮肤上的披风
  • 披风ID
  • 兼容客户端区块生成

这是登录阶段的第一个数据包。

服务端到客户端握手(可选) ​

(服务器 -> 客户端)

官方文档参考

如果发送此数据包,则会初始化加密。更多信息请参阅加密部分。

待完善...

客户端到服务端握手(可选) ​

(客户端 -> 服务器)

官方文档参考

如果客户端正确初始化了加密,会通过此空数据包响应,表示握手成功。

资源包信息 ​

(服务器 -> 客户端)

官方文档参考

发送可用资源包和附加组件的元数据。如需发送任何类型的资源包,请参阅发送资源包部分。如果ResourcePacksInfo和ResourcePacksStack都为空,这些数据包可以批量处理。此时只需发送一个ClientCacheStatus(可选)和ResourcePackClientResponse。

客户端缓存状态(可选) ​

(客户端 -> 服务器)

官方文档参考

如果客户端支持缓存,则会发送此数据包,包含一个布尔值表示缓存支持状态。缓存支持为协议启用了某些可能性,更多信息请参阅缓存部分。

资源包客户端响应 ​

(客户端 -> 服务器)

官方文档参考

对前一个ResourcePacksInfoPacket的响应,描述资源包下载的当前状态。如需发送任何类型的资源包,请参阅发送资源包部分。

资源包堆栈 ​

(服务器 -> 客户端)

官方文档参考

总是对ResourcePackClientResponse的回复,直到客户端下载完所有资源包。

资源包客户端响应 ​

(客户端 -> 服务器)

官方文档参考

对前一个ResourcePacksInfoPacket的响应,描述资源包下载的当前状态。如需发送任何类型的资源包,请参阅发送资源包部分。如果此数据包表明客户端已下载所有必需资源包,则可以继续登录流程。

游戏状态 ​

(服务器 -> 客户端)

官方文档参考

包含一个枚举值表示游戏状态(登录流程/阶段的进度)。如果登录阶段成功,枚举值应设置为LoginSuccess。

这是登录阶段的最后一个数据包。

开始游戏数据包 ​

(服务器 -> 客户端)

官方文档参考

这是生成阶段的第一个数据包。

TIP

在此数据包之后,您已经可以发送库存内容或区块。客户端已准备就绪,只需等待您允许其生成。

游戏状态 ​

包含一个枚举值表示游戏状态(登录流程/阶段的进度)。如果生成阶段成功,枚举值应设置为PlayerSpawn。

这是生成阶段的最后一个数据包。

发送资源包 ​

待完善...

发送区块 ​

待完善...

发送库存内容 ​

待完善...

实现方案 ​

并非所有内容都能通过文档详细解释,因此参考现有实现非常有帮助。以下是Bedrock协议的一些实现方案:

名称描述语言
CloudburstMC/ProtocolMinecraft基岩版协议库Java
PMMP/BedrockProtocolPHP实现的Minecraft基岩版协议PHP
gophertunnel用Go编写的Minecraft基岩版通用库Go
bedrockrsRust实现的MCBE通用库Rust

本页面仍在完善中,欢迎贡献内容。

贡献者

编辑 Bedrock Protocol

Bedrock Wiki by Bedrock OSS ,Translate by 8aka-Team

"Minecraft"是Mojang AB的注册商标。

Bedrock OSS、Bedrock Wiki以及 bedrock.dev 与Microsoft及Mojang AB不存在任何隶属关系。

  • 隐私政策
  • 加入QQ社区
  • 参与贡献指南
  • 访问代码仓库