XMPP協議分析-原理篇

 XMPP協議簡介

XMPP協議(Extensible Messaging and PresenceProtocol,可擴展消息處理現場協議)是一種基於XML的協議,目的是爲了解決及時通信標準而提出來的,最早是在Jabber上實現的。它繼承了在XML環境中靈活的發展性。因此,基於XMPP的應用具有超強的可擴展性。並且XML很易穿過防火牆,所以用XMPP構建的應用不易受到防火牆的阻礙。利用XMPP作爲通用的傳輸機制,不同組織內的不同應用都可以進行有效的通信。

 

XMPP協議特點

1)所有XMPP信息都是以XML爲基礎的,信息交換的事實標準,擴展性強

2)XMPP系統是一個分佈式系統,每臺服務器控制自己的資源,但是如果需要,它能與外在的系統進行通信。XMPP服務器利用開放的XML協議來進行S2S(Serverto Server)通信,就像在C2S(Client to Server)一樣。相比之下,大多數的IM系統使用了只是支持C2S/S2C通信的協議,因此Jabber/XMPP服務器具有更大的靈活性。

3)XMPP協議是公開的,程序則開放源代碼。定義了客戶端和服務器端的交互要經由XML流。普通消息類型(message),如改變狀態(presence),傳遞消息內容或查詢/更新(info/quey)應用則用每個指定的命名空間(namespace)來建立。

4)狀態(Presence)在整個持久連接中。通過持久連接的有效維持,XMPP協議一直有在網絡中維持存在和可用信息的能力。

5)XMPP允許建立並行的TCP套接字連接對所有連接上的客戶端和服務器端。一旦建立連接,則只有當狀態改變,例如存在的改變,通過這個連接傳輸數據。既然這個連接是持久的,那麼設置、認證、狀態查找功能都不用每次都重複執行。這種持久的套接字的連接使得XMPP能夠更有效的支持高級的具有存在能力的應用在帶寬和處理資源的使用中。

6)Jabber/XMPP系統是模塊化的,而且Jabber/XMPP的設計強調如何實現可伸縮性、安全性和可擴展性。

 

XMPP協議分析

       XMPP中定義了三個角色:客戶端,服務器,網關。

通信能夠在這三者的任意兩個之間雙向發生。服務器同時承擔了客戶端信息記錄,連接管理和信息的路由功能。網關承擔着與異構即時通信系統的互聯互通,異構系統可以包括SMS

(短信),MSN,ICQ等。基本的網絡形式是單客戶端通過TCP/IP連接到單服務器,然後在之上傳輸XML。

 

       XMPP的基本網絡結構如下:

C1----S1---S2---C3

|

C2----+--G1===FN1===FC1

符號表示:C1,C2,C3=XMPP客戶端;S1,S2=XMPP;服務端G1=在XMPP和使用外部消息網絡(非XMPP)的協議之間轉換的網;FN1=外部消息網絡;FC1=外部消息網絡的客戶端。

 

(1)服務器

服務系統是XMPP通信的智能提取層,它主要負責:管理來自其他個體的會話連接或者XML流(streams)和來自客戶端、服務器、其他個體的認證發送在XML流實體之中的適當的XML地址節點。大多數XMPP服務都允許存儲一些客戶端數據(比如聯繫人列表),在這種情況下,服務直接面向這個客戶端處理XML數據,而不是其他個體。

(2)客戶端

大多數客戶端是通過TCP直接連接,並且使用XMPP獲得服務器提供全部-12-第2章Jabber協議原理及其應用功能和其他服務。許多資源通過認證的客戶端也許同時連接到服務器,定義在XMPP地址的每個資源是不同的(比如<node@domain/home>和<node@domain/work>)建議服務器和客戶端採用的端中是5222。

(3)網關

它的主要功能是將XMPP協議轉換成外部消息(non-XMPP)系統使用的協議,也將返回的數據轉換成XMPP。這些通信是基於網關和服務器,基於網關和外部消息系統之間的。

 

XMPP消息格式

Jabber/XMPP系統使用XML流在不同實體之間相互傳輸數據。在兩個實體的連接期間,XML流將從一個實體傳送到另一個實體。在實體間,有三個頂層的XML元素:<message/>,<presence/>和<iq/>。每一個都包含屬性和子節點。下面將分別描述這些元素。

1)消息(message)元素:

