前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >探索 Golang 云原生游戏服务器开发,3 分钟快速理解 Nano 通信协议(内含记忆脑图)

探索 Golang 云原生游戏服务器开发,3 分钟快速理解 Nano 通信协议(内含记忆脑图)

作者头像
为少
发布2021-05-27 19:07:03
1.3K0
发布2021-05-27 19:07:03
举报

介绍

这是一个系列

  1. 探索 Golang 云原生游戏服务器开发,5 分钟上手 Nano 游戏服务器框架
  2. 探索 Golang 云原生游戏服务器开发,根据官方示例实战 Gorilla WebSocket 的用法
  3. 探索 Nano 内置分布式游戏服务器方案测试用例
  4. 探索 Nano 分布式(集群)示例(Distributed Chat)
  5. 探索 Golang 云原生游戏服务器开发,硬核实战之调试 NanoServer 生产级麻将游戏服务器

nano 协议格式

两层编码

message

  • route/protobuf 压缩
  • 编码方式可自定义
  • 编码结果传递给 package

package

  • 握手过程
  • 心跳
  • 数据传输编码
  • 编码结果可以通过 tcpwebsocket 等协议传输

协议层

发包

  • 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 客户端到服务器的握手ack
    • 0x03 心跳包
    • 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~7
    • route(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)

官方文档:

  • https://github.com/lonng/nano/blob/master/docs/communication_protocol_zh_CN.md
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 黑客下午茶 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
    • 这是一个系列
    • nano 协议格式
      • 两层编码
        • 协议层
        • Nano Package
          • 控制包
            • 数据包
              • nano 数据包格式
                • 握手 Package
                  • 心跳 Package
                    • 数据 Package
                      • 服务器主动断开 Package
                      • Nano Message
                        • 标志位(flag)
                          • 消息类型(Message Type)
                            • 路由压缩标志(Route Compression Flag)
                            相关产品与服务
                            文件存储
                            文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档