XMPP協議簡介node
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服務器具備更大的靈活性。dom
3)XMPP協議是公開的,程序則開放源代碼。定義了客戶端和服務器端的交互要經由XML流。普通消息類型(message),如改變狀態(presence),傳遞消息內容或查詢/更新(info/quey)應用則用每一個指定的命名空間(namespace)來創建。分佈式
4)狀態(Presence)在整個持久鏈接中。經過持久鏈接的有效維持,XMPP協議一直有在網絡中維持存在和可用信息的能力。ide
5)XMPP容許創建並行的TCP套接字鏈接對全部鏈接上的客戶端和服務器端。一旦創建鏈接,則只有當狀態改變,例如存在的改變,經過這個鏈接傳輸數據。既然這個鏈接是持久的,那麼設置、認證、狀態查找功能都不用每次都重複執行。這種持久的套接字的鏈接使得XMPP可以更有效的支持高級的具備存在能力的應用在帶寬和處理資源的使用中。模塊化
6)Jabber/XMPP系統是模塊化的,並且Jabber/XMPP的設計強調如何實現可伸縮性、安全性和可擴展性。spa
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與其餘的用戶相連,其餘的用戶
經過服務器juliet@capulet.lit創建鏈接。
第一步Romeo開始經過發送一個stream包與服務器montague.lit取得聯繫,這一步包含了鑑權,登陸等等。
<iq type=‘get’from=‘romeo@montague.lit/pda’>
<query xmlns=‘jabber:iq:roster’/>
</iq>
第二步Romeo獲取了他的聯繫人列表,經過向服務器montague.lit發送<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流: