xmpp協議初識


XMPP簡介

XMPP協議簡介

XMPP協議(Extensible Messaging and PresenceProtocol,可擴展消息處理現場協議)是一種基于XML的協議,目的是為了解決及時通信標準而提出來的,最早是在Jabber上實現的。它繼承了在XML環境中靈活的發展性。因此,基于XMPP的應用具有超強的可擴展性。并且XML很易穿過防火墻,所以用XMPP構建的應用不易受到防火墻的阻礙。利用XMPP作為通用的傳輸機制,不同組織內的不同應用都可以進行有效的通信。最初,XMPP作為一個框架開發,目標是支持企業環境內的即時消息傳遞和聯機狀態應用程序。當時的即時消息傳遞網絡是私有的,非常不適合企業使用。例如,AOL Instant Messenger不能針對公司內的安全通信進行調整。盡管存在一些商業解決方案,但他們固定的特性集通常不能進行調整,以滿足組織的特殊需求。XMPP,當時名為Jabber,允許組織構建自己的定制工具來促進實時通信,并允許安裝現成的第三方解決方案。

?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地址的每個資源是不同的(比如和)建議服務器和客戶端采用的端中是5222。

(3)網關

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

XMPP 通信的結構

要促進消息傳遞,每個 XMPP 客戶端用戶必須擁有一個全局惟一標識符。基于歷史原因,這些標識符稱為 Jabber IDs,或稱為 JIDs。鑒于這個協議的分布式特征,重要的是 JID 應包含聯系用戶所需的所有信息:不存在將用戶鏈接到他們連接到的服務器的中央知識庫。JID 的結構類似于電子郵件地址(但不要求 JID 同時也是有效的電子郵件收件人)。

客戶端和服務器節點,我將它們統稱為 XMPP 實體,都擁有 JIDs。SomeCorp 公司的員工 John Doe 可能擁有 JID John.Doe@somecorp.com。這里,somecorp.com 是 SomeCorp 公司的 XMPP 服務器的地址,John.Doe 是 John Doe 的用戶名。

JIDs 還擁有連接到它們的資源。這允許在一個 XMPP 實體標識符之外進一步處理細粒度;例如,盡管上面的示例總體上能夠表示 John Doe,但 John.Doe@somecorp.com/Work 可以用于將數據發送到與他的工作相關的工具。

這些資源可以采用任意用戶定義的名稱,一個 XMPP 實體可以擁有任意數量的資源。除了可以是上下文依賴的外,它們還可以綁定到設備、工具或工作站。對于您的 Pingstream 示例,web 站點的每個訪問者都將作為同一個用戶登錄 XMPP 服務器,但他們擁有不同的資源。

通信類別

使用 XMPP 的實時消息傳遞系統包含三大通信類別:

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

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

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

這些類別是互補的。例如,如果用戶或實體離線(盡管在許多用例中,理想的狀態是服務器在用戶返回之前一直持有用戶的消息),則沒有將數據發送給用戶或發起一個實體的信息/查詢請求的點。

這些消息中的每一條都將通過一個完整的 XML 節 傳遞 — XML 節是以 XML 表達的獨立信息項。

這三種類型的 XMPP 節都擁有以下公共屬性:

from:源 XMPP 實體的 JID;

to:目標接收者的 JID;

id:這次對話的可選標識符;

type:節的可選子類型;

xml:lang:如果內容是人們可讀的,則為消息語言的描述。

基于 XMPP 的數據傳輸發生在一些 XML 流上,默認在端口 5222 上操作。這些 XML 流實際上是兩個完整的 XML 文檔,每個文檔對應一個通信方向。一旦會話建立,stream 元素將打開。這個元素將封裝整個通信文檔。然后,一些節被注入這個文檔的第二層。最后,一旦通信結束,stream 元素將關閉,形成一個完整的文檔。上面描述了Jabber協議的三個頂層節點。通過這種格式Jabber消息不僅可以是簡單的文本(text),而且可以攜帶復雜的數據和各種格式的文件,也就是說Jabber不僅可以用在人與人之間的交流,而且可以實現軟件與軟件或軟件與人之間的交流。Jabber的這種功能大大擴展了即時通信的應用范圍。

XMPP工作機制??

? ? 例如:一個終端名字是Remeo,通過服務器montague.lit與其他的用戶相連,其他的用戶通過服務器juliet@capulet.lit建立連接。

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

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

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

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

