天天看點

Openfire與XMPP協定 Openfire與XMPP協定

Openfire與XMPP協定

關于xmpp協定可以參考:http://www.jabbercn.org

什麼是OpenFire

Openfire 采用Java開發,開源的實時協作(RTC)伺服器基于XMPP(Jabber)協定。

  您可以使用它輕易的建構高效率的即時通信伺服器。Openfire安裝和使用都非常簡單,并利用Web進行管理。單台伺服器可支援上萬并發使用者。

由于是采用開放的XMPP協定,您可以使用各種支援XMPP協定的IM用戶端軟體登陸服務。

XMPP(Jabber)協定

1、 介紹

XMPP是一種基于XML的協定,它繼承了在XML環境中靈活的發展性。是以,基于XMPP的應用具有超強的可擴充性。經過擴充以後的XMPP可以通過發送擴充的資訊來處理使用者的需求,以及在XMPP的頂端建立如内容釋出系統和基于位址的服務等應用程 序。而且,XMPP包含了針對伺服器端的軟體協定,使之能與另一個進行通話,這使得開發者更容易建立客戶應用程式或給一個配好系統添加功能。

2、 定義:

XMPP(可擴充消息處理現場協定)是基于可擴充标記語言(XML)的協定,它用于即時消息(IM)以及線上現場探測。它在促進伺服器之間的準即時操作。這個協定可能最終允許網際網路使用者向網際網路上的其他任何人發送即時消息,即使其作業系統和浏覽器不同。

XMPP的前身是Jabber, 一個開源形式組織産生的網絡即時通信協定。XMPP目前被IETF國際标準組織完成了标準化工作。标準化的核心結果分為兩部分;

核心的XML流傳輸協定

基于XML FreeEIM流傳輸的即時通訊擴充應用

XMPP的核心XML流傳輸協定的定義使得XMPP能夠在一個比以往網絡通信協定更規範的平台上。借助于XML易于解析和閱讀的特性,使得XMPP的協定能夠非常漂亮。

XMPP的即時通訊擴充應用部分是根據IETF在這之前對即時通訊的一個抽象定義的,與其他業已得到廣泛使用的即時通訊協定,諸如AIM,QQ等有功能完整,完善等先進性。

在IETF 中,把IM協定劃分為四種協定,即時資訊和出席協定(Instant Messaging and Presence Protocol, IMPP)、出席和即時資訊協定(Presence and Instant Messaging Protocol, PRIM)、針對即時資訊和出席擴充的會話發起協定(Session Initiation Protocol for Instant Messaging and Presence Leveraging Extensions, SIMPLE),以及可擴充的消息出席協定(XMPP)。最初研發IMPP 也是為了建立一種标準化的協定,但是今天,IMPP 已經發展成為基本協定單元,定義所有即時通信協定應該支援的核心功能集。

3、 XMPP協定的優點

a. XMPP 協定是公開的,由JSF開源社群組織開發的。XMPP 協定并不屬于任何的機構和個人,而是屬于整個社群,這一點從根本上保證了其開放性。

b. XMPP 協定具有良好的擴充性。在XMPP 中,即時消息和到場資訊都是基于XML 的結構化資訊,這些資訊以XML 節(XML Stanza)的形式在通信實體間交換。XMPP 發揮了XML 結構化資料的通用傳輸層的作用,它将出席和上下文敏感資訊嵌入到XML 結構化資料中,進而使資料以極高的效率傳送給最合适的資源。基于XML 建立起來的應用具有良好的語義完整性和擴充性。

c. 分布式的網絡架構。XMPP 協定都是基于Client/Server 架構,但是XMPP協定本身并沒有這樣的限制。網絡的架構和電子郵件十分相似,但沒有結合任何特定的網絡架構,适用範圍非常廣泛。

d. XMPP 具有很好的彈性。XMPP 除了可用在即時通信的應用程式,還能用在網絡管理、内容供稿、協同工具、檔案共享、遊戲、遠端系統監控等。

e. 安全性。XMPP在Client-to-Server通信,和Server-to-Server通信中都使用TLS (Transport Layer Security)協定作為通信通道的加密方法,保證通信的安全。任何XMPP伺服器可以獨立于公衆XMPP網絡(例如在企業内部網絡中),而使用SASL及TLS等技術更加增強了通信的安全性。如下圖所示:

4、 XMPP協定的組成

主要的XMPP 協定範本及當今應用很廣的XMPP 擴充:

l RFC 3920 XMPP(新的RFC6120):核心。定義了XMPP 協定架構下應用的網絡架構,引入了XML Stream(XML 流)與XML Stanza(XML 節),并規定XMPP 協定在通信過程中使用的XML 标簽。使用XML 标簽從根本上說是協定開放性與擴充性的需要。此外,在通信的安全方面,把TLS 安全傳輸機制與SASL 認證機制引入到核心,與XMPP 進行無縫的連接配接,為協定的安全性、可靠性奠定了基礎。Core 文檔還規定了錯誤的定義及處理、XML 的使用規範、JID(Jabber Identifier,Jabber 辨別符)的定義、命名規範等等。是以這是所有基于XMPP 協定的應用都必需支援的文檔。

l RFC 3921:使用者成功登陸到伺服器之後,釋出更新自己的線上好友管理、發送即時聊天消息等業務。所有的這些業務都是通過三種基本的XML 節來完成的:IQ Stanza(IQ 節), Presence Stanza(Presence 節),Message Stanza(Message 節)。RFC3921 還對阻塞政策進行了定義,定義是多種阻塞方式。可以說,RFC3921 是RFC3920 的充分補充。兩個文檔結合起來,就形成了一個基本的即時通信協定平台,在這個平台上可以開發出各種各樣的應用。

l XEP-0030 服務搜尋。一個強大的用來測定XMPP 網絡中的其它實體所支援特性的協定。

l XEP-0115 實體性能。XEP-0030 的一個通過即時出席的定制,可以實時改變交變廣告功能。

l XEP-0045 多人聊天。一組定義參與和管理多使用者聊天室的協定,類似于Internet 的Relay Chat,具有很高的安全性。

l XEP-0096 檔案傳輸。定義了從一個XMPP 實體到另一個的檔案傳輸。

l XEP-0124 HTTP 綁定。将XMPP 綁定到HTTP 而不是TCP,主要用于不能夠持久的維持與伺服器TCP 連接配接的裝置。

l XEP-0166 Jingle。規定了多媒體通信協商的整體架構。

l XEP-0167 Jingle Audio Content Description Format。定義了從一個XMPP 實體到另一個的語音傳輸過程。

l XEP-0176 Jingle ICE(Interactive Connectivity Establishment)Transport。ICE傳輸機制,檔案解決了如何讓防火牆或是NAT(Network Address Translation)保護下的實體建立連接配接的問題。

l XEP-0177 Jingle Raw UDP Transport。純UDP 傳輸機制,檔案講述了如何在沒有防火牆且在同一網絡下建立連接配接的。

l XEP-0180 Jingle Video Content Description Format。定義了從一個XMPP 實體到另一個的視訊傳輸過程。

l XEP-0181 Jingle DTMF(Dual Tone Multi-Frequency)。

l XEP-0183 Jingle Telepathy Transport Method。

5、 XMPP協定網絡架構

XMPP是一個典型的C/S架構,而不是像大多數即時通訊軟體一樣,使用P2P用戶端到用戶端的架構,也就是說在大多數情況下,當兩個用戶端進行通訊時,他們的消息都是通過伺服器傳遞的(也有例外,例如在兩個用戶端傳輸檔案時).采用這種架構,主要是為了簡化用戶端,将大多數工作放在伺服器端進行,這樣,用戶端的工作就比較簡單,而且,當增加功能時,多數是在伺服器端進行.XMPP服務的架構結構如下圖所示.XMPP中定義了三個角色,XMPP用戶端,XMPP伺服器、網關.通信能夠在這三者的任意兩個之間雙向發生.伺服器同時承擔了用戶端資訊記錄、連接配接管理和資訊的路由功能.網關承擔着與異構即時通信系統的互聯互通,異構系統可以包括SMS(短信)、MSN、ICQ等.基本的網絡形式是單用戶端通過TCP/IP連接配接到單伺服器,然後在之上傳輸XML,工作原理是:

(1) 點連接配接到伺服器;

(2) 伺服器利用本地目錄系統中的證書對其認證;

(3) 點指定目标位址,讓伺服器告知目标狀态;

(4) 伺服器查找、連接配接并進行互相認證;

(5) 點之間進行互動;
           

6、 XMPP用戶端

XMPP 系統的一個設計标準是必須支援簡單的用戶端。事實上,XMPP 系統架構對用戶端隻有很少的幾個限制。一個XMPP 用戶端必須支援的功能有:

1. 通過 TCP 套接字與XMPP 伺服器進行通信;

2. 解析組織好的 XML 資訊包;

3. 了解消息資料類型。
           

XMPP 将複雜性從用戶端轉移到伺服器端。這使得用戶端編寫變得非常容易,更新系統功能也同樣變得容易。XMPP 用戶端與服務端通過XML 在TCP 套接字的5222 端口進行通信,而不需要用戶端之間直接進行通信。

基本的XMPP 用戶端必須實作以下标準協定(XEP-0211):

RFC3920 核心協定Core

RFC3921 即時消息和出席協定Instant Messaging and Presence

XEP-0030 服務發現Service Discovery

XEP-0115 實體能力Entity Capabilities
           

7、 XMPP伺服器

XMPP 伺服器遵循兩個主要法則:

1、監聽用戶端連接配接,并直接與用戶端應用程式通信;

2、與其他 XMPP 伺服器通信;
           

XMPP開源伺服器一般被設計成子產品化,由各個不同的代碼包構成,這些代碼包分别處理Session管理、使用者和伺服器之間的通信、伺服器之間的通信、DNS(Domain Name System)轉換、存儲使用者的個人資訊和朋友名單、保留使用者在下線時收到的資訊、使用者注冊、使用者的身份和權限認證、根據使用者的要求過濾資訊和系統記錄等。另外,伺服器可以通過附加服務來進行擴充,如完整的安全政策,允許伺服器元件的連接配接或用戶端選擇,通向其他消息系統的網關。

基本的XMPP 伺服器必須實作以下标準協定

RFC3920 核心協定Core

RFC3921 即時消息和出席協定Instant Messaging and Presence

XEP-0030 服務發現Service Discovery
           

8、 XMPP網關

XMPP 突出的特點是可以和其他即時通信系統交換資訊和使用者線上狀況。由于協定不同,XMPP 和其他系統交換資訊必須通過協定的轉換來實作,目前幾種主流即時通信協定都沒有公開,是以XMPP 伺服器本身并沒有實作和其他協定的轉換,但它的架構允許轉換的實作。實作這個特殊功能的服務端在XMPP 架構裡叫做網關(gateway)。目前,XMPP 實作了和AIM、ICQ、IRC、MSN Massager、RSS0.9 和Yahoo Massager 的協定轉換。由于網關的存在,XMPP 架構事實上相容所有其他即時通信網絡,這無疑大大提高了XMPP 的靈活性和可擴充性。

9、 XMPP位址格式

一個實體在XMPP網絡結構中被稱為一個接點,它有唯一的标示符jabber identifier(JID),即實體位址,用來表示一個Jabber使用者,但是也可以表示其他内容,例如一個聊天室.一個有效的JID包括一系列元素:

(1) 名(domain identifier);

(2) 點(node identifier);

(3) 源(resource identifier).
           

它的格式是[email protected]/resource,[email protected],類似電子郵件的位址格式.domain用來表示接點不同的裝置或位置,這個是可選的,例如a在Server1上注冊了一個使用者,使用者名為doom,那麼a的JID就是[email protected],在發送消息時,指明[email protected]就可以了,resource可以不用指定,但a在登入到這個Server時,fl的JID可能是[email protected]/exodus(如果a用Exodus軟體登入),也可能是[email protected]/psi(如果a用psi軟體登入).資源隻用來識别屬于使用者的位置或裝置等,一個使用者可以同時以多種資源與同一個XMPP伺服器連接配接。

