0x00 MineCraft协议概括

此文章为代理发布

0x00 这篇文章是给谁看的
这篇文章适合:
给同样对MC协议有兴趣且有一定编程能力的人
想要创建与 Minecraft 互操作的全新程序(例如机器人或服务器)的人
想要修改 Minecraft 客户端或服务器的人
这篇文章不适合:
只是想玩MC的玩家
普通模组的开发者
对二进制不熟悉的人
鉴于个人能力原因,可能有地方写的不够清楚,还请指出。
0x01 什么是MC协议
MC Protocol (JAVA) 是基于TCP流的一个协议,在服务器与客户端的交互中使用。下面没有特别申明的话,都指的是 Minecraft JAVA Edition 的协议。在这一系列文章里,Mocha将会以模拟1.16.5版本的原版MC客户端进行讲解。
0x02 与服务器的会话状态(State)
与正版服务器一共有四种常规状态:
HandShake 握手状态(与TCP的握手无关)
Status 查询服务器状态
Login 登陆服务器
Play 游戏状态(正在进行游戏)
其中,每次会话都从握手开始。
0x03 客户端的正常工作流程
正常的 Ping 和 Status 查询
C > S 表示客户端向服务器发送数据
S > C 表示服务器向客户端发送数据
下同客户端服务器建立TCP连接
C > S HandShake包,同时设置下一个状态为State为0x01(Status状态)
此时服务器和客户端的状态都变成StatusC > S 请求Status包
S > C 响应的服务器Status包
C > S Ping包
S > C Pong包
服务器断开与客户端的连接正常的登陆周期
客户端服务器建立TCP连接
C > S HandShake包,同时设置下一个状态为State为0x02(Login状态)
此时服务器和客户端状态都变成LoginC > S 发送登陆包
S > C 发送加密请求包(只有正版服务器才有) 此时客户端应该去认证
C > S 发送加密认证的包(只有正版服务器才有) 此时服务器去正版服务器验证一下认证,同时两边都打开加密
S > C 设置压缩大小(可能有)
S > C 登陆成功 此时服务器和客户端状态都变成Play
看不懂? 没关系,接下来我们会详细讲解
0x04 常用数据类型(部分)
主要来说,数据基本上也就那几十种(划掉) 一般来说常见的三种是
1. 定长整数
定长整数有 byte, short, int, long, unsigned byte, unsigned short, unsigned int, unsigned long。
大小如下:

这些数据全部是大端(也叫网络传输字节序)排列。
(就是表示高有效位的字节排在前面,第一位是符号位,负数用补码的一种方式排列啦)
unsigned指的是无符号整数,是没有符号位的
PS: 这里可以上网查一下,网上的解释比较全面
2. 变长整数
变长整数主要是Varint 和 Varlong, 下一篇文章会仔细讲。
(也就是这里光明正大的咕咕咕了)
3. 字符串
MC的字符串是由两部分组成的:
Varint + string
前面的Varint是后面字符串的长度
0x05 MC包的格式
MC协议里有两种包,一种是压缩过的包,一种是是普通包。其中压缩过的包只有在Login状态里接收到了设置压缩大小包以后才会启用
普通包
普通包由三个部分组成

压缩包
首先申明,在接收到设置压缩大小过后收到的包都是压缩包(设置压缩大小包传回的数据是一个负数的话就还是普通包),并不是压缩了才叫压缩包
在收到设置压缩大小的包以后 所有的包格式就变成了这样:

特别声明: 当设置压缩大小的值为0时所有数据压缩,值为负数时仍然使用普通包。
结语
了解了这些基础知识,我们就可以马上开始入门这个协议了,这个文档可能会在以后被你经常翻阅。
有不懂的问题可以在评论区提问,Mocha会尽量全部回答。
下一篇文章我们会讲讲Varint算法。