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从下到上分四层,分别是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]
比如[email protected]/pidgin
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
to='example.com'
xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'
version='1.0'>
Server
from='example.com'
id='someid'
xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'
version='1.0'>
name='Mercutio'
subscription='from'>
Friends
name='Benvolio'
subscription='both'>
Friends
away
to='[email protected]'
from='[email protected]/balcony'
type='chat'
xml:lang='en'>
Wherefore art thou, Romeo?
name='Nurse'>
Servants
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
www.jabber.org