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;


0 0
原创粉丝点击