第五步Romeo和Juliet開始交換信息,進行聊天。hi!hi yourself!以文檔的觀點來看,客戶端或服務器發送的所有XML文本連綴在一起,從到構成了一個完整的XML文檔。其中的stream標簽就是所謂的XML Stream。在與中間的那些...這樣的XML元素就是所謂的XML Stanza(XML節)。

XMPP核心協議通信的基本模式就是先建立一個stream,然后協商一堆安全之類的東西,中間通信過程就是客戶端發送XML Stanza,一個接一個的。服務器根據客戶端發送的信息以及程序的邏輯,發送XML Stanza給客戶端。但是這個過程并不是一問一答的,任何時候都有可能從一個方發信給另外一方。通信的最后階段是關閉流,關閉TCP/IP連接。

XMPP 使用 BOSH 越過 HTTP

要通過使用 JavaScript 的 XMPP 進行通信的 web 應用程序必須符合一些特殊要求。出于安全考慮,不允許 JavaScript 從 web 頁面的域與不同域上的多個服務器通信。如果您的 web 應用程序界面被托管在 application.mydomain.com,所有 XMPP 通信也必須發生在 application.mydomain.com。

防火墻是另一個問題所在。理想情況下,如果您將 XMPP 用作您的 web 界面的實時元素的基礎,那么您希望它對防火墻后面的用戶有效。但是,公司防火墻通常只對少數幾個協議開放幾個端口,以便允許 web 數據、電子郵件和類似的通信通過。默認情況下,XMPP 使用端口 5222,這很可能是公司防火墻阻止的端口。

假設您知道您的用戶前面的防火墻在端口 80 上允許 HTTP(這是用于訪問 web 的默認協議和端口)。理想情況是您的 XMPP 通信能夠越過該端口上的 HTTP。但是,HTTP 的設計并不針對持續連接。web 的架構不同于實時數據所需的通信架構。

下面我們看看 Bidirectional-streams Over Synchronous HTTP (BOSH) 的標準,該標準為雙向同步數據提供一個模擬層。借助這個標準,可以與一個 XMPP 服務器建立一個較長的 HTTP 連接(時長一分鐘或兩分鐘)。如果新數據在那個期間到達,則 HTTP 請求返回數據并關閉;否則,該請求只是失效。不管是哪種情況,一旦一個請求關閉,另一個請求將重新建立。盡管結果是對一個 web 服務器的一系列重復連接,但它是一個比 Ajax 輪詢更有效的數量級,特別是因為連接到的是一個專業服務器而不是直接連接到 web 應用程序。

BOSH 上的 XMPP 允許 web 應用程序通過一個原生連接持續與 XMPP 服務器通信。客戶端通過端口 80 上的 HTTP 上的一個標準 URL 連接。然后,web 服務器將這個連接代理到由 XMPP 服務器操作的一個不同端口 — 通常是 7070 — 上的 HTTP URL。這樣,無論何時數據被發送到 XMPP 服務器,web 應用程序只需使用一些資源,而 web 客戶端可以使用通常支持的 web 標準從防火墻后操作。維持 BOSH 的較長 HTTP 輪詢的開銷主要由 XMPP 服務器而不是 web 服務器或 web 應用程序承擔。web 服務器和 XMPP 服務器都不會受到與使用 JavaScript 進行通信一樣的域限制,正是因為這一點,消息才能夠被發送到其他 XMPP 服務器和客戶端。

現在,您理解了 XMPP 如何適合實時 web,可以下載并設置它,以便開始創建這個 Pingstream 應用程序。

XMPP 架構

XMPP 與其他的應用層協議(如SMTP)有著相似之處。在這些架構中,具有惟一名稱的客戶機通過相關的服務器與另外一個具有惟一名稱的客戶機進行通信。每個客戶機執行客戶機的協議表單,而服務器在表單中提供路由功能。

圖 1 說明了這個簡單的架構。

在這個例子中,每個客戶機都是同一個域名(discovery.nasa.guv)的一部分。

圖 1. 由一個服務器和兩個客戶機組成的簡單的 XMPP 架構由一個服務器和兩個客戶機組成的簡單 XMPP 架構的圖表服務器還可以針對不同域之間(例如,在 discovery.nasa.guv 和 europa.nasa.guv 之間)的路由進行通信。此外,網關可用于在外部消息傳遞域和協議之間進行轉換。

