XMPP協議簡單介紹

jopen 11年前發布 | 52K 次閱讀 XMPP 電話/通訊/IM聊天

XMPP協議簡單介紹,包括服務器的簡單介紹,以及xmpp的協議組成,以及message、presence和iq三種通信原語的介紹。

1為什么選擇XMPP協議

在IETF 中,把IM協議劃分為四種協議,即即時信息和出席協議(Instant Messaging and Presence Protocol, IMPP)、出席和即時信息協議(Presence and Instant Messaging Protocol, PRIM)、針對即時信息和出席擴展的會話發起協議(Session Initiation Protocol for Instant Messaging and Presence Leveraging Extensions, SIMPLE),以及可擴展的消息出席協議(XMPP)

XMPP協議的前身是Jabber,我們采取XMPP協議主來實現IM主要是考慮XMPP協議是以XML為基礎的,它繼承了在XML環境中靈活的發展性。這表明XMPP是可擴展的,所以XMPP信息不僅可以是簡單的文本,而且可以攜帶復雜的數據和各種格式的文件

1.    XMPP 協議是公開的,由JSF開源社區組織開發的。XMPP 協議并不屬于任何的機構和個人,而是屬于整個社區,這一點從根本上保證了其開放性。

2.    XMPP 協議具有良好的擴展性。在XMPP 中,即時消息和到場信息都是基于XML 的結構化信息,這些信息以XML 節(XML Stanza)的形式在通信實體間交換。XMPP 發揮了XML 結構化數據的通用傳輸層的作用,它將出席和上下文敏感信息嵌入到XML 結構化數據中,從而使數據以極高的效率傳送給最合適的資源。基于XML 建立起來的應用具有良好的語義完整性和擴展性。

3.    分布式的網絡架構。XMPP 協議都是基于Client/Server 架構,但是XMPP協議本身并沒有這樣的限制。網絡的架構和電子郵件十分相似,但沒有結合任何特定的網絡架構,適用范圍非常廣泛。

4.    XMPP 具有很好的彈性。XMPP 除了可用在即時通信的應用程序,還能用在網絡管理、內容供稿、協同工具、檔案共享、游戲、遠端系統監控等。

5.    安全性。XMPP在Client-to-Server通信,和Server-to-Server通信中都使用TLS (Transport Layer Security)協議作為通信通道的加密方法,保證通信的安全。任何XMPP服務器可以獨立于公眾XMPP網絡(例如在企業內部網絡中),而使用 SASL及TLS等技術更加增強了通信的安全性。如下圖所示:

XMPP協議簡單介紹

 

 

2 xmpp的基本網絡結構

XMPP協議簡單介紹

XMPP是一個典型的C/S架構,而不是像大多數即時通訊軟件一樣,使用P2P客戶端到客戶端的架構,也就是說在大多數情況下,當兩個客戶端進行通 訊時,他們的消息都是通過服務器傳遞的(也有例外,例如在兩個客戶端傳輸文件時).采用這種架構,主要是為了簡化客戶端,將大多數工作放在服務器端進行, 這樣,客戶端的工作就比較簡單,而且,當增加功能時,多數是在服務器端進行.XMPP服務的框架結構如下圖所示.XMPP中定義了三個角色,XMPP客戶 端,XMPP服務器、網關.通信能夠在這三者的任意兩個之間雙向發生.服務器同時承擔了客戶端信息記錄、連接管理和信息的路由功能.網關承擔著與異構即時 通信系統的互聯互通,異構系統可以包括SMS(短信)、MSN、ICQ等.基本的網絡形式是單客戶端通過TCP/IP連接到單服務器,然后在之上傳輸 XML,工作原理是:

(1)節點連接到服務器;(2)服務器利用本地目錄系統中的證書對其認證;(3)節點指定目標地址,讓服務器告知目標狀態;(4)服務器查找、連接并進行相互認證;(5)節點之間進行交互.

 

2.1 XMPP客戶端

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

1. 通過 TCP 套接字與XMPP 服務器進行通信;

2. 解析組織好的 XML 信息包;

3. 理解消息數據類型。

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 服務器遵循兩個主要法則:

