ET框架包体结构

之前都是潦草地过ET框架代码,因为最近需要与压测平台对接,对方平台为golang语言,需要了解包体结构,才能连接服务器,所以不得不将网络收发整理一遍。特此记录一下。

服务器框架:GitHub - egametang/ET at release7.2

游戏前后端使用KCP协议进行通信。前后端使用protobuf进行消息序列化。不包含软路由收发,由压测机进程直连网关。

建立连接

KCP没有实现类似TCP的三次握手机制,需要自行KCP之上实现自己的握手协议。ET框架中其中部分协议类型包体如下:

常用包体类型

常用包体类型

MSG包体结构

MSG包体结构
// 其中协议头的byte值
SYN=1
ACK=2
FIN=3
MSG=4

注:其中包体的LocalConn与RemoteConn都是发送方对接收方而言。例如客户端给服务器发送MSG包,LocalConn为客户端本地id,相对于服务器而言,客户端的LocalConn就是RemoteConn。

  1. 首先客户端向服务器发送SYN包,SYN=1,LocalConn是个随机uint值,此时未建立连接RemoteConn值为 0

  2. 服务器收到客户端发来的SYN包,返回ACK包。包体内容为,ACK=2,RemoteConnId为服务器创建的随机uint值,LocalConn为客户端的LocalConn。

  3. 客户端收到服务器的ACK包,发送MSG消息,服务器收到MSG消息,说明连接完成。MSG消息的包体内容为,MSG=4,LocalConn为客户端LocalConn,bytes部分为KCP包体。
    当建立连接后,客户端与游戏服务端发游戏协议的包体类型为MSG类型。

KCP包结构

KCP包结构如下:

0               4   5   6       8 (BYTE)
+---------------+---+---+-------+
|     conv      |cmd|frg|  wnd  |
+---------------+---+---+-------+   8
|     ts        |     sn        |
+---------------+---------------+  16
|     una       |     len       |
+---------------+---------------+  24
|                               |
|        DATA (optional)        |
|                               |
+-------------------------------+

其中conv为对方的RemoteConn,DATA为游戏包体内容。ET框架的KCP经过了魔改,conv不一定要一样。

游戏包结构

此框架KCP使用消息模式,每个KCP包里DATA部分只有一个数据包,结构如下:

普通包体

OpCode为协议编号,Message为Protobuf协议序列化后的字节数组。
需要注意的是,当消息大小超过最大包大小10000时,消息将会分片发送。步骤如下:

  1. 首先发送分片包,包头的四个字节值为0,PackageSize=包体总内容大小

分片发送的第一个包
  1. 之后发送分片消息,由对方进行组装,直到组装完成后再解析

如何识别是分片包

​ 当包大小等于8,并且包头四个字节转换为int的值为0时,说明消息分片。
​ PacketSize为这个分片包的总内容大小。

KCP参数

客户端连接游戏服务器的KCP参数如下

nodelay=1
interval=10
resend=2
nc=1
sndwnd=256
rcvwnd=256
mtu=470
minrto=30 

其他

客户端与服务器通信使用小端序

返回顶部