因爲博客遷移至www.coderyi.com,文章請看http://www.coderyi.com/archives/434html
在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)node
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是一個典型的C/S架構,而不是像大多數即時通信軟件同樣,使用P2P客戶端到客戶端的架構,也就是說在大多數狀況下,當兩個客戶端進行通信時,他們的消息都是經過服務器傳遞的(也有例外,例如在兩個客戶端傳輸文件時).採用這種架構,主要是爲了簡化客戶端,將大多數工做放在服務器端進行,這樣,客戶端的工做就比較簡單,並且,當增長功能時,多數是在服務器端進行.XMPP服務的框架結構以下圖所示.XMPP中定義了三個角色,XMPP客戶端,XMPP服務器、網關.通訊可以在這三者的任意兩個之間雙向發生.服務器同時承擔了客戶端信息記錄、鏈接管理和信息的路由功能.網關承擔着與異構即時通訊系統的互聯互通,異構系統能夠包括SMS(短信)、MSN、ICQ等.基本的網絡形式是單客戶端經過TCP/IP鏈接到單服務器,而後在之上傳輸XML,工做原理是:dom
(1)節點鏈接到服務器;(2)服務器利用本地目錄系統中的證書對其認證;(3)節點指定目標地址,讓服務器告知目標狀態;(4)服務器查找、鏈接並進行相互認證;(5)節點之間進行交互.分佈式
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
XMPP 服務器遵循兩個主要法則:
l 監聽客戶端鏈接,並直接與客戶端應用程序通訊;
l 與其餘 XMPP 服務器通訊;
XMPP開源服務器通常被設計成模塊化,由各個不一樣的代碼包構成,這些代碼包分別處理Session管理、用戶和服務器之間的通訊、服務器之間的通訊、DNS(Domain Name System)轉換、存儲用戶的我的信息和朋友名單、保留用戶在下線時收到的信息、用戶註冊、用戶的身份和權限認證、根據用戶的要求過濾信息和系統記錄等。另外,服務器能夠經過附加服務來進行擴展,如完整的安全策略,容許服務器組件的鏈接或客戶端選擇,通向其餘消息系統的網關。
基本的XMPP 服務器必須實現如下標準協議
RFC3920 核心協議Core
RFC3921 即時消息和出席協議Instant Messaging and Presence
XEP-0030 服務發現Service Discovery
XMPP 突出的特色是能夠和其餘即時通訊系統交換信息和用戶在線情況。因爲協議不一樣,XMPP 和其餘系統交換信息必須經過協議的轉換來實現,目前幾種主流即時通訊協議都沒有公開,因此XMPP 服務器自己並無實現和其餘協議的轉換,但它的架構容許轉換的實現。實現這個特殊功能的服務端在XMPP 架構裏叫作網關(gateway)。目前,XMPP 實現了和AIM、ICQ、IRC、MSN Massager、RSS0.9 和Yahoo Massager 的協議轉換。因爲網關的存在,XMPP 架構事實上兼容全部其餘即時通訊網絡,這無疑大大提升了XMPP 的靈活性和可擴展性。
Openfire 採用Java開發,開源的實時協做(RTC)服務器基於XMPP(Jabber)協議。您可使用它輕易的構建高效率的即時通訊服務器.
Openfire安裝和使用都很是簡單,並利用Web進行管理。單臺服務器可支持上萬併發用戶。
因爲是採用開放的XMPP協議,您可使用各類支持XMPP協議的IM客戶端軟件登錄服務.
A、Openfire爲Java開源項目
B、 採用開放的XMPP協議
C、 有多種針對不通系統的版本
D、使用Socket通信
E、 單臺服務器可支持上萬併發用戶,搭建分佈式雲服務器可輕鬆提供大量併發用戶。
F、 Socket長鏈接
G、服務器穩定
H、提供接口,可本身開發插件
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。
一個實體在XMPP網絡結構中被稱爲一個接點,它有惟一的標示符jabber identifier(JID),即實體地址,用來表示一個Jabber用戶,可是也能夠表示其餘內容,例如一個聊天室.一個有效的JID包括一系列元素:(1)域名(domain identifier);(2)節點(node identifier);(3)源(resource identifier).它的格式是node@domain/resource,node@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服務器鏈接。
XMPP通訊原語有3種:message、presence和iq。
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>
presence用來代表用戶的狀態,如:online、away、dnd(請勿打擾)等。當改變本身的狀態時,就會在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>
一種請求/響應機制,從一個實體從發送請求,另一個實體接受請求,並進行響應。例如,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中文