xmpp協議學習!!!

轉載地址:http://blog.csdn.net/imyfriend/article/details/8584360
一、定義

       XMPP 是一種很類似於http協議的一種數據傳輸協議,它的過程就如同“解包裝--〉包裝”的過程,用戶只需要明白它接受的類型,並理解它返回的類型,就可以很好的利用xmpp來進行數據通訊。

       XMPP(可擴展消息處理現場協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線現場探測。它在促進服務器之間的準即時操作。這個協議可能最終允許因特網用戶向因特網上的其他任何人發送即時消息,即使其操作系統和瀏覽器不同。
XMPP的前身是Jabber,一個開源形式組織產生的網絡即時通信協議。XMPP目前被IETF國際標準組織完成了標準化工作。標準化的核心結果分爲兩部分;

  • 核心協議
  • 擴展協議(XEP: XMPP Extension Protocol)
XMPP的核心協議的定義使得XMPP能夠在一個比以往網絡通信協議更規範的平臺上。藉助於XML易於解析和閱讀的特性,使得XMPP的協議能夠非常漂亮。
XMPP的擴展協議是根據IETF在這之前對即時通訊的一個抽象定義的,與其他業已得到廣泛使用的即時通訊協議,諸如AIM,QQ等有功能完整,完善等先進性。
XMPP的擴展協議Jingle使得其支持語音和視頻。 
XMPP的官方文檔是RFC 3920。

二、網絡結構

        XMPP中定義了三個角色,客戶端服務器網關。通信能夠在這三者的任意兩個之間雙向發生。服務器同時承擔了客戶端信息記錄,連接管理和信息的路由功能。網關承擔着與異構即時通信系統的互聯互通,異構系統可以包括SMS(短信),MSN,ICQ等。基本的網絡形式是單客戶端通過TCP/IP連接到單服務器,然後在之上傳輸XML。


注意,分屬於不同server的client之間要通信的話,中間不能再經過其他server,這2個server必須直接通信。對於XMPP來說,server不能象email server那樣,中間可以經過若干個server才能把郵件發送到目的地。

2.1 XMPP客戶端
XMPP 系統的一個設計標準是必須支持簡單的客戶端。事實上,XMPP 系統架構對客戶端只有很少的幾個限制。一個XMPP 客戶端必須支持的功能有:

  • 通過 TCP 套接字與XMPP 服務器進行通信;
  • 解析組織好的 XML 信息包;
  • 理解消息數據類型。
XMPP 將複雜性從客戶端轉移到服務器端。這使得客戶端編寫變得非常容易,更新系統功能也同樣變得容易。XMPP 客戶端與服務端通過XML 在TCP 套接字的5222 端口進行通信,而不需要客戶端之間直接進行通信。

基本的XMPP 客戶端必須實現以下標準協議(XEP-0211):
  • RFC3920 核心協議Core
  • RFC3921 即時消息和出席協議Instant Messaging and Presence
  • XEP-0030 服務發現Service Discovery
  • XEP-0115 實體能力Entity Capabilities

2.2 XMPP服務器

XMPP 服務器遵循兩個主要法則:

  • 監聽客戶端連接,並直接與客戶端應用程序通信;
  • 與其他 XMPP 服務器通信;
XMPP開源服務器一般被設計成模塊化,由各個不同的代碼包構成,這些代碼包分別處理Session管理、用戶和服務器之間的通信、服務器之間的通信、DNS(Domain Name System)轉換、存儲用戶的個人信息和朋友名單、保留用戶在下線時收到的信息、用戶註冊、用戶的身份和權限認證、根據用戶的要求過濾信息和系統記錄等。另外,服務器可以通過附加服務來進行擴展,如完整的安全策略,允許服務器組件的連接或客戶端選擇,通向其他消息系統的網關。

基本的XMPP 服務器必須實現以下標準協議
  • RFC3920 核心協議Core
  • RFC3921 即時消息和出席協議Instant Messaging and Presence
  • XEP-0030 服務發現Service Discovery

2.3 XMPP網關

XMPP 突出的特點是可以和其他即時通信系統交換信息和用戶在線狀況。由於協議不同,XMPP 和其他系統交換信息必須通過協議的轉換來實現,目前幾種主流即時通信協議都沒有公開,所以XMPP 服務器本身並沒有實現和其他協議的轉換,但它的架構允許轉換的實現。實現這個特殊功能的服務端在XMPP 架構裏叫做網關(gateway)。目前,XMPP 實現了和AIM、ICQ、IRC、MSN Massager、RSS0.9 和Yahoo Massager 的協議轉換。由於網關的存在,XMPP 架構事實上兼容所有其他即時通信網絡,這無疑大大提高了XMPP 的靈活性和可擴展性。


三、系統特點

  • 客戶機/服務器通信模式;
  • 分佈式網絡;
  • 簡單的客戶端;
  • XML的數據格式;
四、地址格式
XMPP的地址叫做JabberID(簡寫爲JID),它用來標示XMPP網絡中的各個XMPP實體。JID由三部分組成:domain,node identifier和resource。JID中domain是必不可少的部分。注意:domain和user部分是不分大小寫的,但是resource區分大小寫。

jid = [ node "@" ] domain [ "/" resource ]  

domain = fqdn / address-literal  

fqdn = (sub-domain 1*("." sub-domain))  

sub-domain = (internationalized domain label)  

address-literal = IPv4address / IPv6address  

domain:通常指網絡中的網關或者服務器。
node identifier:通常表示一個向服務器或網關請求和使用網絡服務的實體(比如一個客戶端),當然它也能夠表示其他的實體(比如在多用戶聊天系統中的一個房間)。
resource:通常表示一個特定的會話(與某個設備),連接(與某個地址),或者一個附屬於某個節點ID實體相關實體的對象(比如多用戶聊天室中的一個參加者)。

JID種類有:
例子:
[email protected]:表示服務器jabber.org上的用戶stpeter。
room@service:一個用來提供多用戶聊天服務的特定的聊天室。這裏 “room“ 是聊天室的名字, ”service“ 是多用戶聊天服務的主機名。
room@service/nick:加入了聊天室的用戶nick的地址。這裏 “room“ 是聊天室的名字, ”service“ 是多用戶聊天服務的主機名,”nick“ 是用戶在聊天室的暱稱。

爲了標示JID,XMPP也有自己的URI,例如xmpp:[email protected],默認規則是在JID前加xmpp:

五、通信原語
XMPP通信原語有3種:message、presence和iq。
5.1 message
message是一種基本推送消息方法,它不要求響應。主要用於IM、groupChat、alert和notification之類的應用中。
主要屬性如下:
5.1.1 type屬性,它主要有5種類型:
  • normal:類似於email,主要特點是不要求響應;
  • chat:類似於qq裏的好友即時聊天,主要特點是實時通訊;
  • groupchat:類似於聊天室裏的羣聊;
  • headline:用於發送alert和notification;
  • error:如果發送message出錯,發現錯誤的實體會用這個類別來通知發送者出錯了;
5.1.2 to屬性:標識消息的接收方。
5.1.3 from屬性:指發送方的名字或標示。爲防止地址外泄,這個地址通常由發送者的server填寫,而不是發送者。

載荷(payload):例如body,subject

例子:
<message 
  to="[email protected]/contact" 
  type="chat" >
    <body> 你好,在忙嗎</body>
</message>

5.2 presence
presence用來表明用戶的狀態,如:online、away、dnd(請勿打擾)等。當改變自己的狀態時,就會在stream的上下文中插入一個Presence元素,來表明自身的狀態。要想接受presence消息,必須經過一個叫做presence subscription的授權過程。
5.2.1 屬性
5.2.1.1 type屬性,非必須。有以下類別
  • subscribe:訂閱其他用戶的狀態
  • probe:請求獲取其他用戶的狀態
  • unavailable:不可用,離線(offline)狀態
5.2.1.2 to屬性:標識消息的接收方。
5.2.1.3 from屬性:指發送方的名字或標示。

5.2.2 載荷(payload):
5.2.2.1 show:
  • chat:聊天中
  • away:暫時離開
  • xa:eXtend Away,長時間離開
  • dnd:勿打擾
5.2.2.2 status:格式自由,可閱讀的文本。也叫做rich presence或者extended presence,常用來表示用戶當前心情,活動,聽的歌曲,看的視頻,所在的聊天室,訪問的網頁,玩的遊戲等等。
5.2.2.3 priority:範圍-128~127。高優先級的resource能接受發送到bare JID的消息,低優先級的resource不能。優先級爲負數的resource不能收到發送到bare JID的消息。

例子:
<presence from="[email protected]/pda">
  <show>xa</show>
  <status>down the rabbit hole!</status>
</presence>

5.3 iq (Info / Query)
一種請求/響應機制,從一個實體從發送請求,另外一個實體接受請求,並進行響應。例如,client在stream的上下文中插入一個元素,向Server請求得到自己的好友列表,Server返回一個,裏面是請求的結果。
主要的屬性是type。包括:
  • Get :獲取當前域值。類似於http get方法。
  • Set :設置或替換get查詢的值。類似於http put方法。
  • Result :說明成功的響應了先前的查詢。類似於http狀態碼200。
  • Error: 查詢和響應中出現的錯誤。
例子:
<iq from="[email protected]/pda" 
    id="rr82a1z7"
    to="[email protected]
    type="get">
  <query xmlns="jabber:iq:roster"/>
</iq>


備註:

1、單詞縮寫:

IETF: Internet Engineering Task Force.  

XSF: XMPP Standards Foundation.  

XEP: XMPP Extension Protocols.

URI: Uniform Resource Identifier

TLS: Transport Layer Security

SASL: Simple Authentication and Security Layer

BOSH: Bidirectional-streams Over Synchronous HTTP

2、參考資料

XMPP協議的原理介紹

RFC3920

XMPP: The Definitive Guide


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章