railgun报文层级

简单的golang游戏服务器框架《railgun》的文档目录索引 使用golang写的框架。 使用了第三方protobuf库作为报文和序列化,关于如何在windows下安装参考:windows下安装golang protobuf 使用了mysql作为数据库,go-mysql-driver作为数据库驱动,具体安装使用参考:一个go语言的轻量级mysql驱动 mysql数据库的下载地址:http://dev.mysql.com/downloads/ 阅读详情


以上最底层的tcp流的单个报文的格式


以下是经过粘包处理后的tcp字节流转为protobuf报文后的protobuf报文层级关系图


这些报文均由定义好的.proto文件通过protoc.exe来自动生成相应的.go文件,特此感谢google爸爸开源了这么好的项目(虽然并不能传到google爸爸的耳朵里),让我这个渣渣能有口饭吃(* ̄3 ̄)╭

 

报文层级1文件Tcp.proto:

这个proto文件里的报文都是与“单个服务器APP结构”图里的网络层相关的

TCPTransferMsg是用于数据传输的报文。

在发送的数据最后一步抵达网络层时,是对TCPTransferMsg使用proto.Marshal进行序列化,然后获取其长度length。以四个字节作为TCP流的报文头,这四个字节的组成一个int32类型的变量,这个变量值为length。

下图就是一个完整报文的TCP字节流的示意图

 

发送的过程就是将一个TCPTransferMsg类型的变量通过proto.Marshal序列化成一个[]byte类型的buff变量后作为body与其buff长度作为head组成一个完整的tcp字节流转为大端网络字节序发送出去

 

接收过程则是,调用net.TCPConn.Read()先读取的头四个字节,作为head,然后再根据head的值取相应的长度的[]byte,然后将这个[]byte通过proto.Unmarshal逆序列化或者还原为一个TCPTransferMsg类型的变量

 

 

TCPSessionCome是当listenManager新建了一个ConnectionSession会话时将会向业务逻辑层发送一个带有connId作为ConnectionSession这个会话唯一标识符的TCPSessionCome类型的报文给业务逻辑层。GateApp和RouterApp这两个用到了listenManager模块的APP需要根据相应的业务逻辑处理这个报文

 

TCPSessionClose是当listenManager结束了一个ConnectionSession会话会向逻辑层发送的报文

 

TCPSessionKick是当逻辑层因为超时,顶号登录,IP黑白名单之类的业务需求而要结束某个会话的时候由逻辑层向网络层发送

 

 

报文层级2文件router.proto和gate.proto

首先router.proto和gate.proto里的所有报文都通过proto.Marshal的方式转化为TCPTransferMsg的报文

以gate.proto的PulseReq为例,不完整代码如下(完整的代码要调用bs_proto.SetBaseKindAndSubId()和bs_proto.CopyBaseExceptKindAndSubId()两个函数,这里为了直观理解这么写):

pulse :=new(bs_gate.PulseReq)
pulse.Base.KinId = bs_types.CMDKindId_IDKindGate
pulse.Base.SubId = bs_gate.CMDID_Gate_IDPulseReq
msg := new(bs_tcp.TCPTransferMsg)
msg.DataKindId = pulse.Base.KindId
msg.DataSubId = pulse.Base.SubId
buf, err := proto.Marshal(req)
if err != nil {
            return nil
} else {
            msg.Data = buf
            return msg
}


Gate.proto:

GateTransferData是这个proto文件里最重要的报文,功能是所有与用户客户端通信交互的报文都proto.Marshal到这个报文的TransferData.data成员变量中

 

Gate.proto的其他报文就不讲了,看注释很容易理解

 

Router.proto:

RouterTransferData是这个proto文件的最重要报文,功能与GateTransferData类似,不同之处是在于GateTransferData是用于GateApp与用户客户端之间的报文通信交互,

而RouterTransferData是用于服务端各个APP之间的通信交互,包括其他APP与GateAPP之间的交互也用RouterTransferData

 

