XMPP 是一種很類似於http協議的一種數據傳輸協議,它的過程就如同“解包裝--〉包裝”的過程,用戶只需要明白它接受的類型,並理解它返回的類型,就可以很好的利用xmpp來進行數據通訊。
XMPP(可擴展消息處理現場協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線現場探測。它在促進服務器之間的準即時操作。這個協議可能最終允許因特網用戶向因特網上的其他任何人發送即時消息,即使其操作系統和瀏覽器不同。
XMPP的前身是Jabber,一個開源形式組織產生的網絡即時通信協議。XMPP目前被IETF國際標準組織完成了標準化工作。標準化的核心結果分爲兩部分;
- 核心協議
- 擴展協議(XEP: XMPP Extension Protocol)
XMPP的擴展協議是根據IETF在這之前對即時通訊的一個抽象定義的,與其他業已得到廣泛使用的即時通訊協議,諸如AIM,QQ等有功能完整,完善等先進性。
XMPP的擴展協議Jingle使得其支持語音和視頻。
XMPP的官方文檔是RFC 3920。
二、網絡結構
XMPP中定義了三個角色,客戶端,服務器,網關。通信能夠在這三者的任意兩個之間雙向發生。服務器同時承擔了客戶端信息記錄,連接管理和信息的路由功能。網關承擔着與異構即時通信系統的互聯互通,異構系統可以包括SMS(短信),MSN,ICQ等。基本的網絡形式是單客戶端通過TCP/IP連接到單服務器,然後在之上傳輸XML。
注意,分屬於不同server的client之間要通信的話,中間不能再經過其他server,這2個server必須直接通信。對於XMPP來說,server不能象email server那樣,中間可以經過若干個server才能把郵件發送到目的地。
2.1 XMPP客戶端
XMPP 系統的一個設計標準是必須支持簡單的客戶端。事實上,XMPP 系統架構對客戶端只有很少的幾個限制。一個XMPP 客戶端必須支持的功能有:
- 通過 TCP 套接字與XMPP 服務器進行通信;
- 解析組織好的 XML 信息包;
- 理解消息數據類型。
基本的XMPP 客戶端必須實現以下標準協議(XEP-0211):
- RFC3920 核心協議Core
- RFC3921 即時消息和出席協議Instant Messaging and Presence
- XEP-0030 服務發現Service Discovery
- XEP-0115 實體能力Entity Capabilities
2.2 XMPP服務器
XMPP 服務器遵循兩個主要法則:
- 監聽客戶端連接,並直接與客戶端應用程序通信;
- 與其他 XMPP 服務器通信;
基本的XMPP 服務器必須實現以下標準協議
- RFC3920 核心協議Core
- RFC3921 即時消息和出席協議Instant Messaging and Presence
- XEP-0030 服務發現Service Discovery
2.3 XMPP網關
XMPP 突出的特點是可以和其他即時通信系統交換信息和用戶在線狀況。由於協議不同,XMPP 和其他系統交換信息必須通過協議的轉換來實現,目前幾種主流即時通信協議都沒有公開,所以XMPP 服務器本身並沒有實現和其他協議的轉換,但它的架構允許轉換的實現。實現這個特殊功能的服務端在XMPP 架構裏叫做網關(gateway)。目前,XMPP 實現了和AIM、ICQ、IRC、MSN Massager、RSS0.9 和Yahoo Massager 的協議轉換。由於網關的存在,XMPP
架構事實上兼容所有其他即時通信網絡,這無疑大大提高了XMPP 的靈活性和可擴展性。
三、系統特點
- 客戶機/服務器通信模式;
- 分佈式網絡;
- 簡單的客戶端;
- XML的數據格式;
jid = [ node "@" ] domain [ "/" resource ]domain = fqdn / address-literalfqdn = (sub-domain 1*("." sub-domain))sub-domain = (internationalized domain label)address-literal = IPv4address / IPv6address
- bare JID:[email protected]
- full JID:[email protected]/resource
- normal:類似於email,主要特點是不要求響應;
- chat:類似於qq裏的好友即時聊天,主要特點是實時通訊;
- groupchat:類似於聊天室裏的羣聊;
- headline:用於發送alert和notification;
- error:如果發送message出錯,發現錯誤的實體會用這個類別來通知發送者出錯了;
- subscribe:訂閱其他用戶的狀態
- probe:請求獲取其他用戶的狀態
- unavailable:不可用,離線(offline)狀態
- chat:聊天中
- away:暫時離開
- xa:eXtend Away,長時間離開
- dnd:勿打擾
<show>xa</show>
<status>down the rabbit hole!</status>
</presence>
主要的屬性是type。包括:
- Get :獲取當前域值。類似於http get方法。
- Set :設置或替換get查詢的值。類似於http put方法。
- Result :說明成功的響應了先前的查詢。類似於http狀態碼200。
- Error: 查詢和響應中出現的錯誤。
id="rr82a1z7"
to="[email protected]"
type="get">
<query xmlns="jabber:iq:roster"/>
</iq>
備註:
1、單詞縮寫:
IETF: Internet Engineering Task Force.
XSF: XMPP Standards Foundation.
XEP: XMPP Extension Protocols.
URI: Uniform Resource Identifier
TLS: Transport Layer Security
SASL: Simple Authentication and Security Layer
BOSH: Bidirectional-streams Over Synchronous HTTP
2、參考資料
《RFC3920》