l  監聽客戶端連接,并直接與客戶端應用程序通信;

l  與其他 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 的靈活性和可擴展性。

 

3服務器端介紹

3.1 什么是Openfire

Openfire 采用Java開發,開源的實時協作(RTC)服務器基于XMPP(Jabber)協議。您可以使用它輕易的構建高效率的即時通信服務器.

Openfire安裝和使用都非常簡單,并利用Web進行管理。單臺服務器可支持上萬并發用戶。

由于是采用開放的XMPP協議,您可以使用各種支持XMPP協議的IM客戶端軟件登陸服務.

3.2  為什么使用Openfire

A、Openfire為Java開源項目

B、 采用開放的XMPP協議

C、 有多種針對不通系統的版本

D、使用Socket通訊

E、 單臺服務器可支持上萬并發用戶,搭建分布式云服務器可輕松提供大量并發用戶。

F、 Socket長連接

G、服務器穩定

H、提供接口,可自己開發插件

 

4 XMPP協議的組成

RFC 3920 XMPP:核心。定義了XMPP 協議框架下應用的網絡架構,引入了XML Stream(XML 流)與XML Stanza(XML 節),并規定XMPP 協議在通信過程中使用的XML 標簽。使用XML 標簽從根本上說是協議開放性與擴展性的需要。此外,在通信的安全方面,把TLS 安全傳輸機制與SASL 認證機制引入到內核,與XMPP 進行無縫的連接,為協議的安全性、可靠性奠定了基礎。Core 文檔還規定了錯誤的定義及處理、XML 的使用規范、JID(Jabber Identifier,Jabber 標識符)的定義、命名規范等等。所以這是所有基于XMPP 協議的應用都必需支持的文檔。

RFC 3921:用戶成功登陸到服務器之后,發布更新自己的在線好友管理、發送即時聊天消息等業務。所有的這些業務都是通過三種基本的XML 節來完成的:IQ Stanza(IQ 節), Presence Stanza(Presence 節), Message Stanza(Message 節)。RFC3921 還對阻塞策略進行了定義,定義是多種阻塞方式。可以說,RFC3921 是RFC3920 的充分補充。兩個文檔結合起來,就形成了一個基本的即時通信協議平臺,在這個平臺上可以開發出各種各樣的應用。

XEP-0030 服務搜索。一個強大的用來測定XMPP 網絡中的其它實體所支持特性的協議。

XEP-0115 實體性能。XEP-0030 的一個通過即時出席的定制,可以實時改變交變廣告功能。

XEP-0045 多人聊天。一組定義參與和管理多用戶聊天室的協議,類似于Internet 的Relay Chat,具有很高的安全性。

XEP-0096 文件傳輸。定義了從一個XMPP 實體到另一個的文件傳輸。

XEP-0124 HTTP 綁定。將XMPP 綁定到HTTP 而不是TCP,主要用于不能夠持久的維持與服務器TCP 連接的設備。

XEP-0166 Jingle。規定了多媒體通信協商的整體架構。

XEP-0167 Jingle Audio Content Description Format。定義了從一個XMPP 實體到另一個的語音傳輸過程。

XEP-0176 Jingle ICE(Interactive Connectivity Establishment)Transport。ICE傳輸機制,文件解決了如何讓防火墻或是NAT(Network Address Translation)保護下的實體建立連接的問題。

XEP-0177 Jingle Raw UDP Transport。純UDP 傳輸機制,文件講述了如何在沒有防火墻且在同一網絡下建立連接的。

XEP-0180 Jingle Video Content Description Format。定義了從一個XMPP 實體到另一個的視頻傳輸過程。

XEP-0181 Jingle DTMF(Dual Tone Multi-Frequency)。

XEP-0183 Jingle Telepathy Transport Method。

 

5 XMPP地址格式

