XMPP-可擴展的消息和出席信息協議(概述)

概述


  可擴展消息的和出席信息協議(XMPP)主要採用XML流實如今任意兩個網絡終端接近實時的交換結構化信息,XMPP提供一個通用的可擴展的框架來交換XML數據,用於準實時消息和出席信息以及請求-響應服務。html

通用的架構


  XMPP沒有指定任何特定的網絡結構,但它一般是採用客戶-服務器架構進行實現,其中客戶端經過TCP方式使用XMPP訪問服務器,服務器之間也採用TCP方式進行通訊。node

1.同一域名服務器和客戶端組成的簡單XMPP架構安全

  具備唯一名稱的客戶機經過相關的服務器與另一個具備唯一名稱的客戶機進行通訊,每一個客戶機執行客戶機的協議表單,而服務器在表單中提供路由功能服務器

2.包含網關的複雜XMPP架構網絡

  針對不一樣域(XMPP域,短信服務(SMS)域和一個 SMTP 域)之間,網關能夠把 XMPP 翻譯成外部(非XMPP)消息系統,並把返回的消息翻譯成 XMPP 。做爲一個可擴展的協議,XMPP 對於在不一樣的端點協議間提供統一鏈接性來講是一個理想的中樞協議。XMPP 網關容許終止一個給定的客戶端到服務器的會話,而且向目標端點協議發起一個新的會話(同時進行必要的協議轉換)。架構

地址空間


概覽  

  一個XMPP實體的地址被稱爲JID,一個合法的JID包含可選節點,域名,可選資源名,一個JID做爲網絡通信ID,其具備惟一性框架

  XMPPJID *jid = [ node "@" ] domain [ "/" resource ];dom

  一個 JID 的每一個合法部分(節點名,域名,資源名)的長度不能(MUST NOT)超過 1023 字節。也就是總體長度(包括 '@' 和 '/' )不能超過 3071 字節異步

[可選節點]域名[可選資源]

  域名:主要ID,一個域名標識引用的實體,並不是老是一個服務器,它也多是一個服務器的子域地址編碼

  可選節點:第二ID,一般表示一個向服務器或網關請求和使用網絡服務的實體(好比一個客戶端),固然它也可以表示其餘的實體(好比在多用戶聊天系統中的一個房間)

    可選資源:一般表示一個特定的會話,鏈接(好比設備或者所在位置),或者一個附屬於某個節點ID實體相關實體的對象(好比多用戶聊天室中的一個參加者),也稱第三ID

XML流和XML節 


概覽

  XML流和XML節使得實體之間異步交換低負載的結構化信息成爲可能

  XML流:

    一個XML流是一個容器,包含了兩個實體之間經過網絡交換的XML元素。一個XML流是由一個XML打開標籤 <stream> (包含適當的屬性和名字空間聲明)開始的,流的結尾則是一個XML關閉L標籤 </stream> 。在流的整個生命週期,初始化它的實體能夠經過流發送大量的XML元素,用於流的握手(TLS握手或SASL握手)或XML節(此處主要指符合缺省名字空間的元素,包括<message/>,<presence/>, 或 <iq/> 元素)

    「初始的流」由初始化實體(一般是一個客戶端或服務器)和接收實體(一般是一個服務器)握手,從接收實體來看,它就是那個初始實體的"會話".初始化流容許從初始化實體到接收實體的單向通訊;爲了使接收實體可以和初始實體交換信息,接收實體必須發起一個反向的握手(應答流).

  XML節:

    一個XML節是一個實體經過 XML 流向另外一個實體發送的結構化信息中的一個離散的語義單位。任何XML節都是從一個XML流的下一級的某個打開標籤(如 <presence>)開始,到相應的關閉標籤(如 </presence>)(此處XML節僅限於<message/>, <presence/>, 和 <iq/> 元素)

  客戶端與服務端進行會話:

    1.客戶端發送一個打開標籤<Stream>給服務器,初始化流(也可在此以前發送一段文本聲明XML版本和支持的字符集)

    2.服務器回覆一個XML流給客戶端(也可在此以前發送一段文本聲明)

    3.客戶端完成SASL握手

    4.客戶端發送關閉標籤</stream>給服務器(或服務器發送給客戶端)

    5.客戶端與服務器完全終結這個鏈接(一般爲一個TCP鏈接)

