priProto 基于netty5基于私有协议栈设计

通讯模型

具体步骤如下。

(1)Netty协议栈客户端发送握手请求消息,携带节点ID等有效身份认证信息;

(2)Netty协议栈服务端对握手请求消息进行合法性校验,包括节点ID有效性校验、节点重复登录校验和IP地址合法性校验,校验通过后,返回登录成功的握手应答消息;

(3)链路建立成功之后,客户端发送业务消息;

(4)链路成功之后,服务端发送心跳消息;

(5)链路建立成功之后,客户端发送心跳消息;

(6)链路建立成功之后,服务端发送业务消息;

(7)服务端退出时,服务端关闭连接,客户端感知对方关闭连接后,被动关闭客户端连接。

消息定义

Netty协议栈消息定义包含两部分:

•消息头;

•消息体。

public class NettyMessage {

private Header header; //消息头

private Object body; //消息体

public class Header {

private int crcCode = 0xabef0101; //校验码+协议号+版本号

private int length; //消息长度

private long sessionID; //会话id

private byte type; //消息类型

private byte priority; //消息优先级

private Map attachment = new HashMap();//消息附件

public enum MessageType {

SERVICE_REQ((byte) 0),//业务请求

SERVICE_RESP((byte) 1),//业务响应

LOGIN_REQ((byte) 3), //登陆请求

LOGIN_RESP((byte) 4),//登陆响应

HEARTBEAT_REQ((byte) 5),//心跳请求

HEARTBEAT_RESP((byte) 6);//心跳响应

链路的建立

客户端与服务端链路建立成功之后,由客户端发送握手请求消息,握手请求消息的定义如下。

(1)消息头的type字段值为3;

(2)可选附件为个数为0;

(3)消息体为空;

(4)握手消息的长度为22个字节。服务端接收到客户端的握手请求消息之后,如果IP校验通过,返回握手成功应答消息给客户端,应用层链路建立成功。握手应答消息定义如下。

服务端接收到客户端的握手请求消息之后,如果IP校验通过,返回握手成功应答消息给客户端,应用层链路建立成功。握手应答消息定义如下。

(1)消息头的type字段值为4;

(2)可选附件个数为0;

(3)消息体为byte类型的结果,“0”表示认证成功;“-1”表示认证失败。链路建立成功之后,客户端和服务端就可以互相发送业务消息了。

可靠性设计

心跳机制

具体的设计思路如下。

(1)当网络处于空闲状态持续时间达到T(连续周期T没有读写消息)时,客户端主动发送Ping心跳消息给服务端。

(2)如果在下一个周期T到来时客户端没有收到对方发送的Pong心跳应答消息或者读取到服务端发送的其他业务消息,则心跳失败计数器加1。

(3)每当客户端接收到服务的业务消息或者Pong应答消息时,将心跳失败计数器清零;连续N次没有接收到服务端的Pong消息或者业务消息,则关闭链路,间隔INTERVAL时间后发起重连操作。

(4)服务端网络空闲状态持续时间达到T后,服务端将心跳失败计数器加1;只要接收到客户端发送的Ping消息或者其他业务消息,计数器清零。

(5)服务端连续N次没有接收到客户端的Ping消息或者其他业务消息,则关闭链路,释放资源,等待客户端重连。

通过Ping-Pong双向心跳机制,可以保证无论通信哪一方出现网络故障,都能被及时地检测出来。为了防止由于对方短时间内繁忙没有及时返回应答造成的误判,只有连续N次心跳检测都失败才认定链路已经损害,需要关闭链路并重建链路。

重连机制

如果链路中断,等待INTERVAL时间后,由客户端发起重连操作,如果重连失败,间隔周期INTERVAL后再次发起重连,直到重连成功。

为了保证服务端能够有充足的时间释放句柄资源,在首次断连时客户端需要等待INTERVAL时间之后再发起重连,而不是失败后就立即重连。

为了保证句柄资源能够及时释放,无论什么场景下的重连失败,客户端都必须保证自身的资源被及时释放,包括但不限于SocketChannel、Socket等。

重连失败后,需要打印异常堆栈信息,方便后续的问题定位。

重复登录保护

当客户端握手成功之后,在链路处于正常状态下,不允许客户端重复登录,以防止客户端在异常状态下反复重连导致句柄资源被耗尽。

服务端接收到客户端的握手请求消息之后,首先对IP地址进行合法性检验,如果校验成功,在缓存的地址表中查看客户端是否已经登录,如果已经登录,则拒绝重复登录,返回错误码-1,同时关闭TCP链路,并在服务端的日志中打印握手失败的原因。

客户端接收到握手失败的应答消息之后,关闭客户端的TCP连接,等待INTERVAL时间之后,再次发起TCP连接,直到认证成功。

为了防止由服务端和客户端对链路状态理解不一致导致的客户端无法握手成功的问题,当服务端连续N次心跳超时之后需要主动关闭链路,清空该客户端的地址缓存信息,以保证后续该客户端可以重连成功,防止被重复登录保护机制拒绝掉。

安全性设计

为了保证整个集群环境的安全,内部长连接采用基于IP地址的安全认证机制,服务端对握手请求消息的IP地址进行合法性校验:如果在白名单之内,则校验通过;否则,拒绝对方连接。

如果将Netty协议栈放到公网中使用,需要采用更加严格的安全认证机制,例如基于密钥和AES加密的用户名+密码认证机制,也可以采用SSL/TSL安全传输。

作为示例程序,Netty协议栈采用最简单的基于IP地址的白名单安全认证机制。

可扩展性设计

Netty协议需要具备一定的扩展能力,业务可以在消息头中自定义业务域字段,例如消息流水号、业务自定义消息头等。通过Netty消息头中的可选附件attachment字段,业务可以方便地进行自定义扩展。

Netty协议栈架构需要具备一定的扩展能力,例如统一的消息拦截、接口日志、安全、加解密等可以被方便地添加和删除,不需要修改之前的逻辑代码,类似Servlet的Filter Chain和AOP,但考虑到性能因素,不推荐通过AOP来实现功能的扩展。

java私有协议开发_priProto 基于netty5基于私有协议栈设计相关推荐

