XMPP協議的原理介紹

yangxi_001發表於2014-08-06

XMPP(可擴充套件訊息處理現場協議)是基於可擴充套件標記語言(XML)的協議,它用於即時訊息(IM)以及線上現場探測。它在促進伺服器之間的準即時操作。這個協議可能最終允許因特網使用者向因特網上的其他任何人傳送即時訊息,即使其作業系統和瀏覽器不同。

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

 

在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 已經發展成為基本協議單元,定義所有即時通訊協議應該支援的核心功能集。

XMPP 和SIMPLE 兩種協議是架構,有助於實現IMPP協議所描述的規範。PRIM 最初是基於即時通訊的協議,與XMPP 和SIMPLE 類似,但是己經不再使用


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

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

3.    分散式的網路架構。XMPP 協議都是基於Client/Server 架構,但是XMPP協議本身並沒有這樣的限制。網路的架構和電子郵件十分相似,但沒有結合任何特定的網路架構,適用範圍非常廣泛。

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

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

 

 

XMPP協議的組成

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

RFC 3920 XMPP:核心。定義了XMPP 協議框架下應用的網路架構,引入了XML Stream(XML 流)與XML Stanza(XML 節),並規定XMPP 協議在通訊過程中使用的XML 標籤。使用XML 標籤從根本上說是協議開放性與擴充套件性的需要。此外,在通訊的安全方面,把TLS 安全傳輸機制與SASL 認證機制引入到核心,與XMPP 進行無縫的連線,為協議的安全性、可靠性奠定了基礎。Core 文件還規定了錯誤的定義及處理、XML 的使用規範、JID(Jabber Identifier,Jabber 識別符號)的定義、命名規範等等。所以這是所有基於XMPP 協議的應用都必需支援的文件。

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

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

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

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

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

XEP-0124 HTTP 繫結。將XMPP 繫結到HTTP 而不是TCP,主要用於不能夠持久的維持與伺服器TCP 連線的裝置。

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

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

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

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

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

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

XEP-0183 Jingle Telepathy Transport Method。

XMPP協議網路架構

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

(1)節點連線到伺服器;(2)伺服器利用本地目錄系統中的證書對其認證;(3)節點指定目標地址,讓伺服器告知目標狀態;(4)伺服器查詢、連線並進行相互認證;(5)節點之間進行互動.

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

 

XMPP伺服器

 

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

l  監聽客戶端連線,並直接與客戶端應用程式通訊;

l  與其他 XMPP 伺服器通訊;

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

基本的XMPP 伺服器必須實現以下標準協議

RFC3920 核心協議Core

RFC3921 即時訊息和出席協議Instant Messaging and Presence

XEP-0030 服務發現Service Discovery

 

 XMPP閘道器

 

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

 

XMPP地址格式

一個實體在XMPP網路結構中被稱為一個接點,它有唯一的標示符jabber identifier(JID),即實體地址,用來表示一個Jabber使用者,但是也可以表示其他內容,例如一個聊天室.一個有效的JID包括一系列元素:(1)域名(domain identifier);(2)節點(node identifier);(3)源(resource identifier).它的格式是node@domain/resourcenode@domain,類似電子郵件的地址格式.domain用來表示接點不同的裝置或位置,這個是可選的,例如a在Server1上註冊了一個使用者,使用者名稱為doom,那麼a的JID就是doom@serverl,在傳送訊息時,指明doom@serverl就可以了,resource可以不用指定,但a在登入到這個Server時,fl的JID可能是doom@serverl、exodus(如果a用Exodus軟體登入),也可能是doom@serverl/psi(如果a用psi軟體登入).資源只用來識別屬於使用者的位置或裝置等,一個使用者可以同時以多種資源與同一個XMPP伺服器連線

 

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

 

<Message>

用於在兩個jabber使用者之間傳送資訊。Jsm(jabber會話管理器)負責滿足所有的訊息,不管目標使用者的狀態如何。如果使用者線上jsm立即提交;否則jsm就儲存。

To :標識訊息的接收方。

from : 指傳送方的名字或標示(id)o

Text: 此元素包含了要提交給目標使用者的資訊。

結構如下所示:

 

<message to= ‘lily@jabber.org/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’>

相關文章