XMPP的前身是Jabber,它是在開源社區誕生的即時通信協議。IETF在2002年成立了XMPP的標準化小組,在2004年發佈了RFC3920, 3921, 3922和3923。從而規範了XMPP協議。如今問世的不少通信軟件都是基於XMPP的,好比Google Talk,Facebook chat,網易泡泡等等。
優點
1. 擴展性強:XMPP是基於XML的。XMPP core自己只規定了基本的邏輯和數據格式,大部分的業務邏輯都是由extension來實現的。
2. 標準化:因爲XMPP被IETF標準化成爲業界標準,大公司很願意接納並使用它,而沒必要擔憂被競爭對手所控制。
3. 開放性,成熟的開源社區:XMPP已經有了不少開源的client/server實現。使得在XMPP基礎上開發變的很容易。
缺點
1. 冗餘的傳輸數據
據統計,XMPP server間通訊70%的數據是Presence data。Presence data主要是廣播某個用戶上線或下線的信號。而其中60%的傳輸數據是冗餘的。如今正在研究新的協議來解決這一問題。
2. 傳輸二進制數據效率不高
XMPP協議自己沒法傳輸二進制數據。因此必須想其餘辦法來傳輸(會用另外篇幅介紹)。這使得XMPP傳輸二進制數據效率不高。目前最好的協議是由Google提出的Jingle協議。Jingle已經在Linux的Pidgin,Empathy中普遍使用了。Jingle在VoIP中用於傳輸多媒體數據流。
XMPP的結構
XMPP從下到上分四層,分別是TCP,TSL,SASL和XMPP層。其中TCP保證了這是一個可靠的鏈路。TSL(Transport Layer Security)主要採用STARTTLS加密算法保證傳輸數據的安全。SASL(Simple Authentication and Security Layer)用來認證客戶端的真實有效性。
XMPP網絡主要有三種元素,Client,Server和Gateway。Gateway是一種特殊的Server,用於和其餘IM網絡服務器通訊,如MSN,QQ等。Server能夠同Client,也能夠同Server通訊,通訊都是使用XMPP協議。
命名方式
XMPP的命名方式稱爲JID(Jabber ID),它很像一個郵件地址,在末尾能夠添加一個resource id來區分同臺機器的不一樣客戶端的登陸信息。
[ node 「@」] domain [「/」 resource]
XMPP core
1. XML Stream: XML的頂層節點。表明了一個完整的會話。
…
2. XML Stanzas: XML的第二層節點。共三種:, , 。
Message: P2P message.
Presence: 廣播狀態改變,如某人上線.
Iq: 查詢信息。很相似於DBus中經常使用的GetProperty/SetProperty.
其中每種Stanzas又有五種屬性:
To: 目標接收者.
From: 發送者.
Id: Session id.
Type: 根據Stanzas不一樣,type不一樣.
xml:lang: XML payload的語言.
舉例 登陸
Client
Server
查詢好友列表
<?XML:NAMESPACE PREFIX = [default] jabber:iq:roster NS = "jabber:iq:roster" />
<item jid='mercutio@example.org'
name='Mercutio'
subscription='from'>
Friends
<item jid='benvolio@example.org'
name='Benvolio'
subscription='both'>
Friends
更改狀態
away
發送消息
<message
to='romeo@example.net'
from='juliet@example.com/balcony'
type='chat'
xml:lang='en'>
Wherefore art thou, Romeo?
查詢好友
<item jid='nurse@example.com'
name='Nurse'>
Servants
XMPP擴展
XMPP數量龐大的擴展是XMPP的重要組成部分。
其中基本擴展有
[1] XEP-0004 Data Forms
[2] XEP-0030 Service Discovery
[3] XEP-0076 Malicious Stanzas
[4] XEP-0053 XMPP Registrar
[5] XEP-0090 Entity Time
[6] XEP-0092 Software Version
[7] XEP-0114 Jabber Component Protocol
[8] XEP-0115 Entity Capabilities
[9] XEP-0124 HTTP Binding
[10] XEP-0138 Stream Compression
[11] XEP-0154 User Profile
應用擴展有
[1] XEP-0045 Multi-User Chat
[2] XEP-0047 In-Band Bytestreams (IBB)
[3] XEP-0049 Private XML Storage
[4] XEP-0055 Jabber Search
[5] XEP-0060 Publish-Subscribe
[6] XEP-0077 In-Band Registration
[7] XEP-0083 Nested Roster Groups
[8] XEP-0084 User Avatar
[9] XEP-0107 User Mood
[10] XEP-0146 Remote Controlling Clients
[11] XEP-0163 Personal Eventing via Pubsub
[12] XEP-0172 User Nickname
點對點擴展有
[1] XEP-0096 File Transfer
[2] XEP-0003 Proxy Accept Socket Service
[3] XEP-0166 Jingle
[4] XEP-0167 Jingle Audio Content Description Format
[5] XEP-0176 Jingle ICE Transport
[6] XEP-0177 Jingle Raw UDP Transport
[7] XEP-0180 Jingle Video Content Description Format
[8] XEP-0181 Jingle DTMF
[9] XEP-0183 Jingle Telepathy Transport Method
Resource