  1. java企业级应用开发项目总结报告,基于Java软件项目开发岗位的企业实践总结报告...

    D ISCUSSI ON 丨交流平台 基于Ja va软件项 目 开发 岗位的企业实践总结报告 文/ 卜 令瑞 摘 要 : 为 进 一 步 加 强 职 业 学校 " 双 师 型 " ...

  2. java beandw_【开发童鞋福音】基于数据库的自动化生成工具-TableGo,生成JavaBean、数据库文档等等...

    [Java] 纯文本查看 复制代码/* * Welcome to use the TableGo Tools. * * http://vipbooks.iteye.com * http://blog. ...

  3. java tlv协议_看懂通信协议:自定义通信协议设计之TLV编码应用

    因为之前从事过电信信令类工作,接触较多的则是ASN.1中的BER.PER编码,其中BER是基于TLV方式进行编码,本文主要介绍一下TLV在自定义协议中的应用. 通过该文章,你可以肉眼看懂一些类似二进制 ...

  4. 基于Netty实现TCP私有协议

    什么是协议 从生活角度去理解:协议大部分情况下是指两个或两个以上实体为了开展某项活动,经过协商后双方达成的一致意见.例如租房合同协议.劳动合同协议等. 从互联网角度去理解:协议是指网络通信的参与方必须 ...

  5. java毕业设计——基于Java+Java ME的无线网络移动端的俄罗斯方块游戏设计与实现(毕业论文+程序源码)——俄罗斯方块游戏

    基于Java+Java ME的无线网络移动端的俄罗斯方块游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Java+Java ME的无线网络移动端的俄罗斯方块游戏设计与实现,文章末尾附有 ...

  6. java拼图游戏系统总体方案_基于JAVA的拼图游戏的设计与实现(含录像)

    基于的拼图游戏的设计与实现(含录像)(任务书,开题报告,中期检查表,外文翻译,毕业论文15500字,程序代码,答辩PPT,答辩视频录像) 摘  要 在我们日常生活中,有很多的益智类游戏,如七巧板,21 ...

  7. Lua脚本编写Wireshark插件解析第三方私有协议

    一.工控私有协议 在工控系统中通信协议存在众多标准,也存在众多私有协议,如果你有过使用组态软件的经历,你便会发现,在第一步连接设备时除连接设备的方式有以太网/串行等方式外,各家基本上都存在自己的私有通 ...

  8. java实现基于SGIP协议开发联通短信的方法

    本文实例讲述了java实现基于SGIP协议开发联通短信的方法.分享给大家供大家参考.具体如下: 近段时间,由于公司的业务需要,开发出了联通短信.此文章的编写也是根据网上的一些示例来完成的.闲话少说,下 ...

  9. 基于java spring框架开发部标1078视频监控平台精华文章索引

    部标1078视频监控平台,是一个庞杂的工程,涵盖了多层协议,部标jt808,jt809,jt1078,苏标Adas协议等,多个平台功能标准,部标796标准,部标1077标准和苏标主动安全标准,视频方面 ...

  10. 基于Java与MySQL开发的在线考试系统

    1 概述 1.1 简介 在Exam++考试系统第一版的基础上,我们对ExamStack V2.0进行了大量代码重构,同时也对数据模型做了部分调整.为了减小学员考试交卷时大量并发带来的系统风险,我们尝试 ...

最新文章

  1. 高清视频实时对讲SDK源码
  2. 日期不能交叉的检测算法
  3. IOS逆向【2】-cydia之开发者模式
  4. 帝国CMS7.2 7.5微信登录插件
  5. java后台用 requset对象 存储值 前台获取不到_springmvc form表单提交后台对象获取不到值(解决)...
  6. 持续集成部署Jenkins工作笔记0013---配置远程触发构建的TOKEN值
  7. 450A - Jzzhu and Children 找规律也可以模拟
  8. 通用权限管理系统基类中数据库的连接
  9. 74HC597( 8位输入锁存移位存放器) 使用总结
  10. Python-实现根据关键词获取网页内容
  11. word尝试打开文件时遇到错误 解决方法
  12. if (Build.VERSION.SDK_INT = Build.VERSION_CODES.KITKAT)设置后的效果
  13. 最经典最常用的Ecplise快捷键
  14. javascript:window.scroll()函数behavior属性smooth属性值在iphone浏览器上不兼容
  15. 作文未来的计算机医生300字,未来医生的好帮手作文300字
  16. VS2017 如何连接mysql数据库依赖的驱动msi
  17. 大学四年一路走来,我把这些私藏的算法学习工具全贡献出来了!
  18. 最新 2022欧莱雅AI面试真题题库
  19. STM32与SYN6288语音合成模块的使用
  20. 如何处理具有指数增长或衰减特征的数据

热门文章

  1. 模块ntdll中出现异常eaccessviolation_SAP ERP软件中的物料凭证 MIGO
  2. html在ie中img地址为https,关于IE10以下的img标签问题解决
  3. $.post 提交文件_PHP表单提交
  4. iOS 相册图片选择器
  5. “独立博客”为什么独立?
  6. webpack 多入口打包配置示例
  7. 一个不简洁的约瑟夫环解法
  8. java keytool工具详解
  9. android 来电自动接听和自动挂断
  10. php算数组内值的总和,怎样使用array_sum() 计算数组元素值总和