Gsky游戏服务器框架介绍 2
Last Update:
Word Count:
Read Time:
Gsky游戏服务器框架介绍 2
最近跟新了许多代码,目前代码框架如下:
1 |
|
这几天主要是完善 pp (pwnsky protocol)二进制加密传输协议,还有该框架的拓展性。
pp 协议,全称为 pwnsky protocol, 是一款吸收http部分特性的一款二进制传输协议,主要用于游戏长连接交互协议,目前基于tcp来实现。
该协议头部只占16字节,相对与http更小,由于协议字段都在固定位置,解析起来更快速。
pp协议中定义有状态码,数据类型,数据长度,请求路由。
采用 pwnsky encryption进行数据加密,由服务端随机生成8字节密钥返回给客户端,客户端接收到之后,在断开之前传输数据都采用该密钥进行加解密。
pp协议是我自己根据http特点来压缩而来的,头部大小只有16字节,目前头部定义字段如下:
1 |
|
magic: 协议标识,两字节为 “\x50\x50”
status: 状态码,包含客户端请求状态码与服务端响应状态码。
type: 传输数据类型,类似与http中的Content-Type
length: 数据长度
route: 请求路由,类似于http url中的path
code: 校验码,用于检测传输内容是否符合加密规范。
pp协议目前 c++ 定义如下,后面不断完善协议:
1 |
|
采用pp协议的gsky服务器连接与客户端过程:
客户端发起获取密钥连接请求
服务端随机生成8字节密钥和2字节code (校验码),并采用PE (Pwnsky Encryption)以全0的8字节的密钥对内容部分进行加密,也对pp协议头部后8字节也进行单独加密。
客户端收到数据,采用全0 的8字节密钥分别解密协议头部后8字节与内容密钥部分,将其code与密钥储存。
客户端发送数据,在协议头部的code值设置为之前服务端发送过来的code,再分别对内容与头部后8字节采用服服务端发送过来的密钥进行加密,再发送给服务端。
服务端接收数据,采用自己的密钥先进行协议头部后8字节解密,检验code值是否正确,正确之后再根据长度接收数据内容与解密数据内容。
大体上连接与传输过程就是这么回事,客户端若不进行密钥获取的话,服务端接收到数据后是直接断开连接的。
那至于为什么要对协议头部后8字节进行加密,协议头部后8字节包含了 6字节的route与2字节的code,route相当于请求路径,也不希望攻击者通过抓包看到的,所以route有必要进行加盟,code是校验值,有一定程度检测数据与密钥的正确性。
上面提到了PE加密,PE加密是自己先暂时写的一个对称加密算法,比较简单,采用密钥轮加变换单字节单字节的异或数据,密码算法简单的目的也是处于服务器的处理效率考虑,目前加解密c++实现如下:
1 |
|
1 |
|
协议拓展部分,为了更方便的自定义传输协议,我对框架进行了比较大的整改,在net模块目前有:
1 |
|
上面部分主要是从net::socket类进行协议的分支,该类主要是相当与一个epoll架构的单纯tcp套接子处理,基于tcp之上,再对数据进行协议解析,为了让库更好的拓展,我特意模仿了golang语言中的http库写了两个类request类和response类,request类是存储客户端请求信息,response类是让数据发送给客户端的封装接口。
目前来说pp协议服务端已经基本差不多了,只是pp协议客户端还有待实现一下sdk,方便接入gsky服务器。