1.私有协议栈定义

通讯协议从广义上区分,可以分为公有协议和私有协议。公有协议是由公共的组织或机构公开定义的具有通用性的协议。而私有协议一般是某个公司或组织内部使用的协议,按需定制,不具有公开性。绝大多数的私有协议都是基于TCP/IP基础上定义的。
私有协议并没有标准的定义,只要能够进行跨进程、跨主机的数据交换,这些非标准的协议都可以称为私有协议。

2.Netty协议栈

Netty协议栈用于Netty内部各个模块之间的通讯,基于TCP/IP设计,类似HTTP协议,相比传统的协议栈,更加轻巧和灵活。

2.1 场景描述

在Netty协议栈的应用中,通讯的双方角色不是固定的,没有固定的服务端和客户端之分,谁先发起连接,谁就是客户端,通信的另外一方就是服务端。角色完全取决于本次通讯的业务场景。

2.2 功能描述

  1. 基于Netty的NIO通讯框架,提供高性能的异步通讯能力;
  2. 提供消息的编解码框架,能够实现POJO对象的序列化和反序列化;
  3. 提供基于IP白名单的接入认证方式;
  4. 链路的有效性校验;
  5. 链路的断线重连机制;

2.3 通讯模型

Netty之私有协议栈开发(一)
注:
服务端会在客户端发起握手请求时,进行消息的合法性校验,包括节点的ID有效性校验,节点重复登录校验,IP地址合法性校验等,校验通过后会返回握手应答。

另外需要说明的是:
Netty协议栈在通讯期间是全双工通讯,无论何时,通讯双方都可以主动向对对方发送消息。
双发的心跳检测使用ping/pong的方式,当通讯链路空闲时,客户端主动发送ping到服务方,服务端收到ping请求后,回复pong给客户端。如果客户端连续发送N条ping到服务端都没有收到应答,说明链路挂死或者服务端异常,客户端主动关闭连接。间隔周期T后,再发起重连,知道重连成功。

2.3 消息定义:

Netty协议传输消息报文分为两部分:报文头和报文体。格式分别如下:
表1:Netty协议报文头

名称 类型 长度 含义
crcCode int 32 校验码,由三部分组成:0xABEF+主版本号+次版本号
length int 32 消息长度,包含消息头和消息体
sessionID long 64 集群内全局唯一,由会话ID生成器生成
type Byte 8 0:业务请求消息
1:业务响应消息
2:业务one way消息
3:握手请求消息
4:握手应答消息
5:心跳请求消息
6:心跳应答消息
priority Byte 8 消息优先级:0~255
attachment Map<String,Object> 变长 可选字段,用于扩展

表2:Netty支持的字段类型

类型 备注
boolean 包括它的包装类型Integer
byte 包括它的包装类型Byte
int 对应C/C++的int32
char 对应它的包装类型Character
short 对应C/C++的int16
long 对应C/C++的int64
float 包括它的包装类型Float
double 包括它的包装类型Double
string 对应C/C++的String
list 支持各种list的实现
array 支持各种数组的实现
map 支持Map的嵌套和泛型
set 支持Set的嵌套和泛型

相关文章: