解析XMPP協議分析與應用
XMPP是一種基于XML的協議,它繼承了在XML環境中靈活的發展性。因此,基于XMPP的應用具有超強的可擴展性。經過擴展以后的XMPP可以通過發送擴展的信息來處理用戶的需求,以及在XMPP的頂端建立如內容發布系統和基于地址的服務等應用程 序。而且,XMPP包含了針對服務器端的軟件協議,使之能與另一個進行通話,這使得開發者更容易建立客戶應用程序或給一個配好系統添加功能。XMPP(可擴展消息處理現場協議)是基于可擴展標記語言(XML)的協議,它用于即時消息(IM)以及在線現場探測。它在促進服務器之間的準即時操作。這個協議可能最終允許因特網用戶向因特網上的其他任何人發送即時消息,即使其操作系統和瀏覽器不同。XMPP的前身是Jabber,一個開源形式組織產生的網絡即時通信協議。XMPP目前被IETF國際標準組織完成了標準化工作。
本文引用地址:http://www.104case.com/article/155743.htm1 XMPP的地址和數據結構
1.1 實體地址
XMPP整體框架如圖1所示。圖中,XMPP框架的各類實體(如XMPP客戶、服務器和網關等)的地址稱為甲吧地址(Jabber Identifier,JID)。JID惟一確定進行即時消息和在線狀態信息通信的獨立對象或實體,并可兼容其他即時通信系統(如MSN等)相應的實體標識及其在線狀態信息。其語法規則為:[節點″@″] 域名[″/″資源],其中各個域的長度不能超過1 023 字節,總長度最大為3 071字節。
XMPP中定義了三個角色,客戶端,服務器,網關。通信能夠在這三者的任意兩個之間雙向發生。服務器同時承擔了客戶端信息記錄,連接管理和信息的路由功能。網關承擔著與異構即時通信系統的互聯互通,異構系統可以包括SMS(短信),MSN,ICQ等。基本的網絡形式是單客戶端通過TCP/IP連接到單服務器,然后在之上傳輸XML。傳輸的是與即時通訊相關的指令。在以前這些命令要么用2進制的形式發送(比如QQ),要么用純文本指令加空格加參數加換行苻的方式發送(比如MSN)。而XMPP傳輸的即時通訊指令的邏輯與以往相仿,只是協議的形式變成了XML格式的純文本。這不但使得解析容易了,人也容易閱讀了,方便了開發和查錯。而XMPP的核心部分就是一個在網絡上分片斷發送XML的流協議。這個流協議是XMPP的即時通訊指令的傳遞基礎,也是一個非常重要的可以被進一步利用的網絡基礎協議。所以可以說,XMPP用TCP傳的是XML流。
域名指定了實體連接的XMPP服務器。每個可用XMPP服務器都擁有一個完整域名,域名可在域名系統(DNS)中查找;節點可表示某用戶、一類應用或某項服務,所有節點都對應一個精確的域名;資源用來識別屬于用戶的特殊對象(如設備或位置),允許一個用戶同時以多個資源與同一XMPP服務器連接。
1.2 XMPP的數據結構
由于XMPP是基于XML的協議,因此用戶可根據自己的需要定義標記,表述幾乎任何一種結構化數據,并可方便地創建定制的應用或增加功能。
1.2.1 三個頂級XML元素
XMPP定義的3個關鍵頂級XML元素為message/>、presence/>和iq/>(info/query),每個元素都可以通過屬性和名字空間包含大量數據,其屬性和名字空間都是XMPP的組成部分。
message/>元素用來包含2個XMPP實體間互相發送的消息內容;presence/>元素表示實體可用性信息,可用性信息有“可用”和“不可用”2種;iq/>元素用來構建2個實體間的會話,并且允許實體間來回傳送XML格式的請求和響應以便取得或設置公共的用戶信息,如名字等。
即時通信中名字沖突問題使用XML的命名空間特性來解決。XML命名空間定義了一種將XML中使用的元素和屬性與統一資源定位符(Uniform Resource Locator,URL)引用聯系起來對元素和屬性進行定義的方法。 統一資源定位符(URL)是用于完整地描述Internet上網頁和其他資源的地址的一種標識方法。Internet上的每一個網頁都具有一個唯一的名稱標識,通常稱之為URL地址,這種地址可以是本地磁盤,也可以是局域網上的某一臺計算機,更多的是Internet上的站點。簡單地說,URL就是Web地址,俗稱“網址”。
1.2.2 XMPP的數據結構
從結構上看,XMPP有3種數據:XML流、流認證和XML節。XML流是實體交換XML元素的容器,以stream>開始,以/stream>結束,是通信雙方采用異步方式進行數據傳輸的標準方法,在整個XMPP通信過程中處于最外層;XML節是實體通過XML流傳輸的結構化信息單元,在XML流中以深度為1的子標記開頭,并以深度為1的子標記結束,這些標記為message/>、presence/>和iq/>。
XMPP為XML流扮演通用“傳輸層”的角色。XML流中包含傳輸的認證信息和現場消息,XMPP能使數據高效路由至最合適的請求源,并最大限度地簡化客戶機上的實現,使跨應用實時交流信息成為可能。
2 工作過程
(1)節點(如yb、pt)向本地服務器連接。
①XMPP用戶通過開啟一個從客戶端到服務器端的XML流,來申請一個在服務器上的Socket連接。
SEND: stream:stream
to=′sdpt.com′
xmlns=′jabber:client′
xmlns:stream=′http://etherx.jabber.org/streams′>
②服務器通過開啟一個從服務器到客戶端的XML流進行回復。
RECV: stream:stream
from=′sdpt.com′
id=′180763465′
xmlns=′jabber:client′
xmlns:stream=′http://etherx.jabber.org/streams′>
(2)節點向本地服務器申請登錄。
①用戶詢問登錄服務器時需提供的信息。
SEND: iq id=′2′ type=′get′>
query xmlns=′jabber:iq:auth′>
username>yb/username>
/query>
/iq>
②服務器回應用戶,告知用戶登錄所需要的信息。
③用戶提供所需的信息。
④服務器響應一個空的類型為“result”的iq元素,表明登錄成功。
RECV:iq id=′3′ type=′result′/>
⑤yb用戶發送當前狀態給服務器,表明其在線。
SEND: presence>
status>Online/status>
/presence>
(3)用戶獲得花名冊,好友增加一個聯系人(如yb獲知朋友sd在線)。
(4)用戶間發送消息(如yb向sd發送消息)。
用戶發送一條消息:
SEND: message to′sd@jabber.org′>
body>Where are you?/body>
/message>
服務器會根據XMPP用戶的會話信息加上一個源地址,這樣接收者收到消息時,消息中已經包含了源地址。
(5)XMPP服務器根據目標JID中的域名查找、連接到目標服務器并進行認證(如sdpt.com使用DNS查找jabber.org,連接到jabber.org服務器上并進行認證)。
(6)XMPP服務器jabber.org證實sd連接到該服務器上,yb被授權與sd進行通信。
(7)數據在yb與sd間流動。
(8)用戶退出,退出時只需要關閉stream>。
評論