190 likes | 386 Views
P2P即时通讯. linux环境下高性能服务器的实现. 背景介绍. 传统的即时通讯软件大多采用C/S模式 客户数量增加时服务器压力急剧增大. 背景介绍. P2P方式:服务器帮助客户之间建立连接后,客户直接进行通讯 大大的减轻了集中式服务器的压力. 背景介绍. 从传文件的速度可以看出QQ是P2P的 MSN和一些其他传统的即时通讯没有采取P2P的方式,内网间传文件就没优势. 关键技术. P2P的实现依赖于客户端之间的 互连 ,但由于 NAT 与防火墙 的存在,客户端之间无法直接建立连接 可见,如何实现内网穿越是实现P2P的 一个 关键. NAT简介. 穿越方案.
E N D
P2P即时通讯 linux环境下高性能服务器的实现
背景介绍 • 传统的即时通讯软件大多采用C/S模式 • 客户数量增加时服务器压力急剧增大
背景介绍 • P2P方式:服务器帮助客户之间建立连接后,客户直接进行通讯 • 大大的减轻了集中式服务器的压力
背景介绍 • 从传文件的速度可以看出QQ是P2P的 • MSN和一些其他传统的即时通讯没有采取P2P的方式,内网间传文件就没优势
关键技术 • P2P的实现依赖于客户端之间的互连,但由于NAT与防火墙的存在,客户端之间无法直接建立连接 • 可见,如何实现内网穿越是实现P2P的一个关键
穿越方案 • 一、通讯双方只要有一个在外网的情况: • 外连外和内连外都可以之间连接 • 外连内需要服务器改变连接方向,让内去连外
穿越方案 • 二、通讯双方处于不同内网中: • 需要处于外网的客户中继转发
穿越方案 • 三、通讯双方在同一内网中: • 考虑到多层的NAT,同一内网中会出现上面两种情况 • 可以先用子网掩码进行基本的判断 • 尝试连接失败后再找外网客户转发
系统需求 • 一、基本的即时通讯功能: • 注册、登录、下线、好友管理 • 二、文件传输 • 体现P2P的优势
服务器框架设计 数据库存储客户个人信息,好友关系 内存中维护在线客户的临时信息
服务器框架设计 • 客户数量与日俱增,服务器并发处理客户的各种请求 • 多进程/多线程? 系统开销太大 • select/poll IO复用?效率提高了不少 • epoll linux内核实现的一种IO复用机制,相比select不用轮询所有fd,相比poll速度更快
服务器框架设计 • 出现的问题: • 高速的epoll不能被某个客户阻塞,所有套接字都必须设置成非阻塞 • 数据库操作是阻塞的 • 怎么办?
epoll非阻塞+线程池架构 • 登录流程: • 线程池里面只进行最基本的数据库查询 • 对共享资源onlineList的操作放到单线程的epoll里面做 • 简化系统的逻辑
客户端框架设计 客户端的压力比较小,使用多线程阻塞IO就可以了,而且便于实现
客户端框架设计 • 客户端就是个遵纪守法的好公民,按照协议处理用户输入的命令,服务器发送的命令。。。 • 好公民还有着成为“冤大头”的潜在危险: • 对于处于外网或者相对外网的客户可能会需要帮助内网客户进行中继
客户端框架设计 • 客户端要维护一张UID和fd对应的表 • P2P消息格式为: • <myUID, UID, msg> • 中继客户通过查表完成转发