欢迎光临散文网 会员登陆 & 注册

0x00 MineCraft协议概括

2023-07-25 14:34 作者:不懂图论的三维  | 我要投稿

此文章为代理发布

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 客户端的正常工作流程

  1. 正常的 Ping 和 Status 查询

    C > S 表示客户端向服务器发送数据
    S > C 表示服务器向客户端发送数据
    下同

    1. 客户端服务器建立TCP连接

    2. C > S HandShake包,同时设置下一个状态为State为0x01(Status状态)
      此时服务器和客户端的状态都变成Status

    3. C > S 请求Status包

    4. S > C 响应的服务器Status包

    5. C > S Ping包

    6. S > C Pong包
      服务器断开与客户端的连接

  2. 正常的登陆周期

    1. 客户端服务器建立TCP连接

    2. C > S HandShake包,同时设置下一个状态为State为0x02(Login状态)
      此时服务器和客户端状态都变成Login

    3. C > S 发送登陆包

    4. S > C 发送加密请求包(只有正版服务器才有) 此时客户端应该去认证

    5. C > S 发送加密认证的包(只有正版服务器才有) 此时服务器去正版服务器验证一下认证,同时两边都打开加密

    6. S > C 设置压缩大小(可能有)

    7. 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算法。


0x00 MineCraft协议概括的评论 (共 条)

分享到微博请遵守国家法律