IM 开源项目 登录服务器 <1>
1. 协议l 客户端/服务端(C/S): UDPl 服务端/服务端(S/S): UDP/TCP 2. 网络模型l Windows: 完成端口l Linux: Epoll 暂不提供 3. 性能参数l 最大连接数: 100000 IDs / 每台l 最小带宽要求: 1Mb(byte) / 每台l
1. 协议
l 客户端/服务端(C/S): UDP
l 服务端/服务端(S/S): UDP/TCP
2. 网络模型
l Windows: 完成端口
l Linux: Epoll 暂不提供
3. 性能参数
l 最大连接数: 100000 IDs / 每台
l 最小带宽要求: 1Mb(byte) / 每台
l 最大连通时间: 30s / 每次
1. 服务器集群设计
登录服务,采用服务集群方式,由多台“登录服务器”和单台“登录中心服务器”构成,分布情况如下。
l 登录服务器
a. 用户登录交互(账号数据库)。
b. 提供动态密钥生成。
c. UDP打洞(定义协议,各服务器均可以集成次服务)。
d. 更新,缓存用户状态,登录参数(eg:密钥)等, 并周期性上报中心服务器。
e. 用户状态(在线状态,心情等需实时通知的信息)推送(可能存储)。
f. 用户详细信息查询(账号数据库)。
g. 用户关系增、删、改、查。
h. 连接用户关系数据库
(横向分表 最大好友数*最大记录数 200*100000帐号关系数据库)。
i. 用户积分上报(eg: 统计一次上下线间在线时常 积分数据库)。
(… 视具体情况再添加功能)
l 登录中心服务器:采用单台服务(考虑到安全性, 后续可能增加代理或主从方式)
a. 缓存所有用户状态参数。
b. 缓存登录服务器参数(状态,连接参数,密钥)。
c. 提供用户归属登录服务器查询。
(… 视具体情况再添加功能)
4.1用户登录交互
4.1.1 登录流程
4.1.2 登录时序
4.1.3 登录协议包
/*****************************
[ID:5001(DEF_SVR_LOGIN_MIN + 1)登录KEY请求
******************************/
struct STRU_SVR_LOGIN_KEY_RQ
{
DEF_PACK_FUCREF_ID(STRU_SVR_LOGIN_KEY_RQ, DEF_SVR_LOGIN_KEY_RQ)
UInt64 m_ui64UID; // 用户ID
};
/*****************************
[ID:5002(DEF_SVR_LOGIN_MIN + 2)登录KEY应答
******************************/
struct STRU_SVR_LOGIN_KEY_RS
{
DEF_PACK_FUCREF_ID(STRU_SVR_LOGIN_KEY_RS, DEF_SVR_LOGIN_KEY_RS)
UInt64 m_ui64UID; // 用户ID
SInt64 m_i64CrtTime; // 创建时间
UInt16 m_ui16KeyLen; // Key长度
SInt16 m_i16SvrID; // 当前登录服务器ID
char m_szKeyBuf[50]; // Key
};
/*****************************
[ID:5003(DEF_SVR_LOGIN_MIN + 3)登录KEY请求
******************************/
struct STRU_SVR_LOGIN_RQ
{
DEF_PACK_FUCREF_ID(STRU_SVR_LOGIN_RQ, DEF_SVR_LOGIN_RQ)
UInt64 m_ui64UID; // 用户ID
SInt16 m_i16PassWordLen; // 密码长度
char m_szPassWord[50]; // 密码
SInt8 m_i8LogState; // 登录状态
};
/*****************************
[ID:5004(DEF_SVR_LOGIN_MIN + 4)登录KEY请求
******************************/
struct STRU_SVR_LOGIN_RS
{
DEF_PACK_FUCREF_ID(STRU_SVR_LOGIN_RS, DEF_SVR_LOGIN_RS)
UInt64 m_ui64UID; // 用户ID
SInt8 m_i8LogRet; // 登录结果
SInt16 m_i16SvrID; // 服务器实例ID
};
4.1.4 心跳
反射方式: 客户端周期发送,服务器端反射.
/*****************************
[ID:5005(DEF_SVR_LOGIN_MIN + 5) 存活通知
******************************/
struct STRU_SVR_LOGIN_LIVE_ID
{
DEF_PACK_FUCREF_ID(STRU_SVR_LOGIN_LIVE_ID, DEF_SVR_LOGIN_LIVE_ID)
UInt64 m_ui64UID; // 用户ID
};
4.1.5 密钥
服务器生成密钥,对称加密。
4.2 UDP打洞
4.2.1 打洞流程
4.1.6 打洞协议包
/*****************************
[ID:10005] 打洞请求
******************************/
struct STRU_P2P_UDP_HOLES_RQ
{
DEF_PACK_FUCREF_ID(STRU_P2P_UDP_HOLES_RQ, DEF_P2P_UDP_HOLES_RQ)
UInt64 m_ui64ApplicaterUID; // 提出申请的用户ID
UInt16 m_ui16ApplLocalPort; // 提出申请的用户本地端口
UInt64 m_ui64DestUID; // 目标用户
ULong m_ulWanIP; // 会话发起人地址
UInt16 m_ui16WanPort; // 会话发起人Port
};
/*****************************
[ID:10006] 打洞应答
******************************/
struct STRU_P2P_UDP_HOLES_RS
{
DEF_PACK_FUCREF_ID(STRU_P2P_UDP_HOLES_RS, DEF_P2P_UDP_HOLES_RS)
UInt64 m_ui64RSerUID; // 回应者UID
UInt16 m_ui16RSerLocalPort; // 回应着本地端口
UInt64 m_ui64ApplicaterUID; // 申请者
UInt16 m_ui16ApplLocalPort; // 提出申请的用户本地端口
ULong m_lWanIP; // 会话应答人地址
UInt16 m_i16WanPort; // 会话应答人Port
};
/*****************************
// [ID:10007] 通道保持通知
******************************/
struct STRU_P2P_UDP_CH_MAINTAIN_ID
{
DEF_PACK_FUCREF_ID(STRU_P2P_UDP_CH_MAINTAIN_ID, DEF_P2P_UDP_CH_MAINTAIN_ID)
UInt64 m_ui64LocalUID; // 本地用户ID
UInt64 m_ui64DestUID; // 目标用户ID
UInt16 m_ui64DestLocalPort; // 目标用户本机端口
};
更多推荐
所有评论(0)