1.私有协议栈定义
通讯协议从广义上区分,可以分为公有协议和私有协议。公有协议是由公共的组织或机构公开定义的具有通用性的协议。而私有协议一般是某个公司或组织内部使用的协议,按需定制,不具有公开性。绝大多数的私有协议都是基于TCP/IP基础上定义的。
私有协议并没有标准的定义,只要能够进行跨进程、跨主机的数据交换,这些非标准的协议都可以称为私有协议。
2.Netty协议栈
Netty协议栈用于Netty内部各个模块之间的通讯,基于TCP/IP设计,类似HTTP协议,相比传统的协议栈,更加轻巧和灵活。
2.1 场景描述
在Netty协议栈的应用中,通讯的双方角色不是固定的,没有固定的服务端和客户端之分,谁先发起连接,谁就是客户端,通信的另外一方就是服务端。角色完全取决于本次通讯的业务场景。
2.2 功能描述
- 基于Netty的NIO通讯框架,提供高性能的异步通讯能力;
- 提供消息的编解码框架,能够实现POJO对象的序列化和反序列化;
- 提供基于IP白名单的接入认证方式;
- 链路的有效性校验;
- 链路的断线重连机制;
2.3 通讯模型
注:
服务端会在客户端发起握手请求时,进行消息的合法性校验,包括节点的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的嵌套和泛型 |