libgsc的通信协议设计
来源:互联网 发布:网络预约挂号流程 编辑:程序博客网 时间:2024/05/23 09:34
一共定义了三种类型的报文, 请求, 响应, 通知. 从以往的项目经验来看, 万变不离其宗. 由于应用层使用protobuf进行承载, 所以也比较简单.
一. 请求(LIBGSC_PDU_REQ)
请求消息由客户端向libgsc服务器发送, 且客户端只能发送request. 且request只能由客户端发起. 换句话说, libgsc服务器对于客户端
上行的非request报文均视为非法. 且libgsc服务器不会向客户端发起request. 结构如下:
typedef struct{ uint len; uint tid; ushort cmd; union { uchar* pb; struct { uint pblen; uchar* pbx; uchar* ext; }; };} libgsc_pdu_req;request一共是四个或六个字段, 只有前三个是必选的:
1). len. 表示了整个报文的长度, 包括len字段自己的4个字节在内. 以网络字节序传递. 第29 ~ 32位被征用, 因此, 理论上一个request报文的
最大长度是0x0FFFFFFF, 足够使用了. 第32 ~ 31位: 00表示请求报文, 01表示响应报文, 10表示通知报文. 第30 ~ 29位: 00表示没有extension
部分. 01表示有extension部分.
2). tid. 事务id, 由request发起方生成并维护, 四个字节, 以网络字节序传递. 因此一个连接上的可并发的事务数为0x100000000个.
3). cmd, 命令字, 用于业务指示, 两个字节, 以网络字节序传递. 因此应用层可最多定义0x10000个命令字.
4). pb, 序列化后的pb对象. 可选, 仅当len字段中的30~29位为00时, 才可能存在.
5,6,7). 仅当len字段中的30~29位为01时, 才可能存在. pblen表示下面序列化后pb对象的长度, 四个字节, 以网络字节序传递. 允许为0. ext为
extension部分, 是一段自定义结构的字节流. extension引入的本意是弥补pb脚本定义在业务承载上的滞后.
二. 响应(LIBGSC_PDU_RSP)
响应消息是libgsc服务器向客户端之前request的响应, 一对request/response通过同一个tid进行关联. libgsc服务器在收到一个请求后, 总是应该
返回一个响应. 但是健壮的客户端应该自己负责事务上的超时, 即如果收不到服务器的响应, 就应该在本地触发一个超时, 用以结束事务. response
报文结构如下:
typedef struct{ uint len; uint tid; ushort ret; union { uchar* pb; struct { uint pblen; uchar* pbx; uchar* ext; }; };} libgsc_pdu_rsp;响应与请求在结构上的唯一区别是, cmd被替换成了一个返回值ret. 用于表示服务器对请求消息的处理结果.
三. 通知(LIBGSC_PDU_NOT)
通知总是且只能由libgsc服务器发起, 通知消息不期待客户端的反馈, 因此没有事务id. 仅有一个命令字和可选的消息正文.
结构如下:
typedef struct{ uint len; ushort cmd; union { uchar* pb; struct { uint pblen; uchar* pbx; uchar* ext; }; };} libgsc_pdu_not;
- libgsc的通信协议设计
- libgsc的java实现
- 飞鸽传书的通信协议设计思路
- 通信协议设计
- 如何设计两个系统之间的通信协议
- 协议设计:简单通信协议的心跳
- 设计一个简单的socket通信协议
- 自己设计系统之间的通信协议
- RS485总线通信协议的设计与实现
- 单片机通信协议设计
- 单片机通信协议设计
- 自己设计通信协议
- 自定义通信协议设计基础
- 通信协议设计注意事项
- 单片机通信协议设计
- 自定义通信协议设计基础
- Arduino通信协议设计
- 亲历的几个糟糕的应用层通信协议设计
- 基于JNDI的birt数据配置
- Fedora安装resin4
- Java文件操作工具类
- Netty5入门学习笔记003-TCP粘包/拆包问题的解决之道(下)
- 白话机器学习算法(五)自组织映射SOM
- libgsc的通信协议设计
- 序列化手段(1)——parcel例子详解
- 白话机器学习算法(六) PCA
- Netty5 时间服务器 有粘包问题
- PS基本概念
- CDC和HDC的区别与转换
- 利用redis + lua解决抢红包高并发的问题
- Netty与Reactor模式
- 白话机器学习算法(七)LDA