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
- body 内容长度,3个byte的大端整数,因此最大的包长度为2^24个byte
0x01
客户端到服务器的握手请求以及服务器到客户端的握手响应0x02
客户端到服务器的握手ack0x03
心跳包0x04
数据包0x05
服务器主动断开连接通知- 包的类型 type(1 byte)
- 包的长度 length(3 bytes)
body
- 二进制的传输内容
- 数据内容 body(length bytes)
握手 Package
- 握手请求
user
用户自定义部分sys.version
客户端的版本号sys.type
客户端的类型- 系统部分
- 用户部分
- 握手响应
- 可选,用户自定义的握手数据
heartbeat
可选,心跳时间间隔(秒)dict
可选,route 字段压缩的映射表protos
可选,protobuf压缩的数据定义200
成功500
失败501
客户端版本号不符合code
sys
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位message
type(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)