RegisterAppReq是当一个除了routerAPP以外的APP启动时,DialManager模块拨号成功后立即向RouterApp发送的APP注册请求报文,包含了这个APP的apptype和appid的信息(apptype和appid在讲到types.proto会简单说明,然后后面讲解GateApp/RouterApp/以LoginApp为例子的业务型APP的时候可以看到其具体用法)

 

RegisterAppRsp是收到RegisterAppReq请求后的回复报文

 

PS:这里为什么要分为GateTransferData和RouterTransferData两个报文,而不是共用一个?

我的想法是(或者写这个C++框架的我的老大的说法是)

第一,在实际服务器部署时可能会出现routerApp监听的端口并不一定处于内网的安全范围内,可能暴露在外网中,可以被外网扫描。那么如果客户端和服务端用同一个报文,可能会收到直接伪造的报文的攻击。这样分成两种报文,如果外网向routerApp直接发送GateTransferData报文的时候proto.Unmarshal会解析失败并丢弃这个报文。至少增加了一点安全性。

第二,因为RouterTransferData报文比GateTransferData的size要稍微大一点,字段多了几个,把RouterTransferData转为GateTransferData向用户客户端发送时就可以去掉一些不必要字段

 

报文层级3的一般业务报文proto文件

这些报文在服务端APP相互传输的时候都先转为RouterTransferData报文,代码与上面的gate.proto报文转为TCPTransferMsg报文类似。这里就不重复写了

小结:一般业务逻辑的报文是在从服务端APP发往用户客户端时,从报文的角度看,过程是这样的:

BusinessMsg -> RouterTransferData -> TCPTransferMsg -----通过伟大的TCP/IP传到routerApp--->

TCPTransferMsg -> RouterTransferData -> TCPTransferMsg ----RouterApp通过伟大的TCP/IP传到GateApp---->TCPTransferMsg -> RouterTransferData -> GateTransferData -> TCPTransferMsg ------还是伟大的TCP/IP帮助我们神奇地传给了客户端------> TCPTransferMsg -> GateTransferData -> BusinessMsg -> 客户端根据BusinessMsg的值做相应的处理

 

 

 

Types.proto公共报文

多个proto可能公用的message或者enum都声明在types.proto里

 

BaseInfo是最典型的message,目前除了types.proto以外的所有proto文件里的报文都包含了types.BaseInfo类型的base成员变量,每个报文均有base。

以client.proto的LoginReq这个报文为例

 

kind_id = 1;表示这个报文的大类ID,对应的是types.proto的enum CMDKindId下面的值,通常每个enum CMDKindId对应一个proto。

LoginReq.base.kind_id = CMDKindId.IDKindClient

 

sub_id = 2;表示这个报文的小类ID,对应的是相应client.proto里定义的CMDID

LoginReq.base.sub_id = CMDID_Client.IDLoginReq

 

conn_id=3;表示这个报文来自于哪个ConnectionSession会话,在GateApp和RouterApp里有用到

 

gate_conn_id = 4;表示如果这个报文来自于客户端的话,那么gate_conn_id代表这个客户端在GateApp上对应的ConnectionSession会话

如果是发往客户端的话那么gate_conn_id指示GateApp发往哪个客户端,不过通常是通过userId来指示发往哪个客户端,当然发送登录请求的时候Gate并不知道客户端的userId,所以登录回复的时候要告诉GateApp是哪个gate_conn_id上的会话关联的用户客户端登录成功or失败了。如果登录成功了GateApp会记录下这个userId的值并将其与gate_conn_id关联绑定。

 

remote_add = 5;客户端的IP地址和端口,格式为“192.168.1.1:25536”的字符串

 

att_apptype = 6;表示这个报文关联的apptype,在收到的时候代表来源的apptype,在发出去的时候代表目标的apptype,对应的是types.proto的enum EnumAppType下面的值

当客户端发送登录请求LoginReq给服务端时

LoginReq.base.att_apptype = EnumAppType.Login

 

att_appid = 7; 表示这个报文关联的appid,在收到的时候代表来源的appid,在发出去的时候代表目标的appid。Appid是由程序猿自己整理的约定的表,只要值在uint32范围内就行了。但是值0,1,2是保留的有特殊含义的。对应的是types.proto的EnumAppId。Send2All = 1表示发送到所有,这里的所有指的并不是无差别的所有APP,而是根据AppType来发送的。就是属于同种appType的APP都发送,假设现在有3个GateApp和1个LoginApp连着Router,那么当DestAppType=Gate, DestAppId=Send2All的时候就是这个报文向3个GateApp都发送一次,而不会向LoginApp发送

Send2AnyOne=2是随机向确定appType的某个App发送,假设有2个LoginApp,那么就随机选一个发送,如果只有1个就只向这个发送

 

 

PS:建议APPID表10以下都不用了,说不定以后3,4,5也需要作为保留值。以现在APP举例,

GateApp的APPID = 101,RouterApp的APPID = 50,LoginApp的APPID = 30,这些数值由程序猿自己建个excel文档约定,只要保证不重复就行了。

不过实际上我对于GateApp这种会有多个的APP群,会把APPID从1000到1500的号码段都分配给他


我的邮箱:914509007@qq.com

railgun:通过代码来简单说明 在说明之前我先展示一下我的工程目录层级,因为我连github有点慢,所以像protoc.exe这样上了1M的文件就不传了。所以如果从github上获取源码的同学可能还需要再去我的百度云盘上获取build.bat和protoc.exe。百度云盘链接:http://pan.baidu.com/s/1dFebn25 密码:oq2h,当然用linux的同学需要自己再另外获取protoc和自己写build 阅读详情

相关推荐

通信与协议Netty+Protobuf-游戏设计与开发(1)配套代码

通信与协议Netty+Protobuf-游戏设计与开发(1)配套代码

序列化结构(protobuf)实现一个TCP服务器(C++)

1、首先建立proto文件,syntax如果不标明proto3,则会默认使用proto2版本,在后面的使用过程中需要加上包名,以防止命名空间冲突,消息体中的序号表明在序列化数据中该变量出现的顺序。当服务端两次使用同一个端口号,会出现Error on binding,这是同一时间在同一端口上启动两个TCP服务器,第二个服务器会收到端口已被占用的错误,并且无法绑定到该端口上。2、编写服务端,编辑 g++ -o server server.cpp message.pb.cc -lprotobuf。

qq_41452177的博客 1011

Python3.11安装fairseq避坑指南:解决dataclasses兼容性问题(附详细代码修改)

本文详细解析了在Python 3.11环境下安装Fairseq时因dataclasses模块规则变更导致的安装失败问题。通过定位核心配置文件,将`default=SomeConfig()`修改为`default_factory=SomeConfig`,并调整依赖版本,提供了从源码修改到环境验证的完整解决方案,确保Fairseq顺利运行。

weixin_29098367的博客 495

【Android Protobuf 序列化】Protobuf 服务器与客户端通信 ( TCP 通信中使用 Protobuf )

一、TCP 粘包和分包、 二、TCP 粘包和分包解决方案、 三、客户端 Android 应用使用 Protobuf、 四、服务器端 Java 服务器使用 Protobuf、 五、参考资料、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1902

StarRocks FE启动异常

服务器断电,StarRocks FE 启动失败。

qq_15138049的博客 1113

【MATLAB】绘制泽尼克多项式

上次只给了公式没有给代码,很多小伙伴表示不是很认可。今天直接把代码发上来了。

HPC_ZY 5577

基于ProtoBuf协议实现网络传输(三)

Unity版本: 5.3 使用语言: C# 写在前面 ProtoBuf是Google公司推出的一种二进制序列化工具,适用于数据的网络传输。 基于Socket实现时时通信,关于数据粘包的编码和解码处理是必不可少的。 实现功能: 1.基于ProtoBuf序列化对象 2.使用Socket实现时时通信 3.数据包的编码和解码 3.

mrzhengttl的博客 2822

