XMPP协议简单介绍
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
由于博客遷移至www.coderyi.com,文章請看http://www.coderyi.com/archives/434
1為什么選擇XMPP協(xié)議
在IETF 中,把IM協(xié)議劃分為四種協(xié)議,即即時(shí)信息和出席協(xié)議(Instant Messaging and Presence Protocol, IMPP)、出席和即時(shí)信息協(xié)議(Presence and Instant Messaging Protocol, PRIM)、針對即時(shí)信息和出席擴(kuò)展的會(huì)話發(fā)起協(xié)議(Session Initiation Protocol for Instant Messaging and Presence Leveraging Extensions, SIMPLE),以及可擴(kuò)展的消息出席協(xié)議(XMPP)
XMPP協(xié)議的前身是Jabber,我們采取XMPP協(xié)議主來實(shí)現(xiàn)IM主要是考慮XMPP協(xié)議是以XML為基礎(chǔ)的,它繼承了在XML環(huán)境中靈活的發(fā)展性。這表明XMPP是可擴(kuò)展的,所以XMPP信息不僅可以是簡單的文本,而且可以攜帶復(fù)雜的數(shù)據(jù)和各種格式的文件
1.??? XMPP 協(xié)議是公開的,由JSF開源社區(qū)組織開發(fā)的。XMPP 協(xié)議并不屬于任何的機(jī)構(gòu)和個(gè)人,而是屬于整個(gè)社區(qū),這一點(diǎn)從根本上保證了其開放性。
2.??? XMPP 協(xié)議具有良好的擴(kuò)展性。在XMPP 中,即時(shí)消息和到場信息都是基于XML 的結(jié)構(gòu)化信息,這些信息以XML 節(jié)(XML Stanza)的形式在通信實(shí)體間交換。XMPP 發(fā)揮了XML 結(jié)構(gòu)化數(shù)據(jù)的通用傳輸層的作用,它將出席和上下文敏感信息嵌入到XML 結(jié)構(gòu)化數(shù)據(jù)中,從而使數(shù)據(jù)以極高的效率傳送給最合適的資源。基于XML 建立起來的應(yīng)用具有良好的語義完整性和擴(kuò)展性。
3.??? 分布式的網(wǎng)絡(luò)架構(gòu)。XMPP 協(xié)議都是基于Client/Server 架構(gòu),但是XMPP協(xié)議本身并沒有這樣的限制。網(wǎng)絡(luò)的架構(gòu)和電子郵件十分相似,但沒有結(jié)合任何特定的網(wǎng)絡(luò)架構(gòu),適用范圍非常廣泛。
4.??? XMPP 具有很好的彈性。XMPP 除了可用在即時(shí)通信的應(yīng)用程序,還能用在網(wǎng)絡(luò)管理、內(nèi)容供稿、協(xié)同工具、檔案共享、游戲、遠(yuǎn)端系統(tǒng)監(jiān)控等。
5.??? 安全性。XMPP在Client-to-Server通信,和Server-to-Server通信中都使用TLS (Transport Layer Security)協(xié)議作為通信通道的加密方法,保證通信的安全。任何XMPP服務(wù)器可以獨(dú)立于公眾XMPP網(wǎng)絡(luò)(例如在企業(yè)內(nèi)部網(wǎng)絡(luò)中),而使用SASL及TLS等技術(shù)更加增強(qiáng)了通信的安全性。如下圖所示:
2 xmpp的基本網(wǎng)絡(luò)結(jié)構(gòu)
XMPP是一個(gè)典型的C/S架構(gòu),而不是像大多數(shù)即時(shí)通訊軟件一樣,使用P2P客戶端到客戶端的架構(gòu),也就是說在大多數(shù)情況下,當(dāng)兩個(gè)客戶端進(jìn)行通訊時(shí),他們的消息都是通過服務(wù)器傳遞的(也有例外,例如在兩個(gè)客戶端傳輸文件時(shí)).采用這種架構(gòu),主要是為了簡化客戶端,將大多數(shù)工作放在服務(wù)器端進(jìn)行,這樣,客戶端的工作就比較簡單,而且,當(dāng)增加功能時(shí),多數(shù)是在服務(wù)器端進(jìn)行.XMPP服務(wù)的框架結(jié)構(gòu)如下圖所示.XMPP中定義了三個(gè)角色,XMPP客戶端,XMPP服務(wù)器、網(wǎng)關(guān).通信能夠在這三者的任意兩個(gè)之間雙向發(fā)生.服務(wù)器同時(shí)承擔(dān)了客戶端信息記錄、連接管理和信息的路由功能.網(wǎng)關(guān)承擔(dān)著與異構(gòu)即時(shí)通信系統(tǒng)的互聯(lián)互通,異構(gòu)系統(tǒng)可以包括SMS(短信)、MSN、ICQ等.基本的網(wǎng)絡(luò)形式是單客戶端通過TCP/IP連接到單服務(wù)器,然后在之上傳輸XML,工作原理是:
(1)節(jié)點(diǎn)連接到服務(wù)器;(2)服務(wù)器利用本地目錄系統(tǒng)中的證書對其認(rèn)證;(3)節(jié)點(diǎn)指定目標(biāo)地址,讓服務(wù)器告知目標(biāo)狀態(tài);(4)服務(wù)器查找、連接并進(jìn)行相互認(rèn)證;(5)節(jié)點(diǎn)之間進(jìn)行交互.
2.1 XMPP客戶端
XMPP 系統(tǒng)的一個(gè)設(shè)計(jì)標(biāo)準(zhǔn)是必須支持簡單的客戶端。事實(shí)上,XMPP 系統(tǒng)架構(gòu)對客戶端只有很少的幾個(gè)限制。一個(gè)XMPP 客戶端必須支持的功能有:
1. 通過 TCP 套接字與XMPP 服務(wù)器進(jìn)行通信;
2. 解析組織好的 XML 信息包;
3. 理解消息數(shù)據(jù)類型。
XMPP 將復(fù)雜性從客戶端轉(zhuǎn)移到服務(wù)器端。這使得客戶端編寫變得非常容易,更新系統(tǒng)功能也同樣變得容易。XMPP 客戶端與服務(wù)端通過XML 在TCP 套接字的5222 端口進(jìn)行通信,而不需要客戶端之間直接進(jìn)行通信。
基本的XMPP 客戶端必須實(shí)現(xiàn)以下標(biāo)準(zhǔn)協(xié)議(XEP-0211):
RFC3920 核心協(xié)議Core
RFC3921 即時(shí)消息和出席協(xié)議Instant Messaging and Presence
XEP-0030 服務(wù)發(fā)現(xiàn)Service Discovery
XEP-0115 實(shí)體能力Entity Capabilities
?
2.2 XMPP服務(wù)器
XMPP 服務(wù)器遵循兩個(gè)主要法則:
l? 監(jiān)聽客戶端連接,并直接與客戶端應(yīng)用程序通信;
l? 與其他 XMPP 服務(wù)器通信;
XMPP開源服務(wù)器一般被設(shè)計(jì)成模塊化,由各個(gè)不同的代碼包構(gòu)成,這些代碼包分別處理Session管理、用戶和服務(wù)器之間的通信、服務(wù)器之間的通信、DNS(Domain Name System)轉(zhuǎn)換、存儲(chǔ)用戶的個(gè)人信息和朋友名單、保留用戶在下線時(shí)收到的信息、用戶注冊、用戶的身份和權(quán)限認(rèn)證、根據(jù)用戶的要求過濾信息和系統(tǒng)記錄等。另外,服務(wù)器可以通過附加服務(wù)來進(jìn)行擴(kuò)展,如完整的安全策略,允許服務(wù)器組件的連接或客戶端選擇,通向其他消息系統(tǒng)的網(wǎng)關(guān)。
基本的XMPP 服務(wù)器必須實(shí)現(xiàn)以下標(biāo)準(zhǔn)協(xié)議
RFC3920 核心協(xié)議Core
RFC3921 即時(shí)消息和出席協(xié)議Instant Messaging and Presence
XEP-0030 服務(wù)發(fā)現(xiàn)Service Discovery
?2.3 XMPP網(wǎng)關(guān)
XMPP 突出的特點(diǎn)是可以和其他即時(shí)通信系統(tǒng)交換信息和用戶在線狀況。由于協(xié)議不同,XMPP 和其他系統(tǒng)交換信息必須通過協(xié)議的轉(zhuǎn)換來實(shí)現(xiàn),目前幾種主流即時(shí)通信協(xié)議都沒有公開,所以XMPP 服務(wù)器本身并沒有實(shí)現(xiàn)和其他協(xié)議的轉(zhuǎn)換,但它的架構(gòu)允許轉(zhuǎn)換的實(shí)現(xiàn)。實(shí)現(xiàn)這個(gè)特殊功能的服務(wù)端在XMPP 架構(gòu)里叫做網(wǎng)關(guān)(gateway)。目前,XMPP 實(shí)現(xiàn)了和AIM、ICQ、IRC、MSN Massager、RSS0.9 和Yahoo Massager 的協(xié)議轉(zhuǎn)換。由于網(wǎng)關(guān)的存在,XMPP 架構(gòu)事實(shí)上兼容所有其他即時(shí)通信網(wǎng)絡(luò),這無疑大大提高了XMPP 的靈活性和可擴(kuò)展性。
3服務(wù)器端介紹
3.1 什么是Openfire
Openfire 采用Java開發(fā),開源的實(shí)時(shí)協(xié)作(RTC)服務(wù)器基于XMPP(Jabber)協(xié)議。您可以使用它輕易的構(gòu)建高效率的即時(shí)通信服務(wù)器.
Openfire安裝和使用都非常簡單,并利用Web進(jìn)行管理。單臺(tái)服務(wù)器可支持上萬并發(fā)用戶。
由于是采用開放的XMPP協(xié)議,您可以使用各種支持XMPP協(xié)議的IM客戶端軟件登陸服務(wù).
3.2 ?為什么使用Openfire
A、Openfire為Java開源項(xiàng)目
B、 采用開放的XMPP協(xié)議
C、 有多種針對不通系統(tǒng)的版本
D、使用Socket通訊
E、 單臺(tái)服務(wù)器可支持上萬并發(fā)用戶,搭建分布式云服務(wù)器可輕松提供大量并發(fā)用戶。
F、 Socket長連接
G、服務(wù)器穩(wěn)定
H、提供接口,可自己開發(fā)插件
4 XMPP協(xié)議的組成
RFC 3920 XMPP:核心。定義了XMPP 協(xié)議框架下應(yīng)用的網(wǎng)絡(luò)架構(gòu),引入了XML Stream(XML 流)與XML Stanza(XML 節(jié)),并規(guī)定XMPP 協(xié)議在通信過程中使用的XML 標(biāo)簽。使用XML 標(biāo)簽從根本上說是協(xié)議開放性與擴(kuò)展性的需要。此外,在通信的安全方面,把TLS 安全傳輸機(jī)制與SASL 認(rèn)證機(jī)制引入到內(nèi)核,與XMPP 進(jìn)行無縫的連接,為協(xié)議的安全性、可靠性奠定了基礎(chǔ)。Core 文檔還規(guī)定了錯(cuò)誤的定義及處理、XML 的使用規(guī)范、JID(Jabber Identifier,Jabber 標(biāo)識(shí)符)的定義、命名規(guī)范等等。所以這是所有基于XMPP 協(xié)議的應(yīng)用都必需支持的文檔。
RFC 3921:用戶成功登陸到服務(wù)器之后,發(fā)布更新自己的在線好友管理、發(fā)送即時(shí)聊天消息等業(yè)務(wù)。所有的這些業(yè)務(wù)都是通過三種基本的XML 節(jié)來完成的:IQ Stanza(IQ 節(jié)), Presence Stanza(Presence 節(jié)), Message Stanza(Message 節(jié))。RFC3921 還對阻塞策略進(jìn)行了定義,定義是多種阻塞方式。可以說,RFC3921 是RFC3920 的充分補(bǔ)充。兩個(gè)文檔結(jié)合起來,就形成了一個(gè)基本的即時(shí)通信協(xié)議平臺(tái),在這個(gè)平臺(tái)上可以開發(fā)出各種各樣的應(yīng)用。
XEP-0030 服務(wù)搜索。一個(gè)強(qiáng)大的用來測定XMPP 網(wǎng)絡(luò)中的其它實(shí)體所支持特性的協(xié)議。
XEP-0115 實(shí)體性能。XEP-0030 的一個(gè)通過即時(shí)出席的定制,可以實(shí)時(shí)改變交變廣告功能。
XEP-0045 多人聊天。一組定義參與和管理多用戶聊天室的協(xié)議,類似于Internet 的Relay Chat,具有很高的安全性。
XEP-0096 文件傳輸。定義了從一個(gè)XMPP 實(shí)體到另一個(gè)的文件傳輸。
XEP-0124 HTTP 綁定。將XMPP 綁定到HTTP 而不是TCP,主要用于不能夠持久的維持與服務(wù)器TCP 連接的設(shè)備。
XEP-0166 Jingle。規(guī)定了多媒體通信協(xié)商的整體架構(gòu)。
XEP-0167 Jingle Audio Content Description Format。定義了從一個(gè)XMPP 實(shí)體到另一個(gè)的語音傳輸過程。
XEP-0176 Jingle ICE(Interactive Connectivity Establishment)Transport。ICE傳輸機(jī)制,文件解決了如何讓防火墻或是NAT(Network Address Translation)保護(hù)下的實(shí)體建立連接的問題。
XEP-0177 Jingle Raw UDP Transport。純UDP 傳輸機(jī)制,文件講述了如何在沒有防火墻且在同一網(wǎng)絡(luò)下建立連接的。
XEP-0180 Jingle Video Content Description Format。定義了從一個(gè)XMPP 實(shí)體到另一個(gè)的視頻傳輸過程。
XEP-0181 Jingle DTMF(Dual Tone Multi-Frequency)。
XEP-0183 Jingle Telepathy Transport Method。
5 XMPP地址格式
一個(gè)實(shí)體在XMPP網(wǎng)絡(luò)結(jié)構(gòu)中被稱為一個(gè)接點(diǎn),它有唯一的標(biāo)示符jabber identifier(JID),即實(shí)體地址,用來表示一個(gè)Jabber用戶,但是也可以表示其他內(nèi)容,例如一個(gè)聊天室.一個(gè)有效的JID包括一系列元素:(1)域名(domain identifier);(2)節(jié)點(diǎn)(node identifier);(3)源(resource identifier).它的格式是node@domain/resource,node@domain ,類似電子郵件的地址格式.domain用來表示接點(diǎn)不同的設(shè)備或位置,這個(gè)是可選的,例如a在Server1上注冊了一個(gè)用戶,用戶名為doom,那么a的JID就是doom@serverl,在發(fā)送消息時(shí),指明doom@serverl就可以了,resource可以不用指定,但a在登錄到這個(gè)Server時(shí),fl的JID可能是doom@serverl、exodus(如果a用Exodus軟件登錄),也可能是doom@serverl/psi(如果a用psi軟件登錄).資源只用來識(shí)別屬于用戶的位置或設(shè)備等,一個(gè)用戶可以同時(shí)以多種資源與同一個(gè)XMPP服務(wù)器連接。
6 XMPP消息格式
XMPP通信原語有3種:message、presence和iq。
6.1 message
message是一種基本推送消息方法,它不要求響應(yīng)。主要用于IM、groupChat、alert和notification之類的應(yīng)用中。
主要屬性如下:
6.1.1 type屬性,它主要有5種類型:
normal:類似于email,主要特點(diǎn)是不要求響應(yīng);
chat:類似于qq里的好友即時(shí)聊天,主要特點(diǎn)是實(shí)時(shí)通訊;
groupchat:類似于聊天室里的群聊;
headline:用于發(fā)送alert和notification;
error:如果發(fā)送message出錯(cuò),發(fā)現(xiàn)錯(cuò)誤的實(shí)體會(huì)用這個(gè)類別來通知發(fā)送者出錯(cuò)了;
6.1.2 to屬性:標(biāo)識(shí)消息的接收方。
6.1.3 from屬性:指發(fā)送方的名字或標(biāo)示。為防止地址外泄,這個(gè)地址通常由發(fā)送者的server填寫,而不是發(fā)送者。
載荷(payload):例如body,subject,thread
例子:
<message?
? to="lily@jabber.org/contact"?
? type="chat" >
? ? <body> 你好,在忙嗎</body>
</message>
6.2 presence
presence用來表明用戶的狀態(tài),如:online、away、dnd(請勿打擾)等。當(dāng)改變自己的狀態(tài)時(shí),就會(huì)在stream的上下文中插入一個(gè)Presence元素,來表明自身的狀態(tài)。要想接受presence消息,必須經(jīng)過一個(gè)叫做presence subscription的授權(quán)過程。
6.2.1 屬性:
6.2.1.1 type屬性,非必須。有以下類別
subscribe:訂閱其他用戶的狀態(tài)
probe:請求獲取其他用戶的狀態(tài)
unavailable:不可用,離線(offline)狀態(tài)
6.2.1.2 to屬性:標(biāo)識(shí)消息的接收方。
6.2.1.3 from屬性:指發(fā)送方的名字或標(biāo)示。
6.2.2 載荷(payload):
6.2.2.1 show:
chat:聊天中
away:暫時(shí)離開
xa:eXtend Away,長時(shí)間離開
dnd:勿打擾
6.2.2.2 status:格式自由,可閱讀的文本。也叫做rich presence或者extended presence,常用來表示用戶當(dāng)前心情,活動(dòng),聽的歌曲,看的視頻,所在的聊天室,訪問的網(wǎng)頁,玩的游戲等等。
6.2.2.3 priority:范圍-128~127。高優(yōu)先級的resource能接受發(fā)送到bare JID的消息,低優(yōu)先級的resource不能。優(yōu)先級為負(fù)數(shù)的resource不能收到發(fā)送到bare JID的消息。
例子:
<presence from="alice@wonderland.lit/pda">
? <show>xa</show>
? <status>down the rabbit hole!</status>
</presence>
6.3 iq (Info / Query)
一種請求/響應(yīng)機(jī)制,從一個(gè)實(shí)體從發(fā)送請求,另外一個(gè)實(shí)體接受請求,并進(jìn)行響應(yīng)。例如,client在stream的上下文中插入一個(gè)元素,向Server請求得到自己的好友列表,Server返回一個(gè),里面是請求的結(jié)果。
主要的屬性是type。包括:
Get :獲取當(dāng)前域值。類似于http get方法。
Set :設(shè)置或替換get查詢的值。類似于http put方法。
Result :說明成功的響應(yīng)了先前的查詢。類似于http狀態(tài)碼200。
Error: 查詢和響應(yīng)中出現(xiàn)的錯(cuò)誤。
例子:
<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
轉(zhuǎn)載于:https://my.oschina.net/u/1378445/blog/354746
總結(jié)
以上是生活随笔為你收集整理的XMPP协议简单介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IIS_FastCGI+php5.3+w
- 下一篇: 关于编写性能高效的javascript事