从 LoginPacket 到 DisconnectPacket:如何看懂 bedrock-protocol-docs 中 500+ 网络数据包结构
【免费下载链接】bedrock-protocol-docs
Documentation of the Bedrock network protocol. Protocol is subject to change release over release.
📖bedrock-protocol-docs是 Minecraft: Bedrock Edition 官方发布的网络协议文档仓库,收录了超过 500 个网络数据包(packet)的完整 JSON Schema 结构。无论你是想开发第三方服务器、写协议工具,还是单纯好奇"客户端和服务端到底在互相发什么",都能通过 LoginPacket、DisconnectPacket 等核心包的定义,快速看懂 Bedrock 网络协议的运作方式。
本文将带你用5 个步骤,从仓库结构、单个数据包解析、字段约定到连接生命周期,系统地读懂这 500+ 个数据包结构。
1️⃣ 先认识仓库:500+ 数据包都在哪里?
打开 README.md 可以看到仓库分为 4 个核心区域:
| 目录 | 作用 | 适合谁看 |
|---|---|---|
json/ | 全部协议 Schema(1014 个文件),官网文档由它生成 | 🎯 协议阅读者主战场 |
| additional_docs/ | 协议之外实现细节的指南(反作弊、拆方块流程等) | 想理解"为什么这么设计"的人 |
| legacy_changelogs/ | 历史版本变更日志 | 追踪协议演进 |
developer_notes/ | 按版本(r21u6 ~ r26u6)整理的开发者笔记 | 深入特定版本细节 |
📌 关键认知:json/目录下每个.json文件就是一个类型或数据包的定义,其中239 个以*Packet.json命名的文件对应当前协议版本(x-protocol-version: 2225,对应 Minecraft 1.26.60-beta)的顶层数据包。它们加上 Payload、枚举等辅助定义,共同构成了"500+ 网络数据包结构"的完整图谱。
2️⃣ 读懂一个数据包:以 LoginPacket 为例
每个数据包都由两个文件组成,这是读懂全部 500+ 包的万能钥匙:
XxxPacket.json:包的"身份证"——名称、说明、协议 IDXxxPacketPayload.json:包的"身体"——具体字段和类型
以 json/LoginPacket.json 为例:
{ "title": "LoginPacket", "x-minecraft-version": "1.26.60-beta.0", "x-protocol-version": 2225, "description": "Sent once from client to server at login. About 100k.", "$ref": "./LoginPacketPayload.json", "$metaProperties": { "[cereal:packet]": 1 } }逐字段拆解(这个模式适用于所有包):
| 字段 | 含义 |
|---|---|
title | 数据包名称 |
x-protocol-version | 所属协议版本号(2225) |
x-minecraft-version | 对应的游戏版本 |
description | 一句话说明用途,比如"登录时客户端发给服务端一次,约 100k" |
"$ref" | 指向 Payload 文件,字段细节都在这 |
$metaProperties["[cereal:packet]"] | 数据包 ID(如 1),收发时按此编号识别 |
再顺着$ref打开 json/LoginPacketPayload.json,就能看到实际传输的字段:
| 字段 | 类型 | 说明 |
|---|---|---|
Client Network Version | int32(Big Endian) | 客户端网络版本号 |
Connection Request | string | 连接请求内容 |
💡 小技巧:字段上的x-ordinal-index表示序列化顺序,x-underlying-type表示底层类型,x-serialization-options标注字节序/压缩等序列化规则——看字段时优先扫这三个属性,就能推断出线格式。
3️⃣ 从 Login 到 Disconnect:一次连接的完整生命周期
把数据包按"连接阶段"串起来读,比一个个硬啃高效得多。下面是一次典型连接中你最先遇到的几个包(ID 来自各json文件中的[cereal:packet]):
| 阶段 | 数据包 | 方向 | ID | 作用 |
|---|---|---|---|---|
| 登录 | LoginPacket | 客户端 → 服务端 | 1 | 客户端发起登录,携带网络版本 |
| 登录结果 | PlayStatusPacket | 服务端 → 客户端 | 2 | 登录成功/失败,完成握手 |
| 登出 | DisconnectPacket | 服务端 → 客户端 | 5 | 触发断线,附带断开原因 |
| 移动 | MovePlayerPacket | 服务端 → 客户端 | 19 | 强制把玩家拉回指定位置(反作弊核心) |
| 物品交互 | InventoryTransactionPacket | 双向 | 30 | 背包/UI 物品交互与玩法内使用物品 |
连接结束时的 json/DisconnectPacketPayload.json 是个很好的进阶范例,演示了协议中的联合类型写法:
Reason:引用枚举 json/DisconnectFailReason.json,告诉客户端为什么被踢;Messages:使用oneOf表示"要么是消息体、要么为null",并通过x-control-value-type: uint32声明判别值——看懂这一处,oneOf+ 判别值这个在 500+ 包里反复出现的模式就全通了。
🕹️ 想深入"服务端如何判定与纠正玩家"?推荐对照阅读 additional_docs/PlayerMovementOverview.md 和 additional_docs/ConfiguringAntiCheat.md,它们解释了MovePlayerPacket背后的 rewind 反作弊机制。
4️⃣ 高效查找技巧:在 500+ 包里快速定位
关键词搜索三件套
在仓库根目录用grep按关键词搜包名和用途,是最快的定位方式:
# 按用途关键词找包(在 description 里搜) grep -l "block breaking" json/*.json # 找所有数据包主文件(排除 Payload/枚举) ls json/*Packet.json按命名规律分类记忆
*Packet.json/*PacketPayload.json:数据包本体与字段Clientbound*/Serverbound*:显式标注方向的包*_Action/__Type类文件:包内的枚举与子操作(如拆方块动作类型)
配套文档一起看
- 指南入口 additional_docs/README.md:解释了 guides 导航的组织方式(首层目录=分区,首级标题=标题)
- 拆方块机制:additional_docs/BlockBreakingOverview.md
- 各版本开发者笔记:developer_notes/r26u5/、developer_notes/r21u6/ 等,共 13 个版本目录
- 历史变更记录:legacy_changelogs/,协议"逐版本会变"(subject to change),查改动看这里
5️⃣ 常见问题(FAQ)
Q1:协议会一直变吗?我该看哪个版本?会。仓库明确说明协议随版本变化。当前json/对应协议版本 2225(Minecraft 1.26.60-beta),历史版本可通过 legacy_changelogs/ 与 developer_notes/ 追溯。
Q2:只想本地运行文档网站?按 README.md 说明,使用 Node.js 24+ 后执行:
npm ci npm run devQ3:x-format-version显示 "MISSING VERSION" 是什么?这是生成阶段尚未填充的占位值,不影响字段定义阅读;真正可用的版本信息在x-protocol-version字段中。
总结:一份快速上手清单 ✅
- 定位:数据包主文件在 json/,命名规律
XxxPacket.json+XxxPacketPayload.json - 看身份证:
description讲用途,[cereal:packet]是包 ID - 看字段:跟着
$ref进 Payload,重点关注x-underlying-type、x-ordinal-index、oneOf判别值 - 串流程:LoginPacket → PlayStatusPacket → (游戏数据)→ DisconnectPacket,按阶段记忆
- 查细节:机制类问题去 additional_docs/,版本演进去 legacy_changelogs/
掌握这套方法,500+ 个网络数据包对你来说就不再是陌生的 JSON 堆,而是一张可以按图索骥的地图 🗺️
【免费下载链接】bedrock-protocol-docs
Documentation of the Bedrock network protocol. Protocol is subject to change release over release.
相关推荐
5分钟看懂网络流量捕获:Sniffnet如何让数据包"开口说话"
5分钟看懂网络流量捕获:Sniffnet如何让数据包"开口说话" 你是否曾好奇电脑是如何悄悄收发数据的?当你打开网页、发送消息时,成千上万的数据包正在后台飞驰。
桌面应用网络数据可视化DeepLearning-500-questions经典网络结构解析:从LeNet到NIN
DeepLearning 500 questions经典网络结构解析:从LeNet到NIN 引言 卷积神经网络 CNN 作为深度学习在计算机视觉领域的核心算法,
知识库教程人工智能深度学习机器学习计算机视觉解密Grasscutter网络数据包:从结构解析到实战应用
解密Grasscutter网络数据包:从结构解析到实战应用 Grasscutter作为一款开源的游戏服务器实现,其网络通信系统是实现游戏功能的核心模块。本文将带
游戏开发后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考