问题:dpkg-deb: error: paste subprocess was killed by signal (Broken pipe)

 1. 问题:Ubuntu安装软件的过程中出现依赖项的问题 “E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).” 按照指示执行如下两条命令都没有解决问题。 sudo apt-get -f install sudo apt-get --fix-broken ...

gloria_littlechi的博客 2万+

【小沐学前端】Node.js实现基于Protobuf协议的UDP通信(UDP/TCP)

Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。Node.js 是一个开源和跨平台的 JavaScript 运行时环境。它是几乎任何类型项目的流行工具!Node.js 在浏览器之外运行 V8 JavaScript 引擎(Google Chrome 的内核)。这使得 Node.js 非常高效。Node.js 应用在单个进程中运行,无需为每个请求创建新线程。

爱看书的小沐 3507

安装 miniconda linux

安装 miniconda linux

jacke121的专栏 1万+

基于 YOLOv26 的校园安全监控系统:多场景应用

本文提出了一种基于YOLOv26的校园安全监控系统,采用多场景应用架构实现对校园安全的智能监测。系统核心技术包括YOLOv26目标检测、DeepSORT目标跟踪、区域安全定义和行为分析等模块,通过边缘计算平台实现实时处理。研究构建了包含多种校园场景的专业数据集,并采用数据增强技术提升模型性能。系统可检测人员、车辆和物品等目标,分析其行为轨迹,评估安全风险并触发告警。实验结果表明,该系统能有效识别校园安全隐患,为安全管理提供智能化解决方案。

一键难忘的博客 503

Cloudflare-PHP高级技巧:自定义主机名与Railgun加速配置教程

Cloudflare-PHP是一款强大的PHP库,专为Cloudflare v4 API设计,帮助开发者轻松管理Cloudflare服务。本文将分享两个提升网站性能的高级技巧:自定义主机名配置与Railgun加速设置,让你的网站访问速度更快、管理更灵活! ## 一、自定义主机名:打造专业域名管理方案 ### 1.1 什么是自定义主机名? 自定义主机名功能允许你在Cloudflare上为域名添

gitblog_00194的博客 1093

【VTKExamples::PolyData】第十六期 GradientFilter

本文分享VTK样例GradientFilter,并解析接口vtkGradientFilter & vtkAssignAttribute,希望对各位小伙伴有所帮助!

qq_40041064的博客 319

Mocha and Railgun(几何规律)

来源:牛客网。

m0_63054077的博客 962

zabbix深度监控之邮件告警、微信群和微信告警

本文详细介绍了Zabbix监控系统实现邮件告警和微信告警的配置方法。邮件告警部分包含QQ和163邮箱的SMTP服务器配置、消息模板设置、告警流程三步骤(媒介配置、触发器动作、用户设置)。微信告警分为两种方式:企业微信群机器人告警(通过webhook实现)和企业微信应用告警(需创建应用并获取API参数)。两种告警方式都提供了完整的配置流程,包括脚本编写、权限设置、消息模板定制等关键步骤,并特别说明了如何使个人微信接收企业微信告警消息。文章还对比了SMTP、POP3、IMAP三种邮件协议的差异及适用场景。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 816

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Metasploit框架中Railgun的Windows后渗透利用指南

Metasploit框架中Railgun的Windows后渗透利用指南 【免费下载链接】metasploit-framework Metasploit Framework 项目地址: https://gitcode.com/gh_...

gitblog_00159的博客 502

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

一款集成度高的渗透工具:Railgun

