转载:http://mp.weixin.qq.com/s?__biz=MzAwNjQwNzU2NQ==&mid=400432205&idx=1&sn=1033c57d3854a8bd695d46752027970d&scene=5&srcid=111313OePDHE0W6rM0EoDxo0#rd
背景:除去大名鼎鼎的QQ这款即时聊天工具,还有许多细分行业的IM,比如淘宝阿里旺旺、网易泡泡、YY语音......。恰巧公司产品也要开发一款基于我们自己行业的类IM系统,很有幸我担当了这个产品的架构师,核心代码编写、实现者。下面我近年来从技术上我对IM系统(即时消息的传输,不包括语音,视频,文件的传输)的理解和设计分享出来,浅薄之见,望大家别见笑,欢迎给出批评意见。
目前我知晓的所有IM系统传输即时消息无外乎使用UDP、TCP、基于TCP的http这几种协议中的一种或几种。比如QQ主要采用UDP协议,MSN主要采用TCP协议,而且他们也都支持HTTP协议的代理模式。更多资料,请参加这篇文章《一些常用软件的网络端口协议分类介绍》。
我们该如何选择呢?
UDP协议实时性更好,但是如何处理安全可靠的传输并且处理不同客户端之间的消息交互是个难题,实现起来过于复杂;
HTTP协议属于扩展支持,我们在产品的初始阶段可以不用支持;
那就非TCP协议莫属了,要考虑的同样也有很多,特别是如果有海量用户的需求。如何保证单机服务器高并发量,如何做到灵活,扩展的架构。
Tips: QQ 为什么采用 UDP 协议,而不采用 TCP 协议实现?
方便大家查看,附文《网络传输数据格式的选择》:
各种软件网络端口的分类:
即时通讯类:
1、腾讯QQ通讯协议及端口范围
QQ 默认采用UDP 通讯方式,端口8000,8001。如果UDP 的两个端口不通,会自动转换到TCP 80端口或者TCP 443端口进行通讯。QQ 同时也支持HTTP 代理模式及SOCK5 代理模式。
2、MSN通讯协议及端口范围
MSN(Live)messenger 采用TCP 通讯方式,支持1863 端口和80 端口,并在登录过程中使用HTTPS,端口443。MSN 支持代理服务器(HTTP 代理,SOCK4/SOCK5 代理)。
3、雅虎通通讯协议及端口范围
雅虎通采用TCP 通讯方式,默认端口5050,当5050 端口不通时会自动转换为23、21、25、110 等十几个端口。Yahoo! 支持代理服务器模式。
4、AIM,ICQ通讯协议及端口范围
ICQ 和AIM 采用TCP 通讯方式,默认端口5190,也会自动转换到80,443 等其他端口,并且支持代理模式。从AIM6.5版起,开始采用TLS加密协议。
5、新浪UC通讯协议及端口范围
新浪UC 默认采用UDP 和TCP 通讯方式,UDP 端口3001-3004,UDP端口主要参与登陆过程,在聊天室中聊天视频,主要是TCP。新浪UC 同时也支持HTTP 代理模式及SOCK5 代理模式等。
6、网易泡泡通讯协议及端口范围
网易泡泡POPO 默认采用TCP 通讯方式,通讯端口为HTTPS 443。如果443 的端口不通,会自动转换到HTTP 80 端口进行通讯。 网易泡泡POPO 支持HTTP 代理,SOCK5 代理。
7、贸易通,淘宝旺旺通讯协议及端口范围
阿里巴巴贸易通采用TCP 通讯方式,默认登录端口为16000,当16000 端口不通时,则跳转到443 端口进行通讯。阿里巴巴贸易通支持SOCK4、SOCK5 和HTTP 代理服务器模式登录。
8、Skype通讯协议及端口范围
Skype 采用TCP 方式和 UDP 方式进行通讯,端口在通讯过程中协商而定。将点对点技术运用到网路语音通话与即时讯息应用层面上。
9、飞鸽传书通讯协议及端口范围
飞鸽传书采用TCP 方式(文件传输)和UDP 方式(即时聊天)通讯,TCP 和UDP 默认通讯端口都为:2425。
10、百度Hi通讯协议及端口范围
百度Hi 采用TCP 方式和UDP 方式通讯,TCP 默认通讯端口:1863,UDP 端口在通讯过程中协商而定。
11、移动飞信通讯协议及端口范围
移动飞信默认采用TLS 方式加密登录的。同时也支持HTTP 代理模式及SOCK5 代理模式,使用TCP 80、443、8080端口通讯。
文件传输类:1、QQ文件传输通讯协议及端口范围
QQ 文件传输TCP 方式,通讯端口443(HTTPS)。QQ 文件传输UDP 方式,一般是在TCP 方式受阻时,容易出现。具体端口由通讯时协商确定。
2、QQ群共享及网盘通讯协议及端口范围
QQ 群共享里面的文件上下传、网络硬盘文件上下传均为TCP 方式,群共享默认端口9910,封堵后自动转换到80 端口。网盘默认端口443。
3、AIM,ICQ文件传输通讯协议及端口范围
AIM/ICQ 的文件传输采用TCP 方式传输,端口、IP 由双方协商确定,可以在同一个链接内传输多个文件。AIM/ICQ 可以通过代理服务器传输文件。
4、MSN文件传输通讯协议及端口范围
MSN TCP 方式,端口由双方协商确定。即使文件已经传完,此连接也不断开,一直维持到退出MSNFTPTCP 程序。如果有新文件需要传输,直接通过此连接进行通讯。MSN UDP方式,通讯端口由双方协商确定,采用MSNSLP 握手协议。一旦UDP 通讯成功后,该端口的通讯一直存在到退出MSN 应用程序。如果有新的文件传输,也直接在该端口进行通讯。
5、雅虎通文件传输通讯协议及端口范围
YAHOOFTP 采用HTTP 方式通讯。同时也支持HTTP 代理模式及SOCK5 代理模式。
6、贸易通,淘宝旺旺文件传输通讯协议及端口范围
贸易通文件传输采用TCP方式 和UDP方式进行通讯,默认TCP 通讯端口为:16000,18386,默认UDP通讯端口为:18386。
7、飞信文件传输通讯协议及端口范围
飞信文件传输采用HTTP方式进行文件的传输,默认端口为:80。
在线游戏类:1、QQ游戏通讯协议及端口范围
QQ 游戏默认采用TCP 通讯方式,端口443。 QQ 游戏同时也支持HTTP 代理模式及SOCK5 代理模式。
股票软件类:
1、长城,华夏,招商,中信,银河,国元交易软通讯协议及端口范围
长城证券交易软件采用TCP 方式通讯,默认端口为:7708。同时也支持HTTP 代理模式及SOCK5 代理模式。
2、国泰君安交易软件通讯协议及端口范围
国泰君安交易软件采用HTTPS 方式登录,默认端口为:443,同时也支持HTTP 代理模式及SOCK5 代理模式。
3、大智慧通讯协议及端口范围
“大智慧”股票分析软件登录采用TCP 方式通讯,登录端口为22223,同时也支持HTTP 代理模式及SOCK5 代理模式。
4、光大证券交易软件通讯协议及端口范围
光大证券交易软件采用TCP 方式通讯,默认登陆和通讯端口为:7709,7711等。同时也支持HTTP 代理模式及SOCK5 代理模式。
5、同花顺,龙卷风,海通,中富证券,广发通讯协议及端口范围
“龙卷风”行情分析软件采用TCP 方式通讯,默认登录端口为8001,8601。同时也支持HTTP 代理模式及SOCK5 代理模式。
6、钱龙通讯协议及端口范围
“钱龙”股票分析软件采用TCP 方式通讯,默认登录端口为9000。同时也支持HTTP 代理模式及SOCK5 代理模式。
7、申银万国证券交易软件通讯协议及端口范围
申银万国交易软件采用TCP 方式通讯,默认TCP 端口为:6166,9001。同时也支持HTTP 代理模式及SOCK5 代理模式。
8、天一证券通讯协议及端口范围
“同花顺”股票分析软件登录采用TCP 方式通讯,默认TCP 登录端口为8601。
9、中投证券交易软件通讯协议及端口范围
中投证券交易软件采用TCP 方式通讯,默认TCP 端口为:706,708。同时也支持HTTP 代理模式及SOCK5 代理模式。
流媒体和在线视频类:1、RTSP,RealPlayer,Windows Media,Livestation通讯协议及端口范围
RTSP 采用TCP 和 UDP进行通讯,默认为554 端口,当554 端口不通时转换到其他端口通讯(如80端口)。
2、FreeCast通讯协议及端口范围
FreeCast 的Audio 采用TCP 通讯方式,默认登录端口为TCP 1666,当TCP 1666 端口不通时,则连接音频服务器失败。FreeCast 的Video 采用UDP 通讯方式,默认登录端口为UDP 3478,当UDP 3478 端口不通时,则连接视频服务器失败。
3、PPLive通讯协议及端口范围
PPLive 采用TCP 和UDP 方式通讯,TCP 方式用来获取频道列表,TCP 端口在通讯过程中协商而定;UDP 方式用来获取流媒体资源。默认UDP 通讯端口:7100,7101,8000。
4、QQLive通讯协议及端口范围
QQLive 采用TCP 方式通讯,TCP 和UDP 默认通讯端口为:8000,同时也支持HTTP 代理模式及SOCK5 代理模式。
5、PPS网络电视(PPStream)通讯协议及端口范围
PPS网络电视(PPStream)默认采用TCP 方式和UDP 方式通讯,TCP 端口在通讯过程中协商而定,UDP默认端口:7201,8000,8400-8401,17788。
6、Tvuplayer,PPMate通讯协议及端口范围
TVUPlayer 采用 UDP 方式和TCP 方式通讯,其中UDP 默认通讯端口为:80,3902,3951 和3952,TCP 默认通讯端口为:3950。
7、电视蚂蚁通讯协议及端口范围
电视蚂蚁采用TCP 方式和UDP 方式通讯,TCP 和UDP 默认端口都为16600 和16800,其中UDP 是用来寻找频道列表的。
8、快播通讯协议及端口范围
快播采用 TCP方式 和 UDP 方式进行通讯,TCP 和UDP 端口在通讯过程中协商而定,它同时支持BT 协议。
9、沸点网络电视通讯协议及端口范围
沸点网络电视采用TCP 方式进行网络连接,,默认UDP 端口在通讯过程中协商而定,UDP 方式和HTTP 方式进行数据传输,默认UDP 端口为:53124-53129。
10、UUSee网络电视通讯协议及端口范围
UUsee网络电视采用TCP 方式以及HTTP 方式进行数据传输,默认TCP 端口为:443-444。
11、九品网络电视通讯协议及端口范围
九品网络电视采用TCP 方式进行通讯,而且支持其他网络电视,如pplive,ppstream等等,默认TCP 端口在通讯过程中协商而定。
12、iTunes通讯协议及端口范围
iTunes 采用HTTP 方式和HTTPS 方式连接服务器,TCP 方式进行数据传输,默认TCP 端口在通讯过程中协商而定。
13、暴风影音通讯协议及端口范围
暴风影音采用P2P的方式进行通讯,播放过程中会占用大量的带宽资源。TCP和UDP的通讯同时存在,且没有固定端口。
14、酷狗音乐通讯协议及端口范围
酷狗音乐采用UDP 方式获取列表和资源,端口不固定。
15、风行通讯协议及端口范围
通讯方式有TCP和UDP,不支持代理服务器。UDP通讯端口不固定,通常使用8000、8080进行通讯。在所有Windows操作系统上均可支持NAT,自动完成uPnP端口映射
16、迅雷看看通讯协议及端口范围
迅雷看看是一款基于P2P Streaming技术的播放插件,使用迅雷下载协议。支持HTTP 连接、FTP 连接、MMS 连接、RTSP 连接以及其他代理模式。下载资源默认利用HTTP 进行多点资源(即候选资源)地连接,通讯端口不固定,UDP 端口:4000、8000、8888等。
17、皮皮播放器通讯协议及端口范围
支持P2P与P2SP(HTTP)的混合技术。优化了P2P请求算法,缩短缓冲时长,默认采用TCP 方式和UDP 方式通讯,TCP 端口在通讯过程中协商而定,UDP传输协议及流量控制策略,其下载时UDP端口不固定。同时也支持HTTP 代理模式及SOCK5 代理模式。
P2P软件类:1、BT下载通讯协议及端口范围
BT 采用TCP 通讯方式,并伴随大量UDP通讯(搜索可用资源),一旦Bittorrent Handshake 成功,就开始大量数据传输。TCP连接默认端口为:6881-6889,6969,8080等。当端口不通时会跳转到Http 80 端口。要完全禁止BT下载您还需要在路由器上禁止UDP端口1024-65534。(注:HTTP 80为上网浏览必须的端口)
2、迅雷,快车,QQ旋风多点下载通讯协议及端口范围
迅雷支持HTTP 连接、FTP 连接、MMS 连接、RTSP 连接以及其他代理模式。迅雷查询和下载资源默认利用HTTP 进行多点资源(即候选资源)地连接,通讯端口不固定。迅雷的雷区注册和登录使用的是TCP 5200 和6200 端口。 UDP端口:8000,10002,10022-10024。
3、电驴,电骡通讯协议及端口范围
电骡采用TCP 和UDP 通讯方式,连接的网络:eD2K 和 Kad。登陆时默认连接4242 端口服务器,当4242端口服务器不通时,转换到其他端口(4099、4662、4672……)服务器。当eDonkey TCP 成功连接后,便开始传输数据。如果TCP受阻,会采用UDP方式传输数据,默认端口为:4672 和 12155。电骡支持SOCK4、SOCK4a、SOCK5 和HTTP1.1 代理。
4、Poco通讯协议及端口范围
POCO 采用TCP 方式和UDP 方式通讯,其中TCP 方式的默认端口为:8093。UDP 方式的默认端口为:5566 ,9110 和 8000-10000。
5、脱兔下载通讯协议及端口范围
脱兔采用 TCP 方式和UDP方式通讯,TCP 通讯端口常有4662 等,UDP通讯端口为:4600-4800。并支持BT协议,可连接的网络有:eD2K 和 Kad 。
6、百兆BOX通讯协议及端口范围
百兆P2P 主要采用UDP 方式通讯,默认登录端口为UDP 6600,当UDP 6600 端口不通时,则连接不到网络。资源下载通过UDP 端口:9000,5911,9001,1599。
7、百度下吧通讯协议及端口范围
百度下吧采用HTTP 方式和 UDP方式通讯,并伴有UDP 通讯,其中UDP 常见端口有:11111等
二进制格式?文本格式?这个话题转到我的这篇文章《网络传输数据格式的选择》,从我们当前的需求和产品周期上我觉得选择JSON形式的数据协议是最好的。
方便大家查看,附文《网络传输数据格式的选择》:
对于客户端和服务端的数据传输通常会有以下几点考虑:
1.网络数据大小――占用带宽,传输效率:虽然对单个用户来说,数据量传输很小,但是对于服务器端要承受众多的高并发数据传输,必须要考虑到数据占用带宽,尽量不要有冗余数据,这样才能够少占用带宽,少占用资源,少网络IO,提高传输效率;
2.网络数据安全性――敏感数据的网络安全:对于相关业务的部分数据传输都是敏感数据,所以必须考虑对部分传输数据进行加密;
3.编码复杂度――序列化和反序列化复杂度,效率,数据结构的可扩展性,可维护性:对于平台相关业务的代码实现也需要考虑到数据发送方和数据接收方数据处理的复杂度和数据结构的可扩展性,可维护性,人力成本和实施复杂度也必须考虑在内;
4.协议通用性――大众规范:数据类型必须是跨平台,数据格式是通用的,大家普遍能接受上手的;
以下我们通过几种不同类别的协议数据类型进行比较:
自定义二进制
优点:信息体积小,对应以上”1“
缺点:编码复杂度高(自己定义消息格式,自己编写序列化和反序列化方法,自己进行容错处理,可扩展性不强,比如添加个字段,就必须改两端的逻辑处理),对应以上”3“;
提供序列化和反序列化库的开源协议
比如protocol buffers, json, Thrift
优点:是一种流行的通用数据格式,扩展相当方便,序列化和反序列化相当方便(有相应库),错误处理方便(库支持);
文本化协议
比如xml,json
优点:序列化,反序列化容易(库支持),调试方便,可视化强
缺点:相对于二进制存储占用体积大
如果是你,你会选择哪种协议?
我会选择json,因为他是“提供序列化和反序列化库的开源协议还是文本化的协议”,原因如下:
1.自定义二进制格式进行传输的工作,整个过程在定义消息,write,read的过程过于复杂,还很容易出错,对于很多数据交互的程序,会花费大量的时间在上面;
2.自定义二进制格式不便于扩展,但json可以很好地解决这种问题;
3.虽然相比较二进制,json的占用空间稍大,但是我们可以通过网络数据压缩来解决,况且json本身也是轻量级的,传输效率也很高;
4.去看《unix编程艺术》吧,第5章--文本化,好协议产生好实践;第6章--透明性:来点儿光 会告诉你使用文本化协议的好处;
首先我们来提炼一下一个IM系统的主要需求,包括账号,关系链,在线状态显示,消息交互......。
架构考量:
由于采用可靠传输协议TCP,考虑到负载问题(短连接实现账号、关系链相关业务,长连接实现上线、信息推送);
后台架构的灵活性、可扩展性,支持分布式部署――把网络层、业务逻辑层、数据层分离,网络层和业务层支持负载均衡策略、数据层支持分布式存储;
客户端SDK的易用性:把网络层、数据层分离、业务逻辑层分离;
后台架构简化图
架构示意图
架构细化图
说明
从<架构细化图>中可以看出对于上线服务由于建立的是TCP长连接,对于单台服务器往往由于硬件资源、系统资源、网络资源的限制无法做到海量用户的同时在线,所以设计为根据服务器负载支持多服务器上线,同时由于多服务器上线造成了对整个系统交互(不同的客户端的交互,协作部门应用服务和客户的交互)的分割,引入消息转发服务器作为粘合点。另外对于多服务器上线造成的统一账户信息(在线状态,消息)数据的分割,引入统一的数据层(内存存储层:session、状态信息存储、消息队列存储;数据库:账号信息存储)做到业务和数据的分离,也就做到了支持分布式部署。参见我的这篇文章《构建高性能服务的考量》
对于部分业务服务:做到网络层、业务层、数据层的完全分离。首先对于TCP短连接来说不会如长连接那般消耗资源,即使后期遇到海量的并发访问请求依然可以从容的通过负载均衡策略和数据分布式部署策略进行解决。参见我的这篇文章《服务端架构中的“网关服务器”》
服务端平台及技术选型
系统开发平台: CentOS――Linux发行版的一种,稳定可靠、可定制优化、支持丰富;
网络支撑层: libevent――减小开发成本,增强稳定性;
缓存存储层: Redis――支持丰富的存储结构,支持分布式存储;
数据库: MySQL――最适合互联网的数据库,免授权、高效稳定、可控性高;
开发语言: C/C++;
部分热点问题考量
系统性能考量:
编码角度:采用高效的网络模型,线程模型,I/O处理模型,合理的数据库设计和操作语句的优化;
垂直扩展:通过提高单服务器的硬件资源或者网络资源来提高性能;
水平扩展:通过合理的架构设计和运维方面的负载均衡策略将负载分担,有效提高性能;后期甚至可以考虑加入数据缓存层,突破IO瓶颈;
系统的高可用性:(防止单点故障)
在架构设计时做到业务处理和数据的分离,从而依赖分布式的部署使得在单点故障时能保证系统可用。
对于关键独立节点可以采用双机热备技术进行切换。
数据库数据的安全性可以通过磁盘阵列的冗余配置和主备数据库来解决。
Tips: 如果要支持web IM,请阅读《Web推送技术研究》
主要学习资料: 请自行google。
《1.4亿在线背后的故事》;
《BasicDB的架构演变》;
《微信之道-至简》;
本文涉及文章,请回复“im”获取IM技术相关的文章
作者:yaocoder
来源:http://yaocoder.blog.51cto.com/2668309/1412029,
http://yaocoder.blog.51cto.com/2668309/995210,
http://www.cnblogs.com/maowang1991/p/3572327.html