10、 XMPP消息格式

XMPP中定義了3個頂層XML元素: Message、Presence、IQ,下面針對這三種元素進行介紹。

<Message>

用于在兩個jabber使用者之間發送資訊。Jsm(jabber會話管理器)負責滿足所有的消息,不管目标使用者的狀态如何。如果使用者線上jsm立即送出;否則jsm就存儲。

To : 辨別消息的接收方。

from : 指發送方的名字或标示(id)

Text: 此元素包含了要送出給目标使用者的資訊。

結構如下所示:

<message to= ‘[email protected]/contact’ type =’chat’>

<body> 你好,在忙嗎</body>

</message>
           

<Presence>

用來表明使用者的狀态,如:online、away、dnd(請勿打擾)等。當使用者離線或改變自己的狀态時,就會在stream的上下文中插入一個Presence元素,來表明自身的狀态.結構如下所示:

<presence>

From =‘lily @ jabber.com/contact’

To = ‘yaoman @ jabber.com/contact'

<status> Online </status>

</presence>
           

<presence>元素可以取下面幾種值:

Probe: 用于向接受消息方法發送特殊的請求

subscribe: 當接受方狀态改變時,自動向發送方發送presence資訊。

< IQ >

一種請求/響應機制,從一個實體從發送請求,另外一個實體接受請求,并進行響應.例如,client在stream的上下文中插入一個元素,向Server請求得到自己的好友清單,Server傳回一個,裡面是請求的結果.

<iq > 主要的屬性是type。包括:

Get :擷取目前域值。

Set :設定或替換get查詢的值。

Result :說明成功的響應了先前的查詢。

Error: 查詢和響應中出現的錯誤。

結構如下所示:

<iq from =‘lily @ jabber.com/contact’id=’1364564666’ Type=’result’>
           

XMPP通信協定

一、 Stream

<!-- #################### 通信内容采用壓縮技術,以及通信的相關協定 ####################### -->      
<stream:stream xmlns:stream="http://etherx.jabber.org/streams"      
xmlns="jabber:client" from="127.0.0.1" id="e38900bc" xml:lang="en"      
version="1.0">      
<!--      
xmlns 表示通信用戶端      
from 用戶端的位址(來源)      
id      
lang 通信語言      
<stream:features>      
<!-- 開始tls協定[TLS]的頻道加密方法 -->      
<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"></starttls>      
<!-- 加密技術、安全證書 -->      
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">      
<mechanism>DIGEST-MD5</mechanism>      
<mechanism>PLAIN</mechanism>      
<mechanism>ANONYMOUS</mechanism>      
<mechanism>CRAM-MD5</mechanism>      
</mechanisms>      
<!-- 采用壓縮技術 -->      
<compression xmlns="http://jabber.org/features/compress">      
<method>zlib</method>      
</compression>      
<!-- 權限 -->      
<auth xmlns="http://jabber.org/features/iq-auth" />      
<!-- 注冊 -->      
<register xmlns="http://jabber.org/features/iq-register" />      
</stream:features>      

關于TSL 參考:http://www.jabbercn.org/RFC3920

1、TSL協定遵循以下規則:

A、 一個遵守本協定的初始化實體必須(MUST)在初始化流的頭資訊中包含一個'version'屬性并把值設為“1.0”。

B、 如果TLS握手發生在兩個伺服器之間,除非伺服器聲稱的DNS主機名已經被解析,通信不能(MUST NOT)繼續進行。

C、 當一個遵守本協定的接收實體接收了一個初始化流(它的頭資訊中包含一個'version'屬性并且值設為“1.0”),在發送應答流的的頭資訊(其中包含版本标記)之後,它必須發送(MUST)<starttls/>元素(名字空間為 'urn:ietf:params:xml:ns:xmpp-tls')以及其他它支援的流特性。

D、如果初始化實體選擇使用TLS,TLS握手必須在SASL握手之前完成;這個順序用于幫助保護SASL握手時發送的認證資訊的安全,同時可以在必要的時候在TLS握手之前為SASL外部機制提供證書。

