ET框架包体结构

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

游戏前后端使用KCP协议进行通信 (一种可靠UDP实现)。前后端使用protobuf进行消息序列化。

建立连接

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

// 其中协议头的byte值
SYN=1
ACK=2
FIN=3
MSG=4
  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)        |
|                               |
+-------------------------------+

其中的DATA为游戏包体内容。

游戏包结构

此框架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 
返回顶部