前言
本文仅讨论设计思路,软件demo已经写好,是基于QT版本编写的,后期会挂在我的gitee上供大家参考,本文中部分片段代码均为demo中的代码片段。
设计架构
在目前IPv4的大前提下,为了在复杂网络环境中稳定通讯,都采用了C/S的模式,需要消息中转服务器(网络基础知识不在本文讨论范围,自行填空)。
消息服务器主要作用:
1、处理客户端与服务器之间的C/S消息。此类消息不需要其他客户端参与,由客户端发起请求,服务器执行完毕后将结果返回给该客户端。主要有:登录、注册、修改用户信息、获取离线消息等。
2、协助客户端与客户端之间的C2C消息。如果两个客户端均在线(登录状态)则直接转发消息,如果有一方离线,则缓存消息到数据库,等待该客户端上线后拉取离线消息时发还。
3、处理用户身份认证。对用户的登录、注销请求进行认证,并发放一次性访问令牌。
通讯加密的主要方式:
1、客户端与客户端之间的C2C消息中,聊天内容字段肯定是要加密的,且加解密仅限于两个客户端之间,服务器在转发和缓存消息的过程中,无法解密消息内容。参考signal聊天软件的模式,可以采用DH密钥协商算法(本文使用的是openssl库的ECDH),协商后的AES加密密钥保存在两个客户端自己本地,服务器不参与该内容的加解密。(网络包格式图片中灰色部分)
2、客户端与服务器之间的C/S消息理论上无需加密,因为没有聊天内容字段的信息,但为了保护用户登录认证、用户信息等内容,通讯内容也最好加密。本文使用的方法是:客户端使用预服务器设好的AES对称密钥加密后发送给服务器,服务器对内容进行解密后再进一步处理。(网络包格式图片中橙色部分)
网络包的结构:
总结以上两个方面,本文设计的网络封包格式如下:
部分细节:
仅展示消息结构体(网络包格式图片中绿色部分)的设计详情,其他细节请参考项目源码。