可擴展消息的和出席信息協議(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打開標籤 <stream> (包含適當的屬性和名字空間聲明)開始的,流的結尾則是一個XML關閉L標籤 </stream> 。在流的整個生命週期,初始化它的實體能夠經過流發送大量的XML元素,用於流的握手(TLS握手或SASL握手)或XML節(此處主要指符合缺省名字空間的元素,包括<message/>,<presence/>, 或 <iq/> 元素)
「初始的流」由初始化實體(一般是一個客戶端或服務器)和接收實體(一般是一個服務器)握手,從接收實體來看,它就是那個初始實體的"會話".初始化流容許從初始化實體到接收實體的單向通訊;爲了使接收實體可以和初始實體交換信息,接收實體必須發起一個反向的握手(應答流).
一個XML節是一個實體經過 XML 流向另外一個實體發送的結構化信息中的一個離散的語義單位。任何XML節都是從一個XML流的下一級的某個打開標籤(如 <presence>)開始,到相應的關閉標籤(如 </presence>)(此處XML節僅限於<message/>, <presence/>, 和 <iq/> 元素)
1.客戶端發送一個打開標籤<Stream>給服務器,初始化流(也可在此以前發送一段文本聲明XML版本和支持的字符集)
2.服務器回覆一個XML流給客戶端(也可在此以前發送一段文本聲明)
3.客戶端完成SASL握手
4.客戶端發送關閉標籤</stream>給服務器(或服務器發送給客戶端)
5.客戶端與服務器完全終結這個鏈接(一般爲一個TCP鏈接)
使用 XMPP 的實時消息傳遞系統包含三大通訊類別:
<stream> <presence> <show/> </presence> <message> <body/> </message> <iq> <query/> </iq> </stream>
雖然有不少非必需的鏈接使用XML流來綁定[TCP]鏈接(兩個實體能夠經過別的機制來互聯,好比經過[HTTP]鏈接輪詢),在客戶和服務器通訊的過程當中,服務器必須容許客戶端共享一個TCP鏈接來傳輸XML節,包括從客戶端傳到服務器和從服務器傳到客戶端。在服務器之間的通訊過程當中,服務器必須用一個 TCP鏈接 向對方發送 XML節,另外一個 TCP鏈接(由對方初始化)接收對方的XML節,一共兩個 TCP鏈接。
當XML流開始握手時,儘管可能存在某種共有的機制可以保證雙向安全,可是「初始化流」(好比從初始化實體發給接收實體的流)和「應答流」(好比從接收實體發給初始化實體的流)仍是必須安全的分開。在流被驗證之間,實體不該該嘗試經過流發送XML節;就算它這樣作了,對方的實體也不能接受這些XML節,而且應該返回一個 <not-authorized/> 的流錯誤信息而且終止當前TCP鏈接上雙方的XML流;注意,這僅僅是針對XML節(包含在缺省命名空間中的 <message/>, <presence/>, 和 <iq/> 元素),而不是指那些用於 TLS握手、SASL握手握手的流。
流的根元素能夠(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>
http://www.ibm.com/developerworks/cn/xml/x-xmppintro/index.html
http://www.ibm.com/developerworks/cn/xml/tutorials/x-realtimeXMPPtut/index.html