XMPP參考html
1、定義node
XMPP 是一種很相似於http協議的一種數據傳輸協議,它的過程就如同「解包裝--〉包裝」的過程,用戶只須要明白它接受的類型,並理解它返回的類型,就能夠很好的利用xmpp來進行數據通信。瀏覽器
XMPP(可擴展消息處理現場協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線現場探測。它在促進服務器之間的準即時操做。這個協議可能最終容許因特網用戶向因特網上的其餘任何人發送即時消息,即便其操做系統和瀏覽器不一樣。
XMPP的前身是Jabber,一個開源形式組織產生的網絡即時通訊協議。XMPP目前被IETF國際標準組織完成了標準化工做。標準化的核心結果分爲兩部分;安全
- 核心協議
- 擴展協議(XEP: XMPP Extension Protocol)
XMPP的核心協議的定義使得XMPP可以在一個比以往網絡通訊協議更規範的平臺上。藉助於XML易於解析和閱讀的特性,使得XMPP的協議可以很是漂亮。
XMPP的擴展協議是根據IETF在這以前對即時通信的一個抽象定義的,與其餘業已獲得普遍使用的即時通信協議,諸如AIM,QQ等有功能完整,完善等先進性。
XMPP的擴展協議Jingle使得其支持語音和視頻。
XMPP的官方文檔是RFC 3920。服務器
2、網絡結構網絡
XMPP中定義了三個角色,客戶端,服務器,網關。通訊可以在這三者的任意兩個之間雙向發生。服務器同時承擔了客戶端信息記錄,鏈接管理和信息的路由功能。網關承擔着與異構即時通訊系統的互聯互通,異構系統能夠包括SMS(短信),MSN,ICQ等。基本的網絡形式是單客戶端經過TCP/IP鏈接到單服務器,而後在之上傳輸XML。架構
注意,分屬於不一樣server的client之間要通訊的話,中間不能再通過其餘server,這2個server必須直接通訊。對於XMPP來講,server不能象email server那樣,中間能夠通過若干個server才能把郵件發送到目的地。dom
2.1 XMPP客戶端
XMPP 系統的一個設計標準是必須支持簡單的客戶端。事實上,XMPP 系統架構對客戶端只有不多的幾個限制。一個XMPP 客戶端必須支持的功能有:分佈式
- 經過 TCP 套接字與XMPP 服務器進行通訊;
- 解析組織好的 XML 信息包;
- 理解消息數據類型。
XMPP 將複雜性從客戶端轉移到服務器端。這使得客戶端編寫變得很是容易,更新系統功能也一樣變得容易。XMPP 客戶端與服務端經過XML 在TCP 套接字的5222 端口進行通訊,而不須要客戶端之間直接進行通訊。
基本的XMPP 客戶端必須實現如下標準協議(XEP-0211):ide
- RFC3920 核心協議Core
- RFC3921 即時消息和出席協議Instant Messaging and Presence
- XEP-0030 服務發現Service Discovery
- XEP-0115 實體能力Entity Capabilities
2.2 XMPP服務器
XMPP 服務器遵循兩個主要法則:
- 監聽客戶端鏈接,並直接與客戶端應用程序通訊;
- 與其餘 XMPP 服務器通訊;
XMPP開源服務器通常被設計成模塊化,由各個不一樣的代碼包構成,這些代碼包分別處理 Session 管理、用戶和服務器之間的通訊、服務器之間的通訊、DNS(Domain Name System)轉換、存儲用戶的我的信息和朋友名單、保留用戶在下線時收到的信息、用戶註冊、用戶的身份和權限認證、根據用戶的要求過濾信息和系統記錄等。另外,服務器能夠經過附加服務來進行擴展,如完整的安全策略,容許服務器組件的鏈接或客戶端選擇,通向其餘消息系統的網關。
基本的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 的靈活性和可擴展性。
3、系統特色
- 客戶機/服務器通訊模式;
- 分佈式網絡;
- 簡單的客戶端;
- XML的數據格式;
4、地址格式
XMPP的地址叫作JabberID(簡寫爲JID),它用來標示XMPP網絡中的各個XMPP實體。JID由三部分組成:domain,node identifier和resource。JID中domain是必不可少的部分。注意:domain和user部分是不分大小寫的,可是resource區分大小寫。
jid = [ node "@" ] domain [ "/" resource ]
domain = fqdn / address-literal
fqdn = (sub-domain 1*("." sub-domain))
sub-domain = (internationalized domain label)
address-literal = IPv4address / IPv6address
domain:一般指網絡中的網關或者服務器。
node identifier:一般表示一個向服務器或網關請求和使用網絡服務的實體(好比一個客戶端),固然它也可以表示其餘的實體(好比在多用戶聊天系統中的一個房間)。
resource:一般表示一個特定的會話(與某個設備),鏈接(與某個地址),或者一個附屬於某個節點ID實體相關實體的對象(好比多用戶聊天室中的一個參加者)。
JID種類有:
- bare JID:user@domain.tld
- full JID:user@domain.tld/resource
例子:
stpeter@jabber.org:表示服務器jabber.org上的用戶stpeter。
room@service:一個用來提供多用戶聊天服務的特定的聊天室。這裏 「room「 是聊天室的名字, 」service「 是多用戶聊天服務的主機名。
room@service/nick:加入了聊天室的用戶nick的地址。這裏 「room「 是聊天室的名字, 」service「 是多用戶聊天服務的主機名,」nick「 是用戶在聊天室的暱稱。
爲了標示JID,XMPP也有本身的URI,例如xmpp:stpeter@jabber.org,默認規則是在JID前加
xmpp:。
5、通訊原語
XMPP通訊原語有3種:message、presence和iq。
5.1 message
message是一種基本推送消息方法,它不要求響應。主要用於IM、groupChat、alert和notification之類的應用中。
主要
屬性以下:
5.1.1
type屬性,它主要有5種類型:
- normal:相似於email,主要特色是不要求響應;
- chat:相似於qq裏的好友即時聊天,主要特色是實時通信;
- groupchat:相似於聊天室裏的羣聊;
- headline:用於發送alert和notification;
- error:若是發送message出錯,發現錯誤的實體會用這個類別來通知發送者出錯了;
5.1.2
to屬性:標識消息的接收方。
5.1.3
from屬性:指發送方的名字或標示。爲防止地址外泄,這個地址一般由發送者的server填寫,而不是發送者。
載荷(payload):例如body,subject
例子:
<message
to="lily@jabber.org/contact"
type="chat" >
<body> 你好,在忙嗎</body>
</message>
5.2 presence
presence用來代表用戶的狀態,如:online、away、dnd(請勿打擾)等。當改變本身的狀態時,就會在stream的上下文中插入一個Presence元素,來代表自身的狀態。要想接受presence消息,必須通過一個叫作presence subscription的受權過程。
5.2.1 屬性:
5.2.1.1 type屬性,非必須。有如下類別
- subscribe:訂閱其餘用戶的狀態
- probe:請求獲取其餘用戶的狀態
- unavailable:不可用,離線(offline)狀態
5.2.1.2 to屬性:標識消息的接收方。
5.2.1.3 from屬性:指發送方的名字或標示。
5.2.2 載荷(payload):
5.2.2.1 show:
- chat:聊天中
- away:暫時離開
- xa:eXtend Away,長時間離開
- dnd:勿打擾
5.2.2.2 status:格式自由,可閱讀的文本。也叫作rich presence或者extended presence,經常使用來表示用戶當前心情,活動,聽的歌曲,看的視頻,所在的聊天室,訪問的網頁,玩的遊戲等等。
5.2.2.3 priority:範圍-128~127。高優先級的resource能接受發送到bare JID的消息,低優先級的resource不能。優先級爲負數的resource不能收到發送到bare JID的消息。
例子:
<presence from="alice@wonderland.lit/pda">
<show>xa</show>
<status>down the rabbit hole!</status>
</presence>
5.3 iq (Info / Query)
一種請求/響應機制,從一個實體從發送請求,另一個實體接受請求,並進行響應。例如,client在stream的上下文中插入一個元素,向Server請求獲得本身的好友列表,Server返回一個,裏面是請求的結果。
主要的屬性是type。包括:
- Get :獲取當前域值。相似於http get方法。
- Set :設置或替換get查詢的值。相似於http put方法。
- Result :說明成功的響應了先前的查詢。相似於http狀態碼200。
- Error: 查詢和響應中出現的錯誤。
例子:
<iq from="alice@wonderland.lit/pda"
id="rr82a1z7"
to="alice@wonderland.lit"
type="get">
<query xmlns="jabber:iq:roster"/>
</iq>
備註:
一、單詞縮寫:
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
二、參考資料
《XMPP協議的原理介紹》
《RFC3920》
《XMPP: The Definitive Guide》