圖 2 中的示例顯示了一個 XMPP 網絡,網關通往一個短信服務(SMS)域和一個 SMTP 域。在這種情況下,網關大多數都是被用來在 IM 協議(例如,在 XMPP 和 Internet 中繼聊天(IRC))之間進行轉換。作為一個可擴展的協議,XMPP 對于在不同的端點協議間提供統一連接性來說是一個理想的中樞協議。XMPP 網關允許終止一個給定的客戶端到服務器的會話,并且向目標端點協議發起一個新的會話(同時進行必要的協議轉換)。

圖 2. 包含了 XMPP 網關的更為復雜的 XMPP 架構更為復雜的 XMPP 架構圖,包含了連接到 SMS 和 SMTP 客戶端和服務器的 XMPP 網關回頁首XMPP 中的地址XMPP 中的地址(即 Jabber ID[JID])與標準電子郵件地址相似,但有著幾個顯著的差別。JID 包含一個可選節點、一個域和一個可選資源:[ node "@" ] domain [ "/" resource ]最常見的用法就是定義一個 IM 用戶(類似電子郵件地址),比如 DavidBowman@discovery.nasa.guv。用戶能夠多次登錄 XMPP 服務器,而在這個例子中,資源能夠表示位置。例如,示例用戶可能有一個主終端(DavidBowman@discovery.nasa.guv/terminal)JID 和另外一個來自 EVA pod(DavidBowman@discovery.nasa.guv/eva_pod1)的 JID。因此,能夠找到某個特定位置,或離開此位置并找到用戶,不管用戶在哪個位置登錄。回頁首XMPP 協議XMPP 是一個相對簡單的協議,它通過 XML 消息出現在 TCP 套接字上。異步通信發生在 XML 流中,并帶有 XML 節(stanza)。XML 流 是封裝了兩個實體間的 XML 信息交換的容器。XML 流傳遞 XML 節,這些 XML 節是一些分散的信息單元。例如,在 XMPP 中使用 XML 節傳遞消息(IM 用戶間的文本)以及到場信息。為說明這些概念,請看一個在兩個客戶端之間使用 XMPP 進行 IM 通信的簡單示例。


圖 3 演示了兩個實體之間的簡單會話。注意,至少有一個服務器會出現在會話中(在這個例子中,因為兩個客戶端存在于同一個域中,所以準確地說,只有一個服務器)。在 圖 3 中,左邊的客戶端是發起實體(發起兩個實體間的 XMPP 通信)。XML 流使用 to 屬性來識別接收域(以及定義 XML 名稱空間)。右邊的接收客戶端 接收 XML 流并使用 XML 流響應(在這個例子中,使用 from 屬性)進行回應。在這個階段,可以進行幾個不同的協商(如驗證和加密)。請忽略這部分討論(例外情況是當 IM 客戶端出現在不同的域中進行服務器到服務器通信)。(請查看 圖 3 的文字版本。)圖 3. 示例(簡化的)XMPP 通信示例(簡化的)XMPP 通信圖圖 3 中的 XML 流的下一步是進行消息傳遞。這個通信在消息節中進行,并且包括了源和目標 XMPP 地址(from 和 to)、使用的語言以及節正文中的消息。對方用其自己的消息進行響應,關鍵區別是源和目標 XMPP 地址。最后,發出流關閉消息(在連接的兩端進行)以關閉 XML 流。任何一邊都可能返回一個錯誤,如下面所定義。

在本例中,對方發送了一個無效的 XML 流和節。盡管這個示例展示了簡單的 IM 通信,但很容易就能了解消息節是如何轉換成 RPC 消息的,同時負載了來自對等協商的安全問題。您可以把函數注冊為節點,以創建一個動態的 Web 服務框架,而不是對域中的用戶進行注冊。

XMPP通過TCP傳的是什么

傳輸的是與即時通訊相關的指令。在以前這些命令要么用2進制的形式發送(比如QQ),要么用純文本指令加空格加參數加換行苻的方式發送(比如MSN)。而XMPP傳輸的即時通訊指令的邏輯與以往相仿,只是協議的形式變成了XML格式的純文本。這不但使得解析容易了,人也容易閱讀了,方便了開發和查錯。而XMPP的核心部分就是一個在網絡上分片斷發送XML的流協議。這個流協議是XMPP的即時通訊指令的傳遞基礎,也是一個非常重要的可以被進一步利用的網絡基礎協議。所以可以說,XMPP用TCP傳的是XML流。

XMPP的相關文檔

推薦一個包含XMPP相關資料的百度空間:http://hi.baidu.com/jabber/home

XMPP官網:http://xmpp.org/

Jabber官網,包含許多XMPP的實現:http://www.jabber.org/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容