XMPP協議簡介
- XMPP協議(Extensible Messaging and Presence Protocol,可擴充套件訊息處理現場協議)是一種基於XML的協議。
- 目的是為了解決及時通訊標準而提出來的,最早是在Jabber上實現的。
- 它繼承了在XML環境中靈活的發展性。因此,基於XMPP的應用具有超強的可擴充套件性。
- 並且XML很易穿過防火牆,所以用XMPP構建的應用不易受到防火牆的阻礙。
- 利用XMPP作為通用的傳輸機制,不同組織內的不同應用都可以進行有效的通訊。
XMPP協議特點
- 所有XMPP資訊都是以XML為基礎的,資訊交換的事實標準,擴充套件性強
- XMPP系統是一個分散式系統,每臺伺服器控制自己的資源,但是如果需要,它能與外在的系統進行通訊。XMPP伺服器利用開放的XML協議來進行S2S(Serverto Server)通訊,就像在C2S(Client to Server)一樣。相比之下,大多數的IM系統使用了只是支援C2S/S2C通訊的協議,因此Jabber/XMPP伺服器具有更大的靈活性。
- XMPP協議是公開的,程式則開放原始碼。定義了客戶端和伺服器端的互動要經由XML流。普通訊息型別(message),如改變狀態(presence),傳遞訊息內容或查詢/更新(info/quey)應用則用每個指定的名稱空間(namespace)來建立。
- 狀態(Presence)在整個持久連線中。通過持久連線的有效維持,XMPP協議一直有在網路中維持存在和可用資訊的能力。
- XMPP允許建立並行的TCP套接字連線對所有連線上的客戶端和伺服器端。一旦建立連線,則只有當狀態改變,例如存在的改變,通過這個連線傳輸資料。既然這個連線是持久的,那麼設定、認證、狀態查詢功能都不用每次都重複執行。這種持久的套接字的連線使得XMPP能夠更有效的支援高階的具有存在能力的應用在頻寬和處理資源的使用中。
- Jabber/XMPP系統是模組化的,而且Jabber/XMPP的設計強調如何實現可伸縮性、安全性和可擴充套件性。
XMPP協議分析
XMPP中定義了三個角色:客戶端,伺服器,閘道器。
通訊能夠在這三者的任意兩個之間雙向發生。
- 伺服器同時承擔了客戶端資訊記錄,連線管理和資訊的路由功能。
- 閘道器承擔著與異構即時通訊系統的互聯互通,異構系統可以包括SMS(簡訊),MSN,ICQ等。
- 基本的網路形式是單客戶端通過TCP/IP連線到單伺服器,然後在之上傳輸XML。
伺服器
服務系統是XMPP通訊的智慧提取層,它主要負責:
- 管理來自其他個體的會話連線或者XML流(streams)和來自客戶端、伺服器、其他個體的認證傳送在XML流實體之中的適當的XML地址節點。
- 大多數XMPP服務都允許儲存一些客戶端資料(比如聯絡人列表),在這種情況下,服務直接面向這個客戶端處理XML資料,而不是其他個體。
客戶端
- 大多數客戶端是通過TCP直接連線,並且使用XMPP獲得伺服器提供其應用功能和其他服務。
- 許多資源通過認證的客戶端也許同時連線到伺服器,定義在XMPP地址的每個資源是不同的
- (比如<node@domain/home>和<node@domain/work>)建議伺服器和客戶端採用的端中是5222。
閘道器
- 它的主要功能是將XMPP協議轉換成外部訊息(non-XMPP)系統使用的協議,也將返回的資料轉換成XMPP。
- 這些通訊是基於閘道器和伺服器,基於閘道器和外部訊息系統之間的。
XMPP訊息格式
Jabber/XMPP系統使用XML流在不同實體之間相互傳輸資料。
在兩個實體的連線期間,XML流將從一個實體傳送到另一個實體。在實體間,有三個頂層的XML元素:<message/>,<presence/>和<iq/>。每一個都包含屬性和子節點。
下面將分別描述這些元素。
訊息(message)元素
- 一個即時訊息系統最基本的功能就是能夠在兩個使用者之間實時交換訊息,<message/>元素就提供了這個功能。
- 每條訊息都有一個或多個屬性和子元素。
- 屬性“from”和“to”分別表示了訊息傳送者和接收者的地址。
- <message/>也可以包含一個“type”屬性,這給接收者一個提示,這個訊息是什麼樣的訊息。
- <message/>中也可以包含“id”屬性,用來唯一的標識一個輸出訊息的響應。
狀態(presence)元素
- <presence/>元素用來傳遞一個使用者的存在狀態的感知資訊。
- 使用者可以是“available”,要麼是“unavailable”,“Hide”等。
- 當使用者連線到即時訊息伺服器後,好友發給他的訊息就立即被傳遞。
- 如果使用者沒有連線到伺服器,好友發給他的訊息將被伺服器儲存起來直到使用者連線到伺服器。
- 使用者通過即時訊息客戶端自己控制可用性。但是,如果使用者斷開了同伺服器的連線,伺服器將傳送給訂閱了這個使用者的存在資訊的使用者通知他們使用者已經不可用。
- <presence/>還包含了兩個子元素:<show/>和<status/>。<status>包含了一個對<show/>的文字描述。
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與其他的使用者相連,其他的使用者通過伺服器juliet@capulet.lit建立連線。
第一步Romeo開始通過傳送一個stream包與伺服器montague.lit取得聯絡,這一步包含了鑑權,登入等等。
第二步Romeo獲取了他的聯絡人列表,通過向伺服器montague.lit傳送<iq/>欄位請求,按照下面的協議。
<iq type=‘get’from=‘romeo@montague.lit/pda’> <query xmlns=‘jabber:iq:roster’/> </iq> <iq type=‘result’to=‘romeo@montague.lit/pda’> <query xmlns=‘jabber:iq:roster’> <item jid=‘juliet@capulet.lit’/><item jid=‘mercutio@shakespeare.lit’/> <item jid=‘benvolio@shakespeare.lit’/> </query> </iq>
第三步Romeo傳送了一個presence請求到伺服器montague.lit,然後會將這個資訊廣播到他的所有好友。
<presence from=‘romeo@montague.lit/pda’/> <presence from=‘romeo@montague.lit/pda’to=‘juliet@capulet.lit’/> <presence from=‘romeo@montague.lit/pda’to=‘mercutio@shakespeare.lit’ /> <presence from=‘romeo@montague.lit/pda’to=‘benvolio@shakespeare.lit’ />
第四步如果Romeo的聯絡人都線上,就會將presence回覆給Romeo,告知自己的狀態。
<presence to=‘romeo@montague.lit/pda’from=‘juliet@capulet.lit/balcony’/> <presence to=‘romeo@montague.lit/pda’from=‘juliet@capulet.lit/chamber’/> <presence to=‘romeo@montague.lit/pda’from=‘mercutio@shakespeare.lit/home’/>
第五步Romeo和Juliet開始交換資訊,進行聊天。
<message from=‘romeo@montague.lit/pda’to=‘juliet@capulet.lit’> <body>hi!</body> </message> <message from=‘juliet@capulet.lit/balcony’to=‘romeo@montague.lit/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流: