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

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

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)
相关文章
|
10月前
|
存储 网络协议 Go
学习golang(1) 初探:写一个简单的TCP服务器
学习golang(1) 初探:写一个简单的TCP服务器
82 0
|
JavaScript 算法 前端开发
探索使用 Golang 和 Webassembly 构建一个多人游戏服务器
探索使用 Golang 和 Webassembly 构建一个多人游戏服务器
342 0
探索使用 Golang 和 Webassembly 构建一个多人游戏服务器
|
Kubernetes Cloud Native Devops
云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第7篇
云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第7篇
221 0
云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第7篇
|
Kubernetes Cloud Native Devops
云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第4篇
云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第4篇
257 0
云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第4篇
|
Cloud Native Devops Go
云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第1篇(二)
云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第1篇(二)
175 0
云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第1篇(二)
|
Cloud Native Devops 关系型数据库
云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第1篇(一)
云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第1篇(一)
201 0
云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第1篇(一)
|
Kubernetes Devops 关系型数据库
生产级Golang麻将游戏服务器 NanoServer 二次开发,利用Drone CI/CD打通DevOps上 K8S 迭代流程
生产级Golang麻将游戏服务器 NanoServer 二次开发,利用Drone CI/CD打通DevOps上 K8S 迭代流程
605 0
生产级Golang麻将游戏服务器 NanoServer 二次开发,利用Drone CI/CD打通DevOps上 K8S 迭代流程
|
存储 自然语言处理 前端开发
初探 Watermill 构建 Golang 事件驱动程序,SSE 进行 HTTP 服务器推送
初探 Watermill 构建 Golang 事件驱动程序,SSE 进行 HTTP 服务器推送
628 0
初探 Watermill 构建 Golang 事件驱动程序,SSE 进行 HTTP 服务器推送
|
存储 Cloud Native 应用服务中间件
Golang 云原生分布式社交游戏服务器,Nakama Server 简介
Golang 云原生分布式社交游戏服务器,Nakama Server 简介
1178 0
|
Cloud Native 前端开发 Go
探索 Golang 云原生游戏服务器开发,根据官方示例实战 Gorilla WebSocket 的用法
探索 Golang 云原生游戏服务器开发,根据官方示例实战 Gorilla WebSocket 的用法
627 0

热门文章

最新文章