天天看點

xmpp學習筆記-基礎

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.