可擴展消息的和出席信息協議(XMPP)主要采用xml流實現在任意兩個網絡終端接近實時的交換結構化信息,XMPP提供一個通用的可擴展的框架來交換XML數據,用于準實時消息和出席信息以及請求-響應服務。
XMPP沒有指定任何特定的網絡結構,但它通常是采用客戶-服務器架構進行實現,其中客戶端通過TCP方式使用XMPP訪問服務器,服務器之間也采用TCP方式進行通信。
1.同一域名服務器和客戶端組成的簡單XMPP架構
具有惟一名稱的客戶機通過相關的服務器與另外一個具有惟一名稱的客戶機進行通信,每個客戶機執行客戶機的協議表單,而服務器在表單中提供路由功能
2.包含網關的復雜XMPP架構
針對不同域(XMPP域,短信服務(SMS)域和一個 SMTP 域)之間,網關可以把 XMPP 翻譯成外部(非XMPP)消息系統,并把返回的消息翻譯成 XMPP 。作為一個可擴展的協議,XMPP 對于在不同的端點協議間提供統一連接性來說是一個理想的中樞協議。XMPP 網關允許終止一個給定的客戶端到服務器的會話,并且向目標端點協議發起一個新的會話(同時進行必要的協議轉換)。
一個XMPP實體的地址被稱為JID,一個合法的JID包含可選節點,域名,可選資源名,一個JID作為網絡通訊ID,其具有唯一性
XMPPJID *jid = [ node "@" ] domain [ "/" resource ];
一個 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
新聞熱點
疑難解答