一.摘要
这是我粗略读了一遍Jabber协议和相关技术文章后的产物,有些地方不一定准确。在文章中引用的一些代码来自www.jabber.org上的文章。
二. 什么是Jabber
Jabber就像ICQ,MSN一样,是一个基于Internet的即时通讯系统,但是同这些即时通讯软件不同的是,它是一个开放的即时通讯系统,也是一 个基于XML Stream 的协议,用于在Internet上的两个实体之间交换信息,现场状态(presence)和其他的结构化信息。你可以自己架设自己的Jabber服务器, 使用不同的Jabber Client 软件,而不象ICQ或MSN一样,依赖于AIM或MSN的服务器和软件。
第一个Jabber技术在 1998由Jeremie Miller 开发,到目前为止,Internet上已经有数以万计的Jabber服务器和数以百万的Jabber用户。IETF已经将Jabber定为即时通讯和现场 技术的标准协议,称为XMPP(Extensible Messaging and Presence Protocol),相关的规范是RFC3920和RFC3921,并且,JSF(Jabber Software Foundations)也在它的JEP中制定了更多扩展协议(例如GroupChat和文件传输等),这些扩展协议目前还没有成为标准,但是将来有成为 标准的可能。
作为一个标准协议,目前有大量的基于各种语言,各种平台,和各种 license (商业,GPL, Apache )和Open Source的Jabber服务器和Client端被开发出来,同时还有大量的Library,在这些Library的基础上,大家可以自己开发自己的 Jabber应用。
更多的信息,请看www.jabber.org
三. Jabber的使用
Jabber使用同其他的即时通讯软件差不多,你根据你的平台,下载一个Jabber的Client (例如windows 下的Exodus, linux下的Gabber, PSI等),在Internet上寻找一个Jabber服务器(例如Jabber.cn),注册一个帐号,然后再通讯列表 中加入你的好友,就可以开始聊天了。你也可以自己架设一个自己的Jabber服务器,这需要先下载相应的Jabber服务器软件(例如Jive, Jabberd等),安装配置后,把这个服务器的地址告诉你的朋友,你们就可以拥有一个自己的即时通讯服务器了。
Jabber可以实现不同即时通讯软件之间互联互通。例如,通过一个Jabber Client,你可以用你的MSN或ICQ帐号,通过Jabber网关登陆到MSN或ICQ 服务器上,和你的MSN和ICQ好友进行通讯。
在实时通讯的功能上,Jabber同其他的即时通讯软件没有什么太大的不同,普通的即时通讯;群组聊天,好友列表的分类,上线提醒等,这些功能随着具体Jabber Client软件的不同而略有不同,但大体上都是差不多的。
四. Jabber的架构
Jabber从结构上来,更类似于一个邮件服务器,它是分布式的,也就是说,并不象其他即时通讯软件那样,所有的即时通讯用户都连接到同一个服务器上,而是象邮件服务器那样,不同的用户连接到自己的服务器上,在服务器之间通过一个标准协议来交换信息
一个实体在Jabber网络上被称为一个接点,它有唯一的标识,被称为JID,统称用来表示一个Jabber用户,但是也可以表示其他内容,例如一个聊天室。它的格式是[email protected]/resource, [email protected]有点类似电子邮件的地址格式,resource用来表示node不同的设备或位置,这个是可选的,例如我在Server1上注册了一个用户,用户名为doom,那么我的JID就是[email protected], 在发送消息时,指明[email protected]就可以了,resource可以不用指定,但我在登录到这个Server时,我的JID可能是[email protected]/exodus(如果我用Exodus软件登录),也可能是[email protected]/psi(如果我用psi登录)
Jabber是一个典型的C/S 架构,而不是象大多数即时通讯软件一样,使用P2P的架构,也就是说在大多数情况下,在两个Client进行通讯时,他们的消息都是通过Server传递 的(也有例外,例如在两个Client传输文件时)。采用这种架构,是为了简化Client端,将大多数工作放在Server段进行,这样,Client 端的工作就比较简单,而且,当增加功能时,多数是在Server端进行。
Jabber是一套基于XML Stream的协议,当一个Jabber Client连接到一个Jabber Server上时,Client建立了一个从Client到Server的XML流,Server也同时建立了一个从XML到Server的XML流,这 个流看起来像这个样子:
|--------------------|
| |
|--------------------|
| |
| |
| |
|--------------------|
| |
| |
| |
|--------------------|
| |
| |
| |
|--------------------|
| ... |
|--------------------|
| | 所有的信息都是以XML格式加入到这个流中(这些信息被称为stanzas),例如如下的消息:
from=‘[email protected]‘ to=‘[email protected]‘>
Wherefore art thou, Romeo?
因为是XML格式的数据,用户可以自己对数据进行扩充,加入自己的基于XML的私有数据。
五. XMPP协议简单介绍
XMPP在2004年10 月被IETF认定为标准协议,它包括RFCS 3920和RFCS 3921,其中,3920被称为Extensible Messaging and Presence Protocol (XMPP): Core,描述了Jabber 中XML Stream的核心技术,包括安全和国际化的一些技术; 3921被称为Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence,主要是基于即时通讯的一些技术,例如通讯列表,黑名单等。
IETF还制定了两个扩展协议,3922,被称为Mapping the Extensible Messaging and Presence Protocol (XMPP) to Common Presence and Instant Messaging (CPIM);3923,被称为 End-to-End Signing and Object Encryption for the Extensible Messaging and Presence Protocol (XMPP)。
同时,JSF还制定了一系列有关Jabber的扩展协议,称为JEPS(Jabber Enhancement Proposals) ,用来制定一些Jabber的扩展功能,这些协议虽然还没有称为XMPP的一部分,但估计也是迟早的事情。
以下是XMPP中的一些需要特殊说明概念:
Message:Stream的一个子元素,,用来表示传输的消息,有一些相关属性,例如to, from, type等,来表明发送方或接受方,它可以包括一些子元素,例如,等,当用户发送一条信息时,就会在流的上下文中插入一个Message元素,中间有相关的信息。
Gateway: 用于把XMPP协议转化为非XMPP协议,或将非XMPP协议转化为XMPP协议,应用于Jabber同其他IM的通讯,或是其他系统,例如Email
Presence: Stream的一个子元素, 用来表明用户的状态,如在线,离线等,当用户离线或改变自己的状态时,就会在stream的上下文中插入一个Presence元素,来表明自身的状态。
I/Q: Info/Query Stream的一个子元素,,一种请求/响应机制,从一个实体从发送请求,另外一个实体接受请求,并进行相应。例如,client在stream的上下文 中插入一个元素,向Server请求得到自己的好友列表,Server返回一个,里面是请求的结果。
Subscriptions: 订阅机制,用来保证用户可以管理订阅指定用户的Presence
TLS/SASL: Jabber的安全认证机制(这部分我没有太看懂,大意是,在Client和Server,Server和Server进行通讯前,必须有一套安全机制进行认证,在经过认证后,才能进行通讯 TLS和SASL就是基于认证的两种技术)
六. Jabber的发展趋势
我个人觉得,由于MSN,QQ,ICQ经过多年发展,已经拥有庞大的消费级终端用户群,对这些用户来说,Jabber高举开放协议的大旗在这方面并没有多 少优势而言。同时在这些即时通讯软件所上的附加功能越来越多(例如语音,视频,游戏等),Jabber在这方面功能较弱。但是,我觉的在企业即时通讯和应 用领域,可能会有比较大的作为。目前的商业的Jabber软件,针对的都是企业即时通讯服务。
由于Jabber是基于XML的流传输协议,它更适合与传输结构化的信息,这样,在企业的应用领域,会有比较大的发展前途,比较典型的就是,Jabber 已经作为COE(公共操作环境)的一部分,在美军的FBS(Future Combat Systems)系统中提供服务,用于提供Chat服务和接受来自传感器的战场信息,使得实时信息可以单兵作战平台,传感器和其他资源间传送。
同时,由于Jabber跨平台的特性,已经出现了支持Jabber的IP电话和手持设备;有报道说,已经有公司在Jabber的基础上开发订阅/分发平台。
正如Jabber 的创始人Jeremie Miller所希望的,Jabber将来可能更加用于实时的XML数据传输上,而不是仅仅作为一个即时通讯的平台。
七.常用开源Jabber
1. Openfire (Wildfire) 3.x
授权: GPL or 商用
操作系统平台:所有(使用Java开发)
XMPP Jabber 协议实现情况:98%
Tim 评价:
安装和使用非常简单,安装后进入Web界面进行2~3分钟的配置所有的东西都设好了。使用Java语言开发,在目前Java开发人员到处普及的情况下进行 维护和扩展的成本非常低。在我的测试中加上 Connection Manager 的情况下单台服务器可支持 30 万并发用户。缺点是目前还不支持cluster。如果企业内部部署IM使用 Wildfire + Spark 是最佳的组合。
2. ejabberd
授权: GPL
操作系统平台:Linux, Windows, MacOS X 等
XMPP Jabber 协议实现情况:91%
Tim 评价:
Ejabberd目前是可扩展性最好的一种Jabber/XMPP服务器,支持分布多个服务器,并且具有容错处理,单台服务器失效不影响整个cluster运作。
顾虑就是它采用一种大家都没听过的语言Erlang开发,所以很多人可能会象我一样因为这个原因放弃了它。
3. Jabberd 2.x
授权: GPL
操作系统平台:主要是 Linux, (Windows 也支持,但不知道性能怎样)
XMPP Jabber 协议实现情况:76%
Tim 评价:
自从jabber.org改用ejabberd之后,Jabberd一直都在走下坡路。扩展性比不上ejabberd, 易用性比不上 Wildfire,唯一的优势是使用C开发,如果你坚持要用C开发,那么还是选择jabberd吧。
4. Jabberd 1.x
授权: GPL
操作系统平台:主要是 Linux, (Windows 也支持,但不知道性能怎样)
XMPP Jabber 协议实现情况:45%
Tim 评价:
在几年前 jabberd 就是 Jabber 的代名词,至今很多 Jabber 文档仍然介绍的是 Jabber 1.4,
在我以前写的《Jabber 服务器占有率比较》中仍然排名第一。但是它很多新的规范都不支持,相信大部分用户都将转向新的服务器。
5. 后起之秀 DJabberd
授权: open source
操作系统平台:主要是 Linux, (Perl写的,其他平台应该也支持)
XMPP Jabber 协议实现情况:N/A
Tim 评价:
djabberd 使用 epoll 技术,理论上单台服务器可以支持更多用户。Djabberd目前主要应用在LiveJournal上,大部分XMPP协议都支持,稳定性也不用置疑。但是因为推出时间尚短,很多细节功能可能需要时间慢慢完善。