Jabber介紹
一. 前言
這是我粗略讀了一遍Jabber協(xié)議和相關(guān)技術(shù)文章后的產(chǎn)物,有些地方不一定準確。在文章中引用的一些代碼來自www.jabber.org上的文章。
二. 什么是Jabber
Jabber就像ICQ,MSN一樣,是一個基于Internet的即時通訊系統(tǒng),但是同這些即時通訊軟件不同的是,它是一個開放的即時通訊系統(tǒng),也是一個基于XML Stream 的協(xié)議,用于在Internet上的兩個實體之間交換信息,現(xiàn)場狀態(tài)(presence)和其他的結(jié)構(gòu)化信息。你可以自己架設自己的Jabber服務器,使用不同的Jabber Client 軟件,而不象ICQ或MSN一樣,依賴于AIM或MSN的服務器和軟件。
第一個Jabber技術(shù)在1998由Jeremie Miller 開發(fā),到目前為止,Internet上已經(jīng)有數(shù)以萬計的Jabber服務器和數(shù)以百萬的Jabber用戶。IETF已經(jīng)將Jabber定為即時通訊和現(xiàn)場技術(shù)的標準協(xié)議,稱為XMPP(Extensible Messaging and Presence Protocol),相關(guān)的規(guī)范是RFC3920和RFC3921,并且,JSF(Jabber Software Foundations)也在它的JEP中制定了更多擴展協(xié)議(例如GroupChat和文件傳輸?shù)?,這些擴展協(xié)議目前還沒有成為標準,但是將來有成為標準的可能。
作為一個標準協(xié)議,目前有大量的基于各種語言,各種平臺,和各種 license (商業(yè),GPL, Apache )和Open Source的Jabber服務器和Client端被開發(fā)出來,同時還有大量的Library,在這些Library的基礎(chǔ)上,大家可以自己開發(fā)自己的Jabber應用。
更多的信息,請看www.jabber.org
三. Jabber的使用
Jabber使用同其他的即時通訊軟件差不多,你根據(jù)你的平臺,下載一個Jabber的Client (例如windows 下的Exodus, linux下的Gabber, PSI等),在Internet上尋找一個Jabber服務器(例如Jabber.cn),注冊一個賬號,然后再通訊列表中加入你的好友,就可以開始聊天了。你也可以自己架設一個自己的Jabber服務器,這需要先下載相應的Jabber服務器軟件(例如Jive, Jabberd等),安裝配置后,把這個服務器的地址告訴你的朋友,你們就可以擁有一個自己的即時通訊服務器了。
Jabber可以實現(xiàn)不同即時通訊軟件之間互聯(lián)互通。例如,通過一個Jabber Client,你可以用你的MSN或ICQ賬號,通過Jabber網(wǎng)關(guān)登陸到MSN或ICQ 服務器上,和你的MSN和ICQ好友進行通訊。
在實時通訊的功能上,Jabber同其他的即時通訊軟件沒有什么太大的不同,普通的即時通訊;群組聊天,好友列表的分類,上線提醒等,這些功能隨著具體Jabber Client軟件的不同而略有不同,但大體上都是差不多的。
四. Jabber的架構(gòu)
Jabber從結(jié)構(gòu)上來,更類似于一個郵件服務器,它是分布式的,也就是說,并不象其他即時通訊軟件那樣,所有的即時通訊用戶都連接到同一個服務器上,而是象郵件服務器那樣,不同的用戶連接到自己的服務器上,在服務器之間通過一個標準協(xié)議來交換信息
一個實體在Jabber網(wǎng)絡上被稱為一個接點,它有唯一的標識,被稱為JID,統(tǒng)稱用來表示一個Jabber用戶,但是也可以表示其他內(nèi)容,例如一個聊天室。它的格式是node@domain/resource, node@domain有點類似電子郵件的地址格式,resource用來表示node不同的設備或位置,這個是可選的,例如我在Server1上注冊了一個用戶,用戶名為doom,那么我的JID就是doom@server1, 在發(fā)送消息時,指明doom@server1就可以了,resource可以不用指定,但我在登錄到這個Server時,我的JID可能是doom@server1/exodus(如果我用Exodus軟件登錄),也可能是doom@server1/psi(如果我用psi登錄)
Jabber是一個典型的C/S 架構(gòu),而不是象大多數(shù)即時通訊軟件一樣,使用P2P的架構(gòu),也就是說在大多數(shù)情況下,在兩個Client進行通訊時,他們的消息都是通過Server傳遞的(也有例外,例如在兩個Client傳輸文件時)。采用這種架構(gòu),是為了簡化Client端,將大多數(shù)工作放在Server段進行,這樣,Client端的工作就比較簡單,而且,當增加功能時,多數(shù)是在Server端進行。
Jabber是一套基于XML Stream的協(xié)議,當一個Jabber Client連接到一個Jabber Server上時,Client建立了一個從Client到Server的XML流,Server也同時建立了一個從XML到Server的XML流,這個流看起來像這個樣子:
|--------------------|
| |
|--------------------|
| |
| |
| |
|--------------------|
| |
| |
| |
|--------------------|
| |
| |
| |
|--------------------|
| ... |
|--------------------|
| |
所有的信息都是以XML格式加入到這個流中(這些信息被稱為stanzas),例如如下的消息:
from=‘juliet@capulet.com‘ to=‘romeo@montague.net‘>
Wherefore art thou, Romeo?
因為是XML格式的數(shù)據(jù),用戶可以自己對數(shù)據(jù)進行擴充,加入自己的基于XML的私有數(shù)據(jù)。
五. XMPP協(xié)議簡單介紹
XMPP在2004年10 月被IETF認定為標準協(xié)議,它包括RFCS 3920和RFCS 3921,其中,3920被稱為Extensible Messaging and Presence Protocol (XMPP): Core,描述了Jabber 中XML Stream的核心技術(shù),包括安全和國際化的一些技術(shù); 3921被稱為Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence,主要是基于即時通訊的一些技術(shù),例如通訊列表,黑名單等。
IETF還制定了兩個擴展協(xié)議,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還制定了一系列有關(guān)Jabber的擴展協(xié)議,稱為JEPS(Jabber Enhancement Proposals) ,用來制定一些Jabber的擴展功能,這些協(xié)議雖然還沒有稱為XMPP的一部分,但估計也是遲早的事情。
以下是XMPP中的一些需要特殊說明概念:
Message:Stream的一個子元素,,用來表示傳輸?shù)南ⅲ幸恍┫嚓P(guān)屬性,例如to, from, type等,來表明發(fā)送方或接受方,它可以包括一些子元素,例如,等,當用戶發(fā)送一條信息時,就會在流的上下文中插入一個Message元素,中間有相關(guān)的信息。
Gateway: 用于把XMPP協(xié)議轉(zhuǎn)化為非XMPP協(xié)議,或?qū)⒎荴MPP協(xié)議轉(zhuǎn)化為XMPP協(xié)議,應用于Jabber同其他IM的通訊,或是其他系統(tǒng),例如Email
Presence: Stream的一個子元素, 用來表明用戶的狀態(tài),如在線,離線等,當用戶離線或改變自己的狀態(tài)時,就會在stream的上下文中插入一個Presence元素,來表明自身的狀態(tài)。
I/Q: Info/Query Stream的一個子元素,,一種請求/響應機制,從一個實體從發(fā)送請求,另外一個實體接受請求,并進行相應。例如,client在stream的上下文中插入一個元素,向Server請求得到自己的好友列表,Server返回一個,里面是請求的結(jié)果。
Subscriptions: 訂閱機制,用來保證用戶可以管理訂閱指定用戶的Presence
TLS/SASL: Jabber的安全認證機制(這部分我沒有太看懂,大意是,在Client和Server,Server和Server進行通訊前,必須有一套安全機制進行認證,在經(jīng)過認證后,才能進行通訊 TLS和SASL就是基于認證的兩種技術(shù))
六. Jabber的發(fā)展趨勢
我個人覺得,由于MSN,QQ,ICQ經(jīng)過多年發(fā)展,已經(jīng)擁有龐大的消費級終端用戶群,對這些用戶來說,Jabber高舉開放協(xié)議的大旗在這方面并沒有多少優(yōu)勢而言。同時在這些即時通訊軟件所上的附加功能越來越多(例如語音,視頻,游戲等),Jabber在這方面功能較弱。但是,我覺的在企業(yè)即時通訊和應用領(lǐng)域,可能會有比較大的作為。目前的商業(yè)的Jabber軟件,針對的都是企業(yè)即時通訊服務。
由于Jabber是基于XML的流傳輸協(xié)議,它更適合與傳輸結(jié)構(gòu)化的信息,這樣,在企業(yè)的應用領(lǐng)域,會有比較大的發(fā)展前途,比較典型的就是,Jabber已經(jīng)作為COE(公共操作環(huán)境)的一部分,在美軍的FBS(Future Combat Systems)系統(tǒng)中提供服務,用于提供Chat服務和接受來自傳感器的戰(zhàn)場信息,使得實時信息可以單兵作戰(zhàn)平臺,傳感器和其他資源間傳送。
同時,由于Jabber跨平臺的特性,已經(jīng)出現(xiàn)了支持Jabber的IP電話和手持設備;有報道說,已經(jīng)有公司在Jabber的基礎(chǔ)上開發(fā)訂閱/分發(fā)平臺。
正如Jabber 的創(chuàng)始人Jeremie Miller所希望的,Jabber將來可能更加用于實時的XML數(shù)據(jù)傳輸上,而不是僅僅作為一個即時通訊的平臺。
七. 其他
Server的選擇:目前有一堆Serve軟件可供選擇,各種平臺,各種license 的都有。JSF定義了一個Server所支持的功能列表,例如是否DB,是否有Admin界面等Server端功能,但是到目前為止,沒有一個Jabber Server完全支持這些功能,最多也就90%多。目前我自己使用的是Jive,支持DB,開發(fā)語言是Java,OpenSource,我個人覺的在Windows平臺下安裝比較方便。
Client的選擇:Exodus和gaim均可以,這兩種Client都支持Jabber XML數(shù)據(jù)的顯示,這對調(diào)試幫助比較大。
Library選擇:我大致用了下Jive的smack,基于Java的,還成。 但是目前windows平臺下沒有太理想的library,開始找了個商業(yè)軟件叫IP*Work,支持的語言挺多,C++builder, VC, VB都有相應得控件,但是,不支持中文,一發(fā)送中文就掉線;JabberCom似乎也成,delphi 寫的,OpenSource,但對中文支持的也不好,在對中文字符長度的判斷上出現(xiàn)了錯誤,比較奇怪的是,作者在2001年就停止開發(fā)了,不知道干什么去了;還有其他支持Jabber的Client端COM組件,但是都是商業(yè)軟件,要錢的,就沒試;至于C#的,因為不會,也就沒有具體試過。