XMPP核心協定: http://xmpp.org/rfcs/rfc3920.html
中文版參考:http://wenku.baidu.com/link?url=UgTDRjMGKE_8YUSKad8zF3yG65ZRWmUJvkgAdiFpnS7sYM3-fExguUS0mgwTAn9XjTOPsnOEu-JlWAJSIpY-S027du-L8HE_LAxwMJCkyU3
XMPP是一種基于标準通用标記語言的子集XML的協定,它繼承了在XML環境中靈活的發展性。是以,基于XMPP的應用具有超強的可擴充性。經過擴充以後的XMPP可以通過發送擴充的資訊來處理使用者的需求,以及在XMPP的頂端建立如内容釋出系統和基于位址的服務等應用程 序。而且,XMPP包含了針對伺服器端的軟體協定,使之能與另一個進行通話,這使得開發者更容易建立客戶應用程式或給一個配好系統添加功能。
中文名 可擴充通訊和表示協定
外文名 Extensible Messaging and Presence Protocol
外語縮寫 XMPP
功能 XMPP用TCP傳的是XML流
系統特點:
c/s通信模式;
分布式網絡;
簡單的用戶端;
開發的協定和核心代碼;
标準通用标記語言的子集XML的資料格式。
基本網絡結構:
XMPP中定義了三個角色,用戶端,伺服器,網關。通信能夠在這三者的任意兩個之間雙向發生。伺服器同時承擔了用戶端資訊記錄,連接配接管理和資訊的路由功能。網關承擔着與異構即時通信系統的互聯互通,異構系統可以包括SMS(短信),MSN,ICQ等。基本的網絡形式是單用戶端通過TCP/IP連接配接到單伺服器,然後在之上傳輸XML。
C1----S1---S2—C3
|
C2----+--G1===FN1===FC1
資料結構:
XML流、XML節和流認證(TLS加密和SASL認證)。
XML 流是實體交換XML元素的容器,以<stream>開始, 以</stream>結束, 是通信雙方采用異步方式進行資料傳輸的标準方法, 在整個XMPP 通信過程中處于最外層; XML 節是實體通過XML 流傳輸的結構化資訊單元, 在XML流中以深度為1 的子标記開頭, 并以深度為1 的子标記結束, 這些标記為<message/>、<presence/>和<iq/>。XML節也可通過包含其他子元素來傳送結構化資訊, 是實際需要交換的資訊所在地; 流認證是在XML 流中有關協商傳輸層安全協定、簡單認證與安全層協定和伺服器回撥認證協定完成通信認證、加密等目的的資料互動, 是XMPP 安全機制的重要組成部分。
XML節上的三個頂層元素(五個共同屬性to,from,id,type,xml:lang)
<message/>用于兩個使用者之間發送資訊。
主要的屬性是:type
對應的值:normal,chat,groupchat,error,headline
ex:
<message from="[email protected]/contact" to="[email protected]/contact" type=“chat”>
<body>hello</body>
</message>
<presence/>确定使用者的狀态.
包含的子元素:<show/>,<status/>,<priority/>等
ex:
<presence from="[email protected]/contact" to="[email protected]/contact">
<status>online</status>
</presence>
<iq/>資訊/請求,是管理xmpp伺服器上兩個使用者的轉換,允許她們通過相應的xml格式的查詢和響應。
ex:
<iq from="[email protected]/contact" id=“id11” type=“result”>
</iq>
主要的屬性是:type
對應的值:
Get :擷取目前域值。
Set :設定或替換get查詢的值。
Result :說明成功的響應了先前的查詢。
Error: 查詢和響應中出現的錯誤。
位址模式:
統一的JID(jabber identifier)
JID =[node"@"]domain["/"resource]
工作流程:
XMPP核心協定通信的基本模式就是先建立一個stream,然後協商一堆安全之類的東西,中間通信過程就是用戶端發送XML Stanza,一個接一個的。伺服器根據用戶端發送的資訊以及程式的邏輯,發送XML Stanza給用戶端。但是這個過程并不是一問一答的,任何時候都有可能從一方發信給另外一方。通信的最後階段是</stream>關閉流,關閉TCP/IP連接配接。
第一步: 打開 stream
用戶端:
<?xmlversion='1.0' encoding="UTF-8"?>
<stream:stream
to='example_com'
xmlns='jabber:client'
xmlns:stream='http://etherx_jabber_org/streams'
version='1.0'>
伺服器端:
<?xmlversion='1.0' encoding="UTF-8"?>
<stream:stream
from='example_com'
id='someid'
xmlns='jabber:client'
xmlns:stream='http://etherx_jabber_org/streams'
version='1.0'>
第二步: 加密和認證.(TCP->TLS->SASL->XMPP)
伺服器端:(伺服器發送starttls擴充給用戶端,包括驗證機制和其他一些流的特性)
<stream:features xmlns="http://etherx_jabber_org/streams">
<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
<mechanism>PLAIN</mechanism>
<mechanism>DIGEST-MD5</mechanism>
<mechanism>KERBEROS_V4</mechanism>
</mechanisms>
</stream:features>
用戶端:(發送starttls指令給伺服器)
<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
伺服器端:
<proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls" />
or(failure)
<failure xmlns="urn:ietf:params:xml:ns:xmpp-tls" />
tls協商成功後用戶端初始化一個新的xml流,伺服器帶流特征作響應;
用戶端選擇一個認證機制後,
用戶端:
<auth mechanism="PLAIN" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">AGHFDSJKL</auth>
伺服器會通知用戶端SASL認證成功,
伺服器端:
<success xmlns="urn:ietf:parms:xml:ns:xmpp-sasl" />
然後再初始化,伺服器再響應。
如失敗的話,就直接關閉流且斷開tcp連接配接
<failure xmlns="urn:ietf:params:xml:ns:xmpp-tls">
<temporary-auth-failre/>
</failure>
第三步: 資源綁定(可選)
用戶端:
<iq id="o1331v-l" type="set">
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
<resource>spark</resource>
</bind>
</iq>
伺服器端:
<iq xmlns="jabber:client" id="01331v-1" type="result">
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
<resource>spark</resource>
<jid>[email protected]/spark</jid>
</bind>
</iq>
第四步: 請求一個新的session
用戶端:
<iq id="o1331v-l" type="set">
<session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>
</iq>
伺服器端:
<iq xmlns="jabber:client" id="01331v-1" type="result">
<session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>
</iq>
第五步: 用戶端和伺服器交換 XMPP 片段
這裡就可以自由的發送資訊了。
e.g:
<presence from="[email protected]/spark">
<status>online</status>
</presence>
<message to="[email protected]/spark" type="chat">
<body>hello,Tim!</body>
</message>
第六步: 關閉 stream
用戶端:</stream:stream>
伺服器:</stream:stream>
openfire + smack + xmpp協定建構im.