Skip to content

客户端对接服务器

sundream edited this page Jun 20, 2019 · 3 revisions

tcp网关

  • 完整包格式
+----+----+
|len |msg |
+----+----+
len占用2字节,字节序为大端,大小为msg的长度
  • sproto编码
msg格式定义为:
+------+----+
|header|body|
+------+----+
header为sproto消息,定义如下
.package {
	type 0 : integer     # 消息类型ID(不发该值,表示是一个回复包,必须发session以表示对哪个请求的回复)
	session 1 : integer  # rpc会话ID,无需对方回复时可以发0,否则,保证唯一
}
body为sproto消息,内容和header.type有关。由于sproto可以无需指定长度正常解析出一个完整消息,因此不必在header前增加长度字段
  • protobuf编码
msg格式定义为:
+-----+------+----+
|len  |header|body|
+-----+------+-----
len占用2字节,字节序为大端,大小为header的长度
header为protobuf消息,定义如下
message MessageHeader {
	int32 type = 1;	        // 消息类型ID
	int32 session = 2;	// rpc会话ID,无需对方回复时可以发0,否则,保证唯一
	bool request = 3;	// true--请求,false--回复
}
body为protobuf消息,内容和header.type有关
  • json编码
msg格式定义为:
{
  "type" : 类别,1--请求包,2--回复包,
  "cmd" : 指令(协议名),
  "args" : 参数(具体和协议定义有关),
  "session" : rpc会话ID,无需对方回复时发0,否则,保证唯一,
  "ud" : 用户自定义数据
}

kcp网关

kcp是一个纯算法协议,在gg中我们用udp作为kcp的传输协议,另外模拟了一套连接,关闭处理, 让kcp可以类似于tcp使用。kcp的协议格式具体可以见https://github.com/skywind3000/kcp/blob/master/protocol.txt, DATA格式为:
1字节协议类型+协议参数,如
连接(SYN): 1(1byte) + 主动连接方连接ID(4byte)
接收连接(ACK): 2(1byte) + 接收方连接ID(4byte) + 被接受方连接ID(4byte)
断开连接(FIN): 3(1byte) + 主动断开方连接ID(4byte) + 被动断开方连接ID(4byte)
消息包(MSG): 4(1byte) + 发消息方连接ID(4byte) + 包格式(格式同tcp网关中msg格式)

websocket网关

websocket是基于http建立长连接的上层协议,协议格式可见https://tools.ietf.org/html/rfc6455#section-5.2, Payload Data格式同tcp网关中msg格式

握手

gg默认关闭了握手,协议不进行加密,你可以参照修改配置来更改行为,握手包必须先于其他包发送,握手流程如下:
第一步: [GS2C]发送挑战码challenge(用于校验后续协商出的密钥是否一致)+服务端随机串serverkey
第二步: [C2GS]收到客户端发过来的随机串clientkey,根据clientkey+serverkey计算出密钥
第三步: [C2GS]客户端根据clientkey+serverkey计算出相同秘钥,加密challenge后发送给服务器,要求校验秘钥
第四步: [GS2C]发送密钥校验结果

源码

服务端源码可见: https://github.com/sundream/ggApp/tree/master/gg/service/gate
客户端对接可参考: https://github.com/sundream/ggApp/tree/master/client/app/client

Clone this wiki locally