现在比较流行的开放IM协议包括SIP、SIMPLE和XMPP(jabber)。对XMPP做一个简单介绍。
目前XMPP协议的使用的案例还相对较少,主要是Google的gtalk和Nokia新推出的Ovi。
XMPP设计了一个在互联网上唯一的标识,用JID来表达。通常一个 JID 由三部分组成,node@domain/resource 。和email很像,但比 email 的表达形式多了一个 /resource用来表达这个实体下的具体事物。例如ip地址和port的关系。通过不同的resource的区别使 XMPP 实现一个帐号在多处登录,例如,gtalk允许一个帐号的多处登录。
XMPP 规范的重要的通信协议是:如何把消息从一个 JID 发送到另一个 JID (message)。这有点像 email 协议,但不同的是,它强调了实时性和安全性(虽然不是必须的)。如果是两个同domain下的JID的消息传输,传输的方式是 客户端0 -> XMPP服务器端 -> 客户端1 (c2s)。
如果JID可以在不同的domain下,这就需要 domain 间互通(s2s)。对于 IM 网络来说(XMPP 远不只用于 IM 协议)即为不同的IM服务间互通。不同服务商提供的XMPP服务只要遵循s2s标准,其天生的能够互联互通。也就是说使用zeuux提供的XMPP服务,能够加一个使用gtalk的联系人,并互相对话。此时的传输的方式是:user@domain0/resource –c2s–> domain0 XMPP服务器端 –s2s–> domain1 XMPP服务器端 –c2s–> user@domain1/resource。
对于 domain 下的 XMPP 服务的定义和发现,利用了 DNS 协议的SRV记录。
例如如果一个 XMPP 提供了的 s2s 服务,那么根据XMPP标准:
host -t srv _xmpp-server._tcp.gmail.com
会发现 gmail.com 的 XMPP s2s 服务地址已经端口号 5269 。同样,也可以查询 _xmpp-server._tcp.ovi.com 查到Nokia OVI 的 XMPP s2s服务器地址。
对于一个 domain 下的c2s服务,
查询 _xmpp-client._tcp.gmail.com 可以查到我们client 登录 gtalk 的地址(c2s)。
例如连接[email protected]的XMPP帐户:
1. 解析 “_xmpp-client._tcp.example.com” ,获得连接的服务器和端口;
2. 如果失败,则解析 “_jabber._tcp.example.com”的SRV服务,这个主要针对老的服务器配置;
3. 如果还是失败,则客户端认为该域没有配置SRV记录,则直接解析”example.com”并使用默认端口5222连接。
XMPP 强调通讯的安全性,所以推荐的用户认证和握手都是建立在TLS和SASL之上(当然也可以采用明文方式)。
XMPP定义了消息的广播。也就是一个JID可以发布自己的“在线”消息 (presence)。而服务器来决定该发给谁。发送目标是由订阅关系(subscription)决定的。其它多个JID可以订阅某个JID的消息。对于IM来说,最常用的是上线下线和用户签名等状态变化都是通过presence向好友广播。同时由于IM的特点,这种presence消息往往占到IM总的消息量的1/3以上。
第三条即是客户端和服务器端的交互,这个是通过XML流(iq)来实现的。对于应用来说,设置签名,昵称,状态等都依赖于它。
XMPP 的核心协议(RFC 3920)即规定了以上三种通讯协议。
另外,因为XMPP基于XML,所以具有天生的可扩展性,XEP(XMPP Extensions,http://xmpp.org/extensions/)记录了XMPP目前最为活跃的基于core的扩展,现在已经有270个扩展,包括了BOSH、Jingle、Multi-User Chat等丰富的扩展。
下面说说几个流行的开源XMPP服务器的情况:
1. ejabberd
授权: GPLv2
操作系统平台:FreeBSD,GNU/Linux,Windows,MacOS X 等
XMPP Jabber 协议实现情况:95%
最新版本:2.0.5
开发语言:erlang
官方网站:http://www.ejabberd.im
Ejabberd目前是可扩展性最好的一种Jabber/XMPP服务器, 支持服务分布于多个服务器,并且具有容错处理,单台服务器失效不影响整个cluster运作。插件很多,且看文档实现插件非常简单。
优点:性能似乎比openfire好,社区很活跃,版本更新速度快。
缺点:Erlang开发的,相对比较陌生。
使用案例:jabber.org,市场占有率急速上升,看势头很nb。
2. Openfire
授权: GPL or 商用
操作系统平台:所有(使用Java开发)
XMPP Jabber 协议实现情况:98%
最新版本:3.6.4
开发语言:Java
官方网站:http://www.igniterealtime.org/
安装和使用非常简单,安装后进入Web界面进行2~3分钟的配置所有的东西都设好了。看一些测试性能还不错。如果是企业用户内部使用,直接使用 Openfire + Spark即可快速搭建一套企业内部IM服务。
优点:XMPP协议实现比较完整,历史悠久。
缺点:不支持多机和分布。
使用案例:多用于企业内部的通讯,基本一台机器搞定几万人同时使用。
3. Jabberd 2.x
授权: GPL
操作系统平台:主要是 FreeBSD,GNU/Linux(Windows 也支持,但不知道性能怎样)
XMPP Jabber 协议实现情况:76%
开发语言:C
网站:http://jabberd2.xiaoka.com/
最近Jabberd一直都在走下坡路。扩展性比不上ejabberd, 易用性比不上 openfire … …
优点:C开发。
缺点:本身不支持集群,需要第三方patch来做。XMPP协议实现的少,性能一般。
使用案例:曾经的jabber.org
4. Jabberd 14
授权: GPL
操作系统平台:FreeBSD,GNU/Linux, (Windows 也支持,但不知道性能怎样)
XMPP Jabber 协议实现情况:45%
开发语言:C
网站:http://jabberd.org/
在几年前 jabberd 就是 Jabber 的代名词,至今很多 Jabber 文档仍然介绍的是 Jabber 1.4,
优点:暂无
缺点:06年就不更新了,项目已经停滞发展。协议实现度太低,基本不可用。
使用案例:由于其历史悠久,现在还是占有率第一的XMPP Server。
5. 后起之秀 Djabberd
授权: open source
操作系统平台:主要是 Linux
XMPP Jabber 协议实现情况:N/A
djabberd 是memcached的作者写的,使用 epoll (7),作者自己说声称性能很好。Djabberd目前主要应用在LiveJournal上,大部分XMPP Core协议都支持,稳定性应该不错。
优点:据称性能是很nb。
缺点:XMPP协议实现的太少。Perl开发的,代码可读性差。
使用案例:LiveJournal。