XMPP的基礎知識

前言

目前IM即時通信有四種協議:

1.即時信息和空間協議(IMPP)

2.空間和即時信息協議(PRIM)

3.針對即時通訊和空間平衡擴充的進程開始協議SIP

4.XMPP協議:該協議的前身是Jabber,我們採取XMPP協議主來實現IM主要是考慮XMPP協議是以XML爲基礎的,它繼承了在XML環境中靈活的發展性。這表明XMPP是可擴展的,所以XMPP信息不僅可以是簡單的文本,而且可以攜帶複雜的數據和各種格式的文件,也就是說XMPP協議不僅可以用在人與人之間的交流,而且可以實現軟件與軟件或軟件與人之間的交流,目前支持XMPP協議的即時通訊工具有Gtalk、FaceBook IM、Twitter、網易POPO等等通訊工具,具有非常好的發展情景。

XMPP定義

全稱:可擴展通訊和表示協議
可擴展通訊和表示協議 (XMPP) 可用於服務類實時通訊、表示和需求響應服務中的XML數據元流式傳輸。XMPP以Jabber協議爲基礎,而Jabber是即時通訊中常用的開放式協議。XMPP is the IETF’s formalization of the base XML streaming protocols for instant messaging and presence developed within the Jabber open-source community in 1999
XMPP(可擴展消息處理現場協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線現場探測。它在促進服務器之間的準即時操作。這個協議可能最終允許因特網用戶向因特網上的其他任何人發送即時消息,即使其操作系統和瀏覽器不同。
XMPP的前身是Jabber,一個開源形式組織產生的網絡即時通信協議。XMPP目前被IETF國際標準組織完成了標準化工作。標準化的核心結果分爲兩部分;
核心的XML流傳輸協議
基於XMLFreeEIM流傳輸的即時通訊擴展應用
XMPP的核心XML流傳輸協議的定義使得XMPP能夠在一個比以往網絡通信協議更規範的平臺上。藉助於XML易於解析和閱讀的特性,使得XMPP的協議能夠非常漂亮。
XMPP的即時通訊擴展應用部分是根據IETF在這之前對即時通訊的一個抽象定義的,與其他業已得到廣泛使用的即時通訊協議,諸如AIM,QQ等有功能完整,完善等先進性。

XMPP的擴展協議Jingle使得其支持語音和視頻。

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的缺點

1、數據負載太重:隨着通常超過70%的XMPP協議的服務器的數據流量的存在和近60%的被重複轉發,XMPP協議目前擁有一個大型架空中存在的數據提供給多個收件人。新的議定書正在研究,以減輕這一問題。
2、沒有二進制數據:XMPP協議的方式被編碼爲一個單一的長的XML文件,因此無法提供修改二進制數據。因此, 文件傳輸協議一樣使用外部的HTTP。如果不可避免,XMPP協議還提供了帶編碼的文件傳輸的所有數據使用的Base64。至於其他二進制數據加密會話(encrypted conversations)或圖形圖標(graphic icons)以嵌入式使用相同的方法。

XMPP協議網絡架構

XMPP是一個典型的C/S架構,而不是像大多數即時通訊軟件一樣,使用P2P客戶端到客戶端的架構,也就是說在大多數情況下,當兩個客戶端進行通訊時,他們的消息都是通過服務器傳遞的(也有例外,例如在兩個客戶端傳輸文件時).採用這種架構,主要是爲了簡化客戶端,將大多數工作放在服務器端進行,這樣,客戶端的工作就比較簡單,而且,當增加功能時,多數是在服務器端進行。

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

這裏寫圖片描述

工作原理如下:

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

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

XMPP服務器

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

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

l 與其他 XMPP 服務器通信;

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

基本的XMPP 服務器必須實現以下標準協議

RFC3920 核心協議Core

RFC3921 即時消息和出席協議Instant Messaging and Presence

XEP-0030 服務發現Service Discovery

Openfire

服務器一般使用流行的Openfire

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

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

  由於是採用開放的XMPP協議,您可以使用各種支持XMPP協議的IM客戶端軟件登陸服務.
  
爲什麼使用Openfire

A、Openfire爲Java開源項目
B、 採用開放的XMPP協議
C、 有多種針對不通系統的版本
D、使用Socket通訊
E、 單臺服務器可支持上萬併發用戶,搭建分佈式雲服務器可輕鬆提供大量併發用戶。
F、 Socket長連接
G、服務器穩定
H、提供接口,可自己開發插件

XMPP網關

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

XMPP的XML格式

一個實體在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消息格式

XMPP中定義了 3個頂層XML元素: Message、Presence、IQ,下面針對這三種元素進行介紹。

Message
用於在兩個jabber用戶之間發送信息。Jsm(jabber會話管理器)負責滿足所有的消息,不管目標用戶的狀態如何。如果用戶在線jsm立即提交;否則jsm就存儲。
To :標識消息的接收方。
from : 指發送方的名字或標示(id)o
Text: 此元素包含了要提交給目標用戶的信息。
結構如下所示:

<message to= ‘lily@jabber.org/contacttype =’chat’>
<body> 你好,在忙嗎</body>
</message>

Presence

用來表明用戶的狀態,如:online、away、dnd(請勿打擾)等。當用戶離線或改變自己的狀態時,就會在stream的上下文中插入一個Presence元素,來表明自身的狀態.結構如下所示:

<presence>
From =‘lily @ jabber.com/contact’
To = ‘yaoman @ jabber.com/contact'
<status> Online </status>
</presence>

presence 元素可以取下面幾種值:
Probe :用於向接受消息方法發送特殊的請求
subscribe:當接受方狀態改變時,自動向發送方發送presence信息。

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

iq 主要的屬性是type。包括:
Get :獲取當前域值。
Set :設置或替換get查詢的值。
Result :說明成功的響應了先前的查詢。
Error: 查詢和響應中出現的錯誤。
結構如下所示:

<iq from =‘lily @ jabber.com/contactid=’1364564666’ Type=’result’>
</iq>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章