一個實體在XMPP網絡結構中被稱為一個接點,它有唯一的標示符jabber identifier(JID),即實體地址,用來表示一個Jabber用戶,但是也可以表示其他內容,例如一個聊天室.一個有效的JID包括一系列元 素:(1)域名(domain identifier);(2)節點(node identifier);(3)源(resource identifier).它的格式是node@domain/resourcenode@domain ,類似電子郵件的地址格式.domain用來表示接點不同的設備或位置,這個是可選的,例如a在Server1上注冊了一個用戶,用戶名為doom,那么a的JID就是doom@serverl,在發送消息時,指明doom@serverl就可以了,resource可以不用指定,但a在登錄到這個Server時,fl的JID可能是doom@serverl、exodus(如果a用Exodus軟件登錄),也可能是doom@serverl/psi(如果a用psi軟件登錄).資源只用來識別屬于用戶的位置或設備等,一個用戶可以同時以多種資源與同一個XMPP服務器連接。

6 XMPP消息格式

XMPP通信原語有3種:message、presence和iq。

6.1 message

message是一種基本推送消息方法,它不要求響應。主要用于IM、groupChat、alert和notification之類的應用中。

主要屬性如下:

6.1.1 type屬性,它主要有5種類型:

  • normal:類似于email,主要特點是不要求響應;

  • chat:類似于qq里的好友即時聊天,主要特點是實時通訊;

  • groupchat:類似于聊天室里的群聊;

  • headline:用于發送alert和notification;

  • error:如果發送message出錯,發現錯誤的實體會用這個類別來通知發送者出錯了;

6.1.2 to屬性:標識消息的接收方。

6.1.3 from屬性:指發送方的名字或標示。為防止地址外泄,這個地址通常由發送者的server填寫,而不是發送者。

載荷(payload):例如body,subject,thread

例子:

<message 

  to="lily@jabber.org/contact" 

  type="chat" >

    <body> 你好,在忙嗎</body>

</message>

 

6.2 presence

presence用來表明用戶的狀態,如:onlineawaydnd(請勿打擾)等。當改變自己的狀態時,就會在stream的上下文中插入一個Presence元素,來表明自身的狀態。要想接受presence消息,必須經過一個叫做presence subscription的授權過程。

6.2.1 屬性

6.2.1.1 type屬性,非必須。有以下類別

  • subscribe:訂閱其他用戶的狀態

  • probe:請求獲取其他用戶的狀態

  • unavailable:不可用,離線(offline)狀態

6.2.1.2 to屬性:標識消息的接收方。

6.2.1.3 from屬性:指發送方的名字或標示。

6.2.2 載荷payload):

6.2.2.1 show:

  • chat:聊天中

  • away:暫時離開

  • xa:eXtend Away,長時間離開

  • dnd:勿打擾

6.2.2.2 status:格式自由,可閱讀的文本。也叫做rich presence或者extended presence,常用來表示用戶當前心情,活動,聽的歌曲,看的視頻,所在的聊天室,訪問的網頁,玩的游戲等等。

6.2.2.3 priority:范圍-128~127。高優先級的resource能接受發送到bare JID的消息,低優先級的resource不能。優先級為負數的resource不能收到發送到bare JID的消息。

例子:

<presence from="alice@wonderland.lit/pda">

  <show>xa</show>

  <status>down the rabbit hole!</status>

</presence>

6.3 iq (Info / Query)

一種請求/響應機制,從一個實體從發送請求,另外一個實體接受請求,并進行響應。例如,client在stream的上下文中插入一個元素,向Server請求得到自己的好友列表,Server返回一個,里面是請求的結果。

主要的屬性是type。包括:

  • Get :獲取當前域值。類似于http get方法。

  • Set :設置或替換get查詢的值。類似于http put方法。

  • Result :說明成功的響應了先前的查詢。類似于http狀態碼200。

  • Error: 查詢和響應中出現的錯誤。

例子:

<iq from="alice@wonderland.lit/pda" 

    id="rr82a1z7"

    to="alice@wonderland.lit" 

    type="get">

  <query xmlns="jabber:iq:roster"/>

</iq>

 

 

 

 

XMPP 3920 最靠譜的中文翻譯文檔

http://wenku.baidu.com/view/563b1ebff121dd36a32d8225.html

XMPP-RFC3921中文

http://wenku.baidu.com/view/37ac3efafab069dc502201c7.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!