目前即时通信主要有四种协议:即时信息和空间协议(IMPP)、空间和即时信息协议(PRIM)、针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)以及XMPP。到目前,主流的主要是XMPP和SIP/SIMPLE。

SIMPLE利用SIP来发送presence信息。SIP是IETF中为终端制定的协议。要谈SIMPLE,首先要谈谈SIP,在传统的电路交换向分组交换演进的过程中,SIP起到了很关键的作用,IMS中的核心协议就是SIP,并已SIP作为中介来实现PSTN,VOIP,移动网络的融合。所以从强调开放性的Internet网络和强调垄断性的电信网络两个网络属性来看的话,SIP其实更倾向于后者。SIP包含着完善的网络互通设计,所以是VOIP的首选。如果你的即时通信软件还想与传统的电话网络互连的话,SIP应该是首选。SIP通过SDP来描述媒体流,并通过信令交换主被叫的媒体流信息,例如IP地址和端口,再依靠如实时协议(RTP)来进行实际上的媒体连接。这个媒体连接不仅仅包括语音,也包括视频等数据流。所以SIP的即时通信会话是点对点的,但信令流是依据网络配置逐级路由传递的。而且网络延伸的范围包括PC网络客户端,PSTN的传统电话,移动终端,VOIP模拟电话终端,VOIP的小交网络,接入网等等,无所不到。要支持这么多网络,协议的互连互通,所以关于SIP的相关扩展就可想而知,这其中还要包括网管,计费等功能的协调与支持,所以SIP的电信网络属性应该更重一些。SIMPLE是SIP为了支持即时通信的新特点做出的扩展,其实是向Internet网络的回归。

如果我们选择SIP作为即时通信的实现方向的话,应该说没有问题,正所谓条条大路通罗马,只要通信质量好,网络负载轻,系统安全,业务功能齐全,其实不在乎用什么技术。但前提是你实力足够强,技术足够牛。如果是对于搞新产品的小公司来说,如果你不是要去搞VOIP,选择SIP,比较容易走上封闭的羊肠小道。虽然你实现了即时通信的业务功能,但你吸引新用户的能力有限,在现在日益强调网络社交属性的今天,很难想象你能吸引多少用户去安装一个新的即时通信的客户端,用户一般只会用他们常用的MSN,QQ,Skype等等,对于新的即时通信客户端,他们已经装到反胃了。

但如果你实力足够强,这也不是绝对的,MSN也是基于SIP的,随着即时通信的功能日益扩展,私有的协议在不断扩展,你把你的私有协议开放出来,你也会有追随者帮你写XMPP的网关适配模块,借助XMPP与其它IM进行互联互通。但对新起步的公司来说,好像不是那么容易,那就得自己动手写,把自己适配到XMPP的网络中去。可前提是用多少其它客户端用户对你的系统感兴趣,并且在他们的客户端中安装你的应用的插件。

所以从这个角度来说,不如直接选择XMPP,因为大多数IM客户端不在乎与传统电信网络的融合,像SKype那样提供与PSTN的网络接入。大多数只是纯的Internet应用,直接实现点到点的语音、视频和数据连接。基于XMPP的实现,通过加入主流的IM插件,可以将主流IM的用户资源引入到你的IM应用中,借助网络社交进行推荐,能更快的吸引新用户,以及他们的好友加入进来。酒好也怕巷子深,所以得借助XMPP,把酒传销出去。至于大家愿不愿意通过你的IM客户端登陆其它主流IM,那就看你设计的功夫了,既要让用户接纳你,还不要让他们感觉到拉远了与他们熟悉的IM间的距离。要共赢。

过去大家总觉得XMPP在点对点的媒体流互通支持上还不行,如果通过带内传输媒体信息的话,通过服务器一级级中继传输,那网路开销可想而知,这还不包括时间上的延迟。其实很多应用都已经支持了点对点的互通,像Libjingle。SIP也就是通过交换主被叫信息直接进行点对点通信的,XMPP当然也可以,而且考虑到XML的强大的灵活的扩展功能,搞定任何网络应用都不成问题,所以对于新功能新需求的实现,不成问题,不过最好看看XMPP的新的扩展规范,没准别人已经实现了,照着规范来,也好实现大家的互连互通。如果为快速实现功能,当然可以自己定制自己的私有协议,没准还能写到RFC里呢。

本文只是提供IM通信技术选择的一些思路,从我的理解,如果自己要实现一个新的IM应用,选择XMPP应该更合适一些。这当然也有自己理解上的误区,欢迎讨论和拍砖。