-
Notifications
You must be signed in to change notification settings - Fork 41
客户端对接服务器
- 完整包格式
+----+----+
|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是一个纯算法协议,在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是基于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