兩個基本概念,使得XMPP實體之間的小的結構化信息有效載荷能快速地進行異步交換:XML流和XML節。這些術語的定義以下。 數據庫
有三種節: message, presence, 和 IQ ("Info/Query"的縮寫). 這些節類型提供三種不一樣的通信原語: 一個 "推送" 機制用於已生成的消息, 一個特定的 "發行-訂閱" 機制用於廣播網絡可用性信息, 和一個 "請求-應答" 機制用於更結構化的數據交換 (相似 HTTP . 更多解釋分別位於 8.2.1 , 8.2.2 , 和 8.2.3 . 服務器
從本質上講, 一個XML流做爲會話期間發送的XML節的信封, 而另外一個XML流做爲會話期間接收的XML節的信封. 咱們能夠用以下的簡化模型作一個展現.網絡
+--------------------+--------------------+ | INITIAL STREAM | RESPONSE STREAM | +--------------------+--------------------+ | <stream> | | |--------------------|--------------------| | | <stream> | |--------------------|--------------------| | <presence> | | | <show/> | | | </presence> | | |--------------------|--------------------| | <message to='foo'> | | | <body/> | | | </message> | | |--------------------|--------------------| | <iq to='bar' | | | type='get'> | | | <query/> | | | </iq> | | |--------------------|--------------------| | | <iq from='bar' | | | type='result'> | | | <query/> | | | </iq> | |--------------------|--------------------| | [ ... ] | | |--------------------|--------------------| | | [ ... ] | |--------------------|--------------------| | </stream> | | |--------------------|--------------------| | | </stream> | +--------------------+--------------------+
+----------+--------------------------+-------------------------+ | | 初始實體 到 接收實體 | 接收實體 到 初始實體 | +----------+--------------------------+-------------------------+ | to | 接收實體JID | 初始實體JID | | from | 初始實體JID | 接收實體JID | | id | 忽 略 | 流標識 | | xml:lang | 默認語言 | 默認語言 | | version | XMPP 1.0+ supported | XMPP 1.0+ supported | +----------+--------------------------+-------------------------+
C: <?xml version='1.0'?> <stream:stream from='juliet@im.example.com' to='im.example.com' version='1.0' xml:lang='en' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'> S: <?xml version='1.0'?> <stream:stream from='im.example.com' id='++TR84Sm6A3hnt3Q065SnAbbk3Y=' to='juliet@im.example.com' version='1.0' xml:lang='en' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'> [ ... stream negotiation ... ] C: <message from='juliet@im.example.com/balcony' to='romeo@example.net' xml:lang='en'> <body>Art thou not Romeo, and a Montague?</body> </message> S: <message from='romeo@example.net/orchard' to='juliet@im.example.com/balcony' xml:lang='en'> <body>Neither, fair saint, if either thee dislike.</body> </message> C: </stream:stream> S: </stream:stream>
<message/>節是一個"推送"機制,這裏一個實體推送信息到另外一個實體, 相似發生在email系統裏的通信同樣. 全部消息節將擁有'to'屬性用來指定該消息指望的接收者 (見8.1.1和10.3), 除非消息是被一個已鏈接的客戶端賬號的純JID發送的. 接收到一個帶有'to'地址的消息節以後, 服務器應該嘗試路由或遞送它到指望的接收者那裏(見第十章裏和XML節相關的通用路由和遞送規則). 異步
<presence/>節是一個特定的"廣播"或"發佈-訂閱"機制, 這裏多個實體接收關於他們訂閱的一個實體的信息(在這個案例中, 是網絡可用性信息). 一般, 發佈客戶端應該發送一個不帶有'to'屬性的聯機狀態節, 這種狀況下該客戶端鏈接的那個服務器將廣播那個節給全部已訂閱的實體. 然而, 發佈客戶端也能夠發送一個帶有'to'屬性的聯機狀態節, 這種狀況下該服務器將路由或遞送那個節到指望的接收者. 儘管<presence/>節大部分狀況下是由XMPP客戶端使用, 它也可能被服務器, 附加服務, 以及任何其餘類型呃XMPP實體使用. 參見第十章中和XML節相關的通用路由和遞送規則, 以及XMPP‑IM中聯機狀態應用的特定規則. 學習
信息查詢(Info/Query),或IQ, 是一個"請求-應答"機制, 相似某些狀況下的超文本傳輸協議HTTP. IQ的語義容許一個實體對另外一個實體作出一個請求, 並接收一個應答. 這個請求和應答的數據內容由schema或其餘限定IQ元素的直接子元素的XML命名空間相關的結構化定義(見8.4)來限定, 發出請求的實體使用'id'屬性來跟蹤交互過程. 因此, IQ交互沿用告終構化數據交換的常見模式,相似 get/result 或 set/result (儘管適當的時候對於某個請求會返回一個error):加密
請求實體 應答實體 ---------- ---------- | | | <iq id='1' type='get'> | | [ ... payload ... ] | | </iq> | | -------------------------> | | | | <iq id='1' type='result'> | | [ ... payload ... ] | | </iq> | | <------------------------- | | | | <iq id='2' type='set'> | | [ ... payload ... ] | | </iq> | | -------------------------> | | | | <iq id='2' type='error'> | | [ ... condition ... ] | | </iq> | | <------------------------- | | |
jabber:iq:private -- 私有數據存儲,用於本地用戶私人設置信息,好比用戶備註等。
jabber:iq:conference -- 通常會議,用於多個用戶之間的信息共享
jabber:x:encrypted -- 加密的消息,用於發送加密消息
jabber:x:expire -- 消息終止
jabber:iq:time -- 客戶端時間
jabber:iq:auth -- 簡單用戶認證,通常用於服務器之間或者服務器和客戶端之間的認證
jabber:x:roster -- 內部花名冊
jabber:x:signed -- 標記的在線狀態
jabber:iq:search -- 用戶數據庫查詢,用於向服務器發送查詢請求
jabber:iq:register -- 註冊請求,用於用戶註冊相關信息
jabber:x:iq:roster -- 花名冊管理
jabber:x:conference -- 會議邀請,用於向參加會議用戶發送開會通知
jabber:x:event -- 消息事件
vcard-temp -- 臨時的vCard,用於設置用戶的頭像以及暱稱等spa
這是從XMPP學習——二、登錄的例子 截取的協議傳輸過程圖。.net
以上內容均參考自wiki百科:xmpp中文翻譯計劃翻譯