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