Railgun为一款GUI界面的渗透工具,将部分人工经验转换为自动化,集成了渗透过程中常用到的一些功能 目前集成了端口扫描、端口爆破、web指纹扫描、漏洞扫描、漏洞利用以及编码转换功能。 信息收集 端口扫描 界面如下 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LjQyOIhY-1623550020985)(https://image.3001.net/images/20210517/1621256630_60a269b634375ad903802.png!small)]

深入交流学习:webMsec 7764

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【亲测免费】 Railgun:一款高效、灵活的前端性能优化工具

Railgun:一款高效、灵活的前端性能优化工具 在现代Web开发中,提高页面加载速度和用户体验是至关重要的。 是一个致力于此目标的开源项目,它通过缓存和预加载策略帮助提升前端应用的启动速度。这篇文章将深入探讨Railgun的技术原理、应用场景及其独特之处。 项目简介 Railgun是一个基于JavaScript的小型库,它可以集成到你的前端应用中,通过智能地缓存静态资源并预先加载未来可能需要的内...

gitblog_00074的博客 1003

Mocha and Railgun

来源:牛客网。

qq_51574958的博客 193

railgun渗透工具使用说明书-1.3.81下载仓库

railgun渗透工具使用说明书-1.3.81下载仓库 【下载地址】railgun渗透工具使用说明书-1.3.81下载仓库 Railgun是一款专为64位系统设计的高效渗透工具,集安全性与便捷性于一体。它配备了启动密码,确保工具使用的安全性,同时通过托盘操作功能,用户可轻松管理程序,即使关闭主窗口也能继续运行。Railg...

gitblog_06769的博客 600

railgun单个服务器APP的结构

这里是单个服务器APP的结构图 红色模块表示此模块可有可无 黄色模块表示是至少要有一个 蓝色模块表示一定要有 回到之前的架构图,GATEAPP是有(1)(2)(3)(5)模块,ROUTERAPP是有(1)(3)(5)模块, 一般业务模块是必有(2)(3)(5)模块,(4)(6)模块如果需要连数据库就会有不连数据库就没有   模块1:package ListenManager是网络监听

easy_mind的博客 1126

railgun渗透工具使用说明书-1.3.81下载仓库:一款强大的安全测试工具

railgun渗透工具使用说明书-1.3.81下载仓库:一款强大的安全测试工具 在网络安全领域,安全测试工具的使用越来越普及,其中railgun安全测试工具以其独特的设计和强大的功能,受到了众多安全专家的喜爱。本文将为您详细介绍railgun的核心功能、技术分析、应用场景和项目特点,让您更好地了解和使用这款优秀的开源项目。 项目介绍 railgun是一款专为64位系统设计的安全测试工具。它具有启动...

gitblog_06718的博客 892

工具分享 | Railgun - 一款GUI界面的渗透工具,渗透必备,SRC挖掘必备,漏洞挖掘必备,红队必备。

工具分享 | Railgun - 一款GUI界面的渗透工具,渗透必备,SRC挖掘必备,漏洞挖掘必备,红队必备。

IT软件汇 1957

railgun项目的不足和将来会逐步新增的模块

不足: 1.数据库操作的封装模块没有考虑sql注入的问题,golang讨论群里的大神说我这个可能会存在sql注入风险。如果有需要将来可能会写个sql语句关键字过滤器,来过用户输入里的滤掉诸如and or select delete之类的关键字(我对这个问题研究不是很深所以不确定) 2.routeragent没有正式处理RegisterAppRsp,还是因为有些业务代码尚待剥离 3.现在基本上

easy_mind的博客 859

一款GUI界面的渗透工具-railgun

Railgun为一款GUI界面的渗透工具,将部分人工经验转换为自动化,集成了渗透过程中常用到的一些功能,目前集成了端口扫描、端口爆破、web指纹扫描、漏洞扫描、漏洞利用以及编码转换功能,后续会持续更新。

SuperherRo的博客 5619

2024红队必备工具列表总结_railgun工具

一款适用于以HVV行动/红队/渗透测试团队为场景的移动端(Android、iOS、WEB、H5、静态网站)信息收集扫描工具,可以帮助渗透测试工程师、红队成员快速收集到移动端或者静态WEB站点中关键的资产信息并提供基本的信息输出,如:Title、Domain、CDN、指纹信息、状态信息等。内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

程序员阿飘 的博客 2086
上一篇: railgun单个服务器APP的结构
下一篇: railgun:通过代码来简单说明
easy_mind
博客等级 码龄10年 5粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值