# zqmsg **Repository Path**: slcode/zqmsg ## Basic Information - **Project Name**: zqmsg - **Description**: 易于使用的zq协议。基于tcp - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2018-08-13 - **Last Updated**: 2020-12-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SSP协议 > SSP旨在提供简洁高效的文件传输、消息通信库 > SSP版本当前为254,版本号逐渐递减 ## 场景 SSP是一个开源的消息、文件传输服务库,可用来做私聊服务、文件存储服务。应用场景包括全设备平台消息传输(比如多台相同系统的设备传输信息,像微信 QQ 钉钉等是不允许同时登录的,而且信息是被监控的),文件功能类似于oss,拥有断点续传、下载、秒传等特性。 受众包括跨平台开发者、测试者、私有文件存储、消息记录 ## 环境 #### libevent mac linux win 2.0.22 android ios 2.1.12 #### protobuf protobuf 3.13.0 #### 系统环境 mac 10.11+ win 7+ linux ubuntu 18+ android NDK 21+ ios 10+ ## 基本内容 ###### 特性 * 基于libevent的高效的平台特性,如epoll、kqueue、IOCP模式提供非阻塞高效的套接字操作 * 使用智能指针减少数据包在功能模块间的流转拷贝效率问题和资源释放问题 * 多线程:请求线程+发送线程+接收线程+处理线程+任务处理线程提升整体处理效率,真正的全双工 * 使用异步库解决多任务的耗时问题 * 支持包的优先级发送顺序,使在发送大文件时也能够处理即时消息 * 使用protobuf来减少字节占用提供高效的传输效率、提升解析速度 * 多端支持,服务端支持win+mac+linux+android(对你没看错),客户端支持win+mac+linux+android+ios * 支持精简的rpc特性,部分接口支持同步和异步请求 * 支持丰富的文件传输特性:文件断点续传、文件秒传、断点下载 * 节制的内存消耗,自适应内存和网络发送的平衡 * 提供移动端和桌面端的sdk集成 ###### 未来特性 * 支持HTTP和Websocket * 支持文件外链分享 * 完善的消息支持 * SSL消息加密 ###### 设计简述 * 协议交互分为模块(module)和行为(action) * 模块占用1个字节,即最多支持255个模块,0保留 * 行为占用2个字节,即每个模块内最多支持65535个行为,应该是够用的 * pb指protobuf的消息结构,发送和接收分别需要序列化和反序列化,更加详细的信息将以此类结构作为传输载体。 ###### 枚举类型 * 内部错误类型 * 模块类型 * 行为类型 * 错误类型分为:cs交互错误类型、c回调类型 ###### 架构 accept线程、send线程、recv线程 优先级队列 内存控制 独立的文件发送线程 ###### 里程碑 * 2020-10-02 新增Http协议,用来支持外链分享 * 2020-10-03 完成ab测试,对比nginx处于持平甚至小幅优势,可确保并发上core没有问题 ## 协议内容 #### 认证 [1] 客户端首次连接即需要发送登录包进行身份认证(认证包括用户名密码验证码一类,同时协议版本的校验) ``` 发起:C 行为:登录 字节分布:+|++|+++|+|pb 协议内容:0x01|0x0001|SSP|0xfe|pb 发起:S 行为:登录ack 字节分布:+|++|pb 协议内容:0x01|0x0002|pb ``` 无论登录与否,首次需要先验证版本号等信息 这里可以设置用户名和密码等 #### 文件模块 [2] ``` 具体内部查阅pb描述文件 发起:C 行为:创建传输任务。每次传输依赖此任务id区分 字节分布:+|++|pb 协议内容:0x02|0x0001|pb 发起:S 行为:创建传输任务ack 字节分布:+|++|pb 协议内容:0x02|0x0002|pb 发起:C 行为:上传文件(文件描述) 字节分布:+|++|pb 协议内容:0x02|0x0003|pb 发起:S 行为:上传文件ack(是否允许上传、空间是否足够) 字节分布:+|++|pb 协议内容:0x02|0x0004|pb 发起:C 行为:上传文件片段 字节分布:+|++|pb 协议内容:0x02|0x0005|pb 发起:S 上传进度(ack) 字节分布:+|++|pb 协议内容:0x02|0x0006|pb 发起:C 获取文件列表 字节分布:+|++|pb 协议内容:0x02|0x0007|pb 发起:S 返回文件列表 字节分布:+|++|pb 协议内容:0x02|0x0008|pb 发起:C 请求文件(请求下载) 字节分布:+|++|pb 协议内容:0x02|0x0009|pb 发起:S 请求文件反馈(是否有无,如果有数据是什么) 字节分布:+|++|pb 协议内容:0x02|0x000a|pb 发起:S 返回请求文件片段 字节分布:+|++|pb 协议内容:0x02|0x000b|pb 发起:C 取消任务 字节分布:+|++|pb 协议内容:0x02|0x000c|pb 发起:S 取消任务ack 字节分布:+|++|pb 协议内容:0x02|0x000d|pb 发起:C 删除文件 字节分布:+|++|pb 协议内容:0x02|0x000e|pb 发起:S 删除文件ack 字节分布:+|++|pb 协议内容:0x02|0x000f|pb 创建分享(未实现) 总占用空间(未实现) 剩余空间(未实现) ``` #### 消息模块 [3] ``` ``` #### ping [4] ping的必要性 客户端每过一个时间去ping服务端,这是业务层的ping防止在类似强制断网或者客户端发生死锁(socket内核层链接正常) ``` 发起:C 行为:ping 字节分布:+|++|pb 协议内容:0x04|0x0001 发起:S 行为:pingack 字节分布:+|++|pb 协议内容:0x04|0x0002 ``` ## 服务端状态维护 socket<-->设备id<-->session<-->id id是有重复的可能,sokcet、设备id、session则都是唯一的