跳到主要内容

minecraft协议解析[1]

· 5 分钟阅读
月子喵

最近还是接触Minecraft比较多, 从头理清一下服务端, 造一个高性能, 分布式的 Minecraft的轮子

Preview

haozi23333 的 头

数据包格式

简单的拿这个握手包来说明 <Buffer 10 00 f2 03 09 31 32 37 2e 30 2e 30 2e 31 63 dd 01>

Packet ID State Bound To Field Name Field Type Notes
0x00 Handshaking Server Protocol Version VarInt See protocol version numbers (currently 498 in Minecraft 1.14.4)
Server Address String (255) 主机名或IP,例如 用于连接的localhost或127.0.0.1。 Notchian服务器不使用此信息。 请注意,SRV记录是完整的重定向,例如 如果_minecraft._tcp.example.com指向mc.example.org,则连接到example.com的用户除了连接到mc.example.org外,还将提供mc.example.org作为服务器地址。
Server Port Unsigned Short 默认值为25565。Notchian服务器不使用此信息。
Next State VarInt Enum 1 请求状态 2 登录流程

其他的结构参看参考资料1

加载中.....

根据读取计算

原始数据解析后
数据包长度0x1016
数据包ID0x000:Handshaking
服务器地址0xf2 0x03 0x09 0x31 0x32 0x37 0x2e 0x30 0x2e 0x30 0x2e 0x31127.0.0.1
服务器端口0x63 0xdd25565
下一步动作0x011: 请求状态

如果是已经 加密了的数据, 请先解密, 然后按照格式进行处理,

如果是已经 启用了压缩了的数据, 请先解压缩然后再解密, 然后按照格式进行处理,

握手之后的PING包, 可能会被利用来攻击, 如果单个socket短时间内被ping次数太多, 就关闭socket然后拉黑

读取握手包的例子(Rust)

加载中.....
加载中.....
加载中.....

登录时序图

加载中.....

如果不是正版登录, 就不需要AccessToken的步骤

参考资料

[1]: Minecraft 协议: https://wiki.vg/Protocol