E、 TLS握手期間,一個實體不能(MUST NOT)在流的根元素中發送任何空格符号作為元素的分隔符(在下面的TLS示例中的任何空格符都僅僅是為了便于閱讀);這個禁令用來幫助確定安全層位元組精度。

F、 接收實體必須(MUST)在發送<proceed/> 元素的關閉符号">" 之後立刻開始TLS協商。初始化實體必須(MUST)在從接收實體接收到<proceed/> 元素的關閉符号">" 之後立刻開始TLS協商。

G、 初始化實體必須(MUST)驗證接收實體出示的證書;關于證書驗證流程參見Certificate Validation ( 第十四章第二節)。

H、 證書必須(MUST)檢查初始化實體(比如一個使用者)提供的主機名;而不是通過DNS系統解析出來的主機名;例如,如果使用者指定一個主機名"example.com"而一個DNS SRV [SRV]查詢傳回"im.example.com",證書必須(MUST)檢查"example.com".如果任何種類的XMPP實體(例如用戶端或伺服器)的JID出現在一個證書裡,它必須(MUST)表現為一個别名實體裡面的UTF8字元串,存在于subjectAltName之中。如何使用 [ASN.1] 對象辨別符 "id-on-xmppAddr" 定義在本文的第五章第一節第一小節。

I、 如果 TLS 握手成功了,接收實體必須(MUST) 丢棄TLS 生效之前從初始化實體得到的任何不可靠的資訊

J、 如果 TLS 握手成功了,初始化實體必須(MUST) 丢棄TLS 生效之前從接收實體得到的任何不可靠的資訊

K、 如果 TLS 握手成功了,接收實體不能(MUST NOT)在流重新開始的時候通過提供其他的流特性來向初始化實體提供 STARTTLS 擴充

L、 如果 TLS 握手成功了,初始化實體必須(MUST)繼續進行SASL握手

M、 如果 TLS 握手失敗了,接收實體必須(MUST)終止XML流和相應的TCP連接配接。

N、 關于必須(MUST)支援的機制,參照 Mandatory-to-Implement Technologies (第十四章第七節) 。

2、當一個初始化實體用TLS保護一個和接收實體之間的流,其步驟如下:

A. 初始化實體打開一個TCP連接配接,發送一個打開的XML流頭資訊(其'version'屬性設定為"1.0")給接收實體以初始化一個流。

B. 接收實體打開一個TCP連接配接,發送一個XML流頭資訊(其'version'屬性設定為"1.0")給初始化實體作為應答。

C. 接收實體向初始化實體提議STARTTLS範圍(包括其他支援的流特性),如果TLS對于和接收實體互動是必需的,它應該(SHOULD)在<starttls/>元素中包含子元素<required/>

D. 初始化實體發出STARTTLS指令(例如, 一個符合'urn:ietf:params:xml:ns:xmpp-tls'名字空間的 <starttls/> 元素) 以通知接收實體它希望開始一個TLS握手來保護流。

E. 接收實體必須(MUST)以'urn:ietf:params:xml:ns:xmpp-tls'名字空間中的<proceed/>元素或<failure/>元素應答。如果失敗,接收實體必須(MUST)終止XML流和相應的TCP連接配接。如果繼續進行,接收實體必須(MUST)嘗試通過TCP連接配接完成TLS握手并且在TLS握手完成之前不能(MUST NOT)發送任何其他XML資料。

F. 初始化實體和接收實體嘗試完成TLS握手。(要符合[TLS]規範)

G. 如果 TLS 握手不成功, 接收實體必須(MUST)終止 TCP 連接配接. 如果 TLS 握手成功, 初始化實體必須(MUST)發送給接收實體一個打開的XML流頭資訊來初始化一個新的流(先發送一個關閉标簽</stream>是不必要的,因為接收實體和初始化實體必須(MUST)確定原來的流在TLS握手成功之後被關閉) 。

H. 在從初始化實體收到新的流頭資訊之後,接收實體必須(MUST)發送一個新的XML流頭資訊給初始化實體作為應答,其中應包含可用的特性但不包含STATRTTLS特性。

繼續閱讀