一個即時消息系統最基本的功能就是能夠在兩個用戶之間實時交換消息,<message/>元素就提供了這個功能。每條消息都有一個或多個屬性和子元素。屬性“from”和“to”分別表示了消息發送者和接收者的地址。<message/>也可以包含一個“type”屬性,這給接收者一個提示,這個消息是什麼樣的消息。表3-1給出了“type”屬性的可能取值。<message/>中也可以包含“id”屬性,用來唯一的標識一個輸出消息的響應。

       2)狀態(presence)元素:

<presence/>元素用來傳遞一個用戶的存在狀態的感知信息。用戶可以是“available”,要麼是“unavailable”,“Hide”等。當用戶連接到即時消息服務器後,好友發給他的消息就立即被傳遞。如果用戶沒有連接到服務器,好友發給他的消息將被服務器存儲起來直到用戶連接到服務器。用戶通過即時消息客戶端自己控制可用性。但是,如果用戶斷開了同服務器的連接,服務器將發送給訂閱了這個用戶的存在信息的用戶通知他們用戶已經不可用。<presence/>還包含了兩個子元素:<show/>和<status/>。<status>包含了一個對<show/>的文本描述。

3)IQ(Info<Query)元素

IQ元素是Jabber/XMPP消息協議的第三個頂層元素。IQ代表"Info/Query",用來發送和獲取實體之間的信息。IQ消息是通過“請求/響應”機制在實體間進行交換的。IQ元素用於不同的目的,它們之間通過不同的命名空間來加以區分。在Jabber/XMPP消息協議裏有許多的命名空間,但最常用的命名空間是:"jabber:iq:register","jabber:iq:auth","jabber:iq:roster"。

上面描述了Jabber協議的三個頂層節點。通過這種格式Jabber消息不僅可以是簡單的文本(text),而且可以攜帶複雜的數據和各種格式的文件,也就是說Jabber不僅可以用在人與人之間的交流,而且可以實現軟件與軟件或軟件與人之間的交流。Jabber的這種功能大大擴展了即時通信的應用範圍。

XMPP工作機制

       例如:一個終端名字是Remeo,通過服務器montague.lit與其他的用戶相連,其他的用戶

通過服務器[email protected]建立連接。

第一步Romeo開始通過發送一個stream包與服務器montague.lit取得聯繫,這一步包含了鑑權,登錄等等。

第二步Romeo獲取了他的聯繫人列表,通過向服務器montague.lit發送<iq/>字段請求,按照下面的協議。

<iq type=‘get’from=‘[email protected]/pda’>

<query xmlns=‘jabber:iq:roster’/>

</iq>

<iq type=‘result’to=‘[email protected]/pda’>

<query xmlns=‘jabber:iq:roster’>

<item jid=‘[email protected]’/><item jid=‘[email protected]’/>

<item jid=‘[email protected]’/>

</query>

</iq>

第三步Romeo發送了一個presence請求到服務器montague.lit,然後會將這個信息廣播到他的所有好友。

<presence from=‘[email protected]/pda’/>

<presence from=‘[email protected]/pda’to=‘[email protected]’/>

<presence from=‘[email protected]/pda’to=‘[email protected]

/>

<presence from=‘[email protected]/pda’to=‘[email protected]

/>

第四步如果Romeo的聯繫人都在線,就會將presence回覆給Romeo,告知自己的狀態。

<presence to=‘[email protected]/pda’from=‘[email protected]/balcony’/>

<presence to=‘[email protected]/pda’from=‘[email protected]/chamber’/>

<presence to=‘[email protected]/pda’from=‘[email protected]/home’/>

第五步Romeo和Juliet開始交換信息,進行聊天。

<message from=‘[email protected]/pda’to=‘[email protected]’>

<body>hi!</body>

</message>

<message from=‘[email protected]/balcony’to=‘[email protected]/pda’

<body>hi yourself!</body>

</message>

 

以文檔的觀點來看,客戶端或服務器發送的所有XML文本連綴在一起,從<stream>到</stream>構成了一個完整的XML文檔。其中的stream標籤就是所謂的XML Stream。在<stream>與</stream>中間的那些<message>...</message>這樣的XML元素就是所謂的XML Stanza(XML節)。XMPP核心協議通信的基本模式就是先建立一個stream,然後協商一堆安全之類的東西,中間通信過程就是客戶端發送XML Stanza,一個接一個的。服務器根據客戶端發送的信息以及程序的邏輯,發送XML Stanza給客戶端。但是這個過程並不是一問一答的,任何時候都有可能從一個方發信給另外一方。通信的最後階段是</stream>關閉流,關閉TCP/IP連接。

XML流:

發佈了7 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章