ET框架包体结构
之前都是潦草地过ET框架代码,因为最近需要与压测平台对接,对方平台为golang语言,需要了解包体结构,才能连接服务器,所以不得不将网络收发整理一遍。特此记录一下。
服务器框架:GitHub - egametang/ET at release7.2
游戏前后端使用KCP协议进行通信。前后端使用protobuf进行消息序列化。不包含软路由收发,由压测机进程直连网关。
建立连接
KCP没有实现类似TCP的三次握手机制,需要自行KCP之上实现自己的握手协议。ET框架中其中部分协议类型包体如下:
// 其中协议头的byte值
SYN=1
ACK=2
FIN=3
MSG=4
注:其中包体的LocalConn与RemoteConn都是发送方对接收方而言。例如客户端给服务器发送MSG包,LocalConn为客户端本地id,相对于服务器而言,客户端的LocalConn就是RemoteConn。
首先客户端向服务器发送SYN包,SYN=1,LocalConn是个随机uint值,此时未建立连接RemoteConn值为 0
服务器收到客户端发来的SYN包,返回ACK包。包体内容为,ACK=2,RemoteConnId为服务器创建的随机uint值,LocalConn为客户端的LocalConn。
客户端收到服务器的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时,消息将会分片发送。步骤如下:
- 首先发送分片包,包头的四个字节值为0,PackageSize=包体总内容大小
- 之后发送分片消息,由对方进行组装,直到组装完成后再解析
如何识别是分片包
当包大小等于8,并且包头四个字节转换为int的值为0时,说明消息分片。
PacketSize为这个分片包的总内容大小。
KCP参数
客户端连接游戏服务器的KCP参数如下
nodelay=1
interval=10
resend=2
nc=1
sndwnd=256
rcvwnd=256
mtu=470
minrto=30
其他
客户端与服务器通信使用小端序