前言

做直播、IM、新消息提醒,都基本上需要用到推送。当然可以接外部的推送服务,但是在一些强交互,或者数据隐私有要求的时候,会用到自己实现的推送。这里分享一下我们之前的推送协议的设计。

协议

基本的消息体是这样的

len type msg
4byte 4byte

- 前4byte表示后面msg的长度
- type定义 1,协议交换密钥 2,普通消息
- msg 通讯的内容

其中,msg用protobuf进行序列化
type==1 -> ExchangeKey

enum ENCRYPT_TYPE {RC4 = 1;
};
message ExchangeKeyReq {required bytes N = 1;required int32 E = 2;
}
message ExchangeKeyRes {required bytes key = 1;required ENCRYPT_TYPE type = 2;
}
message ExchangeKey {optional ExchangeKeyReq exchange_key_req = 1;optional ExchangeKeyRes exchange_key_res = 2;
}

type==2 -> SetPk

message SetPk {optional LoginReq login_req = 1;optional LoginResp login_resp = 2;optional PingReq ping_req = 3;optional PingResp ping_resp = 4;optional CustomReq cus_req = 10;optional CustonResp cus_resp = 11;...
}message LoginReq {required Ver ver = 1; required string uid = 2;required string token = 3;
}
message LoginResp {required uint32 next_ping_interval = 1;required Code code = 3;
}
message PingReq {
}
message PingResp {required uint32 next_interval = 1;
}
enum Code {EC_SUCCESS                                           = 0; EC_SYS_ERROR                                         = 1;EC_UNKNOWN_ERROR                                     = 2;EC_INVALID_ARGS                                      = 3;EC_FREQ_LIMIT                                        = 4;EC_EXISTS                                            = 5;EC_NOT_EXISTS                                        = 6;EC_LOGIN_FAIL                                        = 50;
}

流程

  • client发起TCP连接
  • client本地生成RSA密钥 把N和E填入到ExchangeKey.ExchangeKeyReq中,发个server
  • server回ExchangeKey.ExchangeKeyRes(即key)给client
  • client校验key是否服务器端可信的公钥,不可信即中断连接
  • client用key做rc4加密,向server请求登陆,即发送LoginReq,把登陆之后的uid、token带上
  • server返回登陆/校验token结果,LoginResp.code==EC_SUCCESS/EC_LOGIN_FAIL,若登陆失败,则中断连接
  • 登陆成功的话,有下一次心跳的时间,client需要本地定时,发起心跳PingReq
  • server收到PingReq,返回next_interval

关于安全

  • 登陆之后的数据都是通过rc4加密的,所以能确保client发向server的数据是安全的。
  • client有带上uid和token,所以server是能知道客户端的连接是否可信的。

关于扩展

  • 数据扩展:有版本号、消息类型,可以自定义多种数据类型在不同的版本上
  • 动态心跳/固定心跳:心跳时间由server来决定(next_interval)

实现

// client已经实现了
// server等socks5写完才能开始写实现
// 都写完整理好才开源

自定义协议推送的设计相关推荐

  1. 基于Netty的百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  2. 【Netty系列】Netty百万级推送服务设计要点

    一. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  3. Netty系列之Netty百万级推送服务设计要点

    原文来自于:李林峰 https://www.infoq.cn/article/netty-million-level-push-service-design-points/ 1. 背景 1.1. 话题 ...

  4. Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  5. Netty百万级推送服务设计要点!

    来源:urlify.cn/3eAZBj 最近很多同学给我发邮件或者微博私信我,咨询推送服务相关的问题. 问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类: Net ...

  6. Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

    Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送, ...

  7. GB28181利用RTP协议推送264的PS封包音视频

    实现满足GB28181国标的设备基本流程(参看上一篇博客链接)之后,收到实时音视频点播请求后,需要进行RTP协议推送音视频. 从sip解析到invite和ack消息,可以拿到流媒体接收的ip地址和po ...

  8. push推送服务设计

    PUSH系统架构设计简述 一.网络传输协议的选择 PUSH系统协议选取: UDP协议实时性更好,但是如何处理安全可靠的传输并且处理不同客户端之间的消息交互是个难题,实现起来过于复杂,那就非TCP协议莫 ...

  9. android 通过xmpp即时聊天客户端往服务器发消息,利用XMPP协议推送服务器告警信息到安卓平台及桌面...

    XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议. XMPP目前被IETF国际标准组织完成了标准化工作.标准化的核心结果分为两部分: 核心的XML流传输协议 基于XML流传输的即时 ...

最新文章

  1. HTML 5 中的新元素2
  2. java中子类继承父类程序执行顺序问题
  3. 2019.7.9刷题统计
  4. VS(官方)跨平台开发远程调试教程(远程开发)
  5. POJ1741:Tree——题解+树分治简要讲解
  6. 程序员初涉江湖 宜步步为赢(转-1) 作者:IT168 职业发展顾问Leo
  7. python可以做计量分析吗_技术分享 - python数据分析(2)——数据特征分析(上)...
  8. 【算法分析与设计】证明插入排序的正确性
  9. web performance in action学习前言
  10. IFIX和Historian历史数据曲线图
  11. 学习nodejs+express+angular+socket.io ,投票demo
  12. 长痘痘了吃什么好得快?
  13. java存档_Java实现简单棋盘存档和读取功能
  14. html 学习笔记(9)
  15. Tensorflow实现进阶的神经网络
  16. excel删除无尽空白行_从0到1快速入门Excel透视表,看这一篇就够了
  17. 陆奇如何解构一家企业?
  18. 李宏毅ML笔记12:半监督
  19. AI_综述:3D目标检测于RGB-D(Object detection in RGB-D images)
  20. Zabbix Meetup上海站回顾+ppt下载

热门文章

  1. Direct Show学习方法
  2. Matlab - Solidworks 机器人建模(5)—— 给模型添加摩擦力
  3. 浅谈仪器控制【1.Python与Labview/Labwindows】
  4. make j* make j4 make j8 区别
  5. 【历史上的今天】10 月 29 日:互联网的正式诞生;MariaDB 发布首个版本;“天河一号”研制成功
  6. OUC软件开发实验1
  7. macport 安装使用
  8. Notebook交互式完成目标检测任务
  9. web端网页变为灰色
  10. 为什么有人说C++是最难学的编程语言? (4个回答)