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

Preview
数据包格式
简单的拿这个握手包来说明
<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
加载中.....
根据读取计算
原始数据 | 解析后 | |
---|---|---|
数据包长度 | 0x10 | 16 |
数据包ID | 0x00 | 0:Handshaking |
服务器地址 | 0xf2 0x03 0x09 0x31 0x32 0x37 0x2e 0x30 0x2e 0x30 0x2e 0x31 | 127.0.0.1 |
服务器端口 | 0x63 0xdd | 25565 |
下一步动作 | 0x01 | 1: 请求状态 |
如果是已经 加密了的数据, 请先解密, 然后按照格式进行处理,
如果是已经 启用了压缩了的数据, 请先解压缩然后再解密, 然后按照格式进行处理,
握手之后的PING包, 可能会被利用来攻击, 如果单个socket短时间内被ping次数太多, 就关闭socket然后拉黑
读取握手包的例子(Rust)
加载中.....
加载中.....
加载中.....
登录时序图
加载中.....
如果不是正版登录, 就不需要AccessToken的步骤