通訊類別

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

  • 消息傳遞,其中數據在有關各方之間傳輸;<message>
  • 聯機狀態,它容許用戶廣播其在線狀態和可用性;<presence>
  • 信息/查詢請求,它容許 XMPP 實體發起請求並從另外一個實體接收響應。<iq>
 <stream>
     <presence>
        <show/>
     </presence>
     <message>
        <body/>
     </message>
     <iq>
        <query/>
     </iq>
 </stream>

綁定到TCP

  雖然有不少非必需的鏈接使用XML流來綁定[TCP]鏈接(兩個實體能夠經過別的機制來互聯,好比經過[HTTP]鏈接輪詢),在客戶和服務器通訊的過程當中,服務器必須容許客戶端共享一個TCP鏈接來傳輸XML節,包括從客戶端傳到服務器和從服務器傳到客戶端。在服務器之間的通訊過程當中,服務器必須用一個 TCP鏈接 向對方發送 XML節,另外一個 TCP鏈接(由對方初始化)接收對方的XML節,一共兩個 TCP鏈接。

流的安全

  當XML流開始握手時,儘管可能存在某種共有的機制可以保證雙向安全,可是「初始化流」(好比從初始化實體發給接收實體的流)和「應答流」(好比從接收實體發給初始化實體的流)仍是必須安全的分開。在流被驗證之間,實體不該該嘗試經過流發送XML節;就算它這樣作了,對方的實體也不能接受這些XML節,而且應該返回一個 <not-authorized/> 的流錯誤信息而且終止當前TCP鏈接上雙方的XML流;注意,這僅僅是針對XML節(包含在缺省命名空間中的 <message/>, <presence/>, 和 <iq/> 元素),而不是指那些用於 TLS握手、SASL握手握手的流。

Stream屬性

  • to            : 出如今初始化實體發給接受實體的XML流中,值爲接受實體JID,若其出如今應答流中,初始化實體應忽略
  • from        : 出如今接收實體發給初始化實體的 XML 流的頭當中,值爲初始化實體JID,若其出現的初始化實體中,接受實體應忽略
  • id            : 用於接收實體發送給初始化實體 XML流的頭中,由接受實體建立的惟一ID,也作初始化實體與接受實體之間的會話ID,若其出如今初始化流中,接受實體應忽略
  • xml:lang  : 包含在初始化發給接受實體的初始化流中,用於指定在流中傳輸的可讀XML字符所使用的缺省語言,如該值沒有則應用缺省值,如該值存在,則接受實體不能修改該值
  • version    : 版本支持

流錯誤

  流的根元素能夠(MAY)包含一個 <error/> 子元素,由流的名字空間前綴做爲它的前綴

<stream:error>
     <defined-condition xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
    [optional text]
     <text xmlns='urn:ietf:params:xml:ns:xmpp-streams' xml:lang='langcode'>
        descriptive text
     </text>
</stream:error>

規則

如下規則適用於流級別的錯誤:
  • 它假定全部流級別的錯誤都是不可恢復的;因此,若是一個錯誤發生在流級別,發現這個錯誤的實體必須(MUST)發送一個流錯誤信息給另外一個實體,發送一個關閉標籤 </stream>,並終止這個流所在的TCP鏈接。
  • 若是這個錯誤發生在流剛開始設置的時候,接收實體必須(MUST)仍然發送一個開放標籤 <stream> ,並在流元素中包含一個<error/>的子元素,而後發送一個關閉標籤 </stream>,最後終止相應的TCP鏈接。在這種狀況下,若是初始化實體在 'to' 屬性中提供了一個未知的主機名,服務器應該(SHOULD)在終止以前,先在流的頭信息的 'from' 屬性中提供一個服務器認證的主機名.

流錯誤條件定義

如下流級別的錯誤條件是已定義的:
  • <bad-format/> -- 實體已經發送XML可是不能被處理;這個錯誤能夠被更多特定的XML相關的錯誤替換,好比 <bad-namespace-prefix/>, <invalid-xml/>, <restricted-xml/>, <unsupported-encoding/>, 以及 <xml-not-well-formed/>,儘管更多特定的錯誤是首選的。 
  • <bad-namespace-prefix/> -- 實體發送的名字空間前綴不被支持,或者在一個須要某種前綴的元素中沒有發送一個名字空間前綴.
  • <conflict/> -- 服務器正在關閉爲這個實體激活的流,由於一個和已經存在的流有衝突的新的流已經被初始化。
  • <connection-timeout/> -- 實體已經很長時間沒有經過這個流發生任何通訊流量(可由一個本地服務策略來配置).
  • <host-gone/> -- 初始化實體在流的頭信息中提供的'to'屬性的值所指定的主機已經再也不由這臺服務器提供
  • <host-unknown/> -- 由初始化實體在流的頭信息中提供的 'to' 屬性的值和由服務器提供的主機名不一致.
  • <improper-addressing/> -- 一個在兩臺服務器之間傳送的節缺乏 'to' 或 'from' 屬性(或者這個屬性沒有值).
  • <internal-server-error/> -- 服務器配置錯誤或者其餘未定義的內部錯誤,使得服務器沒法提供流服務.
  • <invalid-from/> -- 在'from'屬性中提供的 JID 或 主機名地址,和認證的 JID不匹配 或服務器之間沒法經過SASL(或回撥)協商出合法的域名,或客戶端和服務器之間沒法經過它進行認證和資源綁定。
  • <invalid-id/> -- 流 ID 或回撥 ID 是非法的或和之前提供的 ID 不一致.
  • <invalid-xml/> -- 實體經過流發送了一個非法的XML給執行驗證的服務器.
  • <not-authorized/> -- 實體試圖在流被驗證以前發送數據或不被許可執行一個和流協商有關的動做,接收實體在發送錯誤信息以前不容許處理厭惡的節。
  • <policy-violation/> -- 實體違反了某些本地服務策略;服務器能夠選擇在 <text/> 元素或應用程序定義的錯誤條件(元素)中詳細說明策略。
  • <remote-connection-failed/> -- 服務器沒法正確鏈接到用於驗證或受權的遠程實體。
  • <resource-constraint/> -- 服務器缺少必要的系統資源爲流服務。
  • <restricted-xml/> -- 實體試圖發送受限的XML特性,好比一個註釋,處理指示,DTD,實體參考,或保留的字符.
  • <see-other-host/> -- 服務器將不提供服務給初始化實體可是把它重定向到另外一臺主機;服務器應該在<see-other-host/>元素的XML字符數據中指明替代服務器名或IP地址(它必須(必須)是合法的域名標識)。
  • <system-shutdown/> -- 服務器正在關機而且全部激活的流正在被關閉。
  • <undefined-condition/> -- 錯誤條件不在本文已定義的錯誤條件列表之中;這個錯誤條件應該僅用於"應用程序定義條件"元素.
  • <unsupported-encoding/> -- 初始化實體以一個服務器不不支持的編碼方式編碼了一個流.
  • <unsupported-stanza-type/> -- 初始化實體發送了一個流的一級子元素可是服務器不支持.
  • <unsupported-version/> -- 由初始化實體在流的頭信息中指定的'version'屬性的值所指定的版本不被服務器支持;服務器能夠在<text/>元素中指定一個它支持的版本號.
  • <xml-not-well-formed/> -- 初始化實體發送了一個不規範的XML(參考[XML])

參考資料:

http://www.ibm.com/developerworks/cn/xml/x-xmppintro/index.html

http://www.ibm.com/developerworks/cn/xml/tutorials/x-realtimeXMPPtut/index.html

相關文章
相關標籤/搜索