介绍
这是一个系列
- 探索 Golang 云原生游戏服务器开发,5 分钟上手 Nano 游戏服务器框架
- 探索 Golang 云原生游戏服务器开发,根据官方示例实战 Gorilla WebSocket 的用法
- 探索 Golang 云原生游戏服务器开发,Nano 内置分布式游戏服务器方案测试用例
- 探索 Golang 云原生游戏服务器开发,Nano 分布式(集群)示例(Distributed Chat)
- 探索 Golang 云原生游戏服务器开发,硬核实战之调试 NanoServer 生产级麻将🀄️游戏服务器
官方文档: 通信协议
nano 协议格式
两层编码
message
route/protobuf压缩- 编码方式可自定义
- 编码结果传递给
package层
package
- 握手过程
- 心跳
- 数据传输编码
- 编码结果可以通过
tcp,websocket等协议传输
协议层
发包
Message>Protobuf/JSON Encoder>Nano Message Encoder>Nano Packet Encoder
解包
Nano Packet Decoder>Nano Message Decoder>Protobuf/JSON Decoder>Message
Nano Package
封装在面向连接的二进制流的通讯协议
控制包
应用层面的控制流程
- 客户端和服务器的握手
- 心跳
- 服务器主动断开连接的通知
数据包
- 客户端和服务器之间传输应用数据
nano 数据包格式
header- 包的类型 type(1 byte)
0x01客户端到服务器的握手请求以及服务器到客户端的握手响应0x02客户端到服务器的握手ack0x03心跳包0x04数据包0x05服务器主动断开连接通知
- 包的长度 length(3 bytes)
- body 内容长度,3个byte的大端整数,因此最大的包长度为2^24个byte
- 包的类型 type(1 byte)
body- 数据内容 body(length bytes)
- 二进制的传输内容
- 数据内容 body(length bytes)
握手 Package
- 握手请求
- 系统部分
sys.version客户端的版本号sys.type客户端的类型
- 用户部分
user用户自定义部分
- 系统部分
- 握手响应
code200成功500失败501客户端版本号不符合
sysheartbeat可选,心跳时间间隔(秒)dict可选,route 字段压缩的映射表protos可选,protobuf压缩的数据定义
user- 可选,用户自定义的握手数据
- 正常握手的流程
—> handshake request(client)<— handshake response(server)—> handshake ack(client)
心跳 Package
- 心跳包的length字段为0,body为空
- 心跳超时时间为2倍的心跳间隔时间
- 心跳的流程
—> heartbeat Client<— heartbeat(wait heartbeat interval)Sever—> next heartbeat (wait heartbeat interval)Client
数据 Package
- 客户端和服务器之间传输数据所用
- body 部分是由上层传下来的任意二进制数据
- package 层不会 对body内容做任何处理
服务器主动断开 Package
- 如:踢掉某个在线玩家
- 会先向客户端发送一个控制消息,然后再断开连接
Nano Message
主要作用是封装消息头
标志位(flag)
flag(1byte)它决定了后面的消息类型和内容的格式preserved(4 bits)预留4位messagetype(3 bits)范围为0~7route(1 bit) 表示 route 是否压缩,影响 route 字段的长度
message id(0~5 bytes)varints 128变长编码,根据值的大小route(0~256 bytes)根据消息类型以及内容的大小
消息类型(Message Type)
flag 字段的第 2-4 位来确定
request----000- | <message id> | <route>
notify----001- | <route>
response----010- | <message id>
push----011- | <route>
路由压缩标志(Route Compression Flag)
[-------0](flag)<length>1 byte | <utf8 string>(route)
[-------1](flag)<route code>(2 bytes)