XMPP(Extensible Messaging and Presence Protocol,前称Jabber)协议介绍
可扩展消息处理现场协议(eXtensible Messaging and Presence Protocol , XMPP) 是一种基于可扩展标记语言(eXtensible Markup Language, XML)的近端串流式即时通信协议。它将现场和上下文敏感信息标记嵌入到XML 结构化数据中, 使得人与人之间、应用系统之间以及人与应用系统之间能即时相互通信
XMPP是一种基于XML架构的开放式协议.XMPP的基础部分已经在2002-2004年得到了互联网工程任务组(IETF)的批准,未来XMPP协议会理所当然的同Internet协议TCP/IP、HTTP、FTP、SMTP、POP一样成为Internet标准。
Xmpp协议内容
XMPP中定义了三个角色,客户端,服务器,网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接管理和信息的 路由功能。网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。基本的网络形式是单客户端通过 TCP/IP连接到单服务器,然后在之上传输XML。
Xmpp协议优点
1、分布式
XMPP网络的架构和电子邮件十分相像;XMPP核心协议通信方式是先创建一个stream,XMPP以TCP传递XML数据流,没有中央主服务器。任何人都可以运行自己的XMPP服务器,使个人及组织能够掌控他们的实时传讯体验
2、安全
任何XMPP协议的服务器可以独立于公众XMPP网络(例如在企业内部网络中),而使用SASL(1)及TLS(2)等技术的可靠安全性,已自带于核心XMPP技术规格中。
XMPP–>SASL–>TLS–>TCP–>IP
(1)SASL:SASL全称Simple Authentication and Security Layer,是一种用来扩充C/S模式验证能力的机制。在Postfix可以利用SASL来判断用户是否有权使用转发服务,或是辨认谁在使用你的服务器。SASL提供了一个通用的方法为基于连接的协议增加验证支持,而XMPP使用了一个普通的XML名字空间来满足SASL的需要
(2)TLS:安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。
3、可扩展
XML命名空间的威力可使任何人在核心协议的基础上建造客制化的功能。
在XMPP 中,即时消息和到场信息都是基于XML 的结构化信息,这些信息以XML 节(XML Stanza)的形式在通信实体间交换。XMPP 发挥了XML 结构化数据的通用传输层的作用,它将出席和上下文敏感信息嵌入到XML 结构化数据中,从而使数据以极高的效率传送给最合适的资源。基于XML 建立起来的应用具有良好的语义完整性和扩展性。
4、弹性佳
XMPP除了可用在实时通信的应用程序,还能用在网络管理、内容供稿、协同工具、文件共享、游戏、远程系统监控等,应用范围相当广泛。
5、多样性
用XMPP协议来建造及布署实时应用程序及服务的公司及开放源代码计划分布在各种领域;用XMPP技术开发软件,资源及支持的来源是多样的,使得使你不会陷于被“绑架”的困境
6、分布式的网络架构
xmpp协议的实现,都是基于client/server的网络架构。但是xmpp协议本身并没有限定非此架构不可,其和电子邮件的架构非常相似,但是其又不仅限于此,所以其应用范围十分广泛!
XMPP协议的组成
主要的XMPP 协议范本及当今应用很广的XMPP 扩展
RFC 3920 XMPP:核心。定义了XMPP 协议框架下应用的网络架构,引入了XML Stream(XML 流)与XML Stanza(XML 节),并规定XMPP 协议在通信过程中使用的XML 标签。使用XML 标签从根本上说是协议开放性与扩展性的需要。此外,在通信的安全方面,把TLS 安全传输机制与SASL 认证机制引入到内核,与XMPP 进行无缝的连接,为协议的安全性、可靠性奠定了基础。Core 文档还规定了错误的定义及处理、XML 的使用规范、JID(Jabber Identifier,Jabber 标识符)的定义、命名规范等等。所以这是所有基于XMPP 协议的应用都必需支持的文档。
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协议缺点
没有二进制数据
XMPP协议的方式被编码为一个单一的长的XML文件,因此无法提供修改二进制数据。文件传输使用HTTP协议,采用Base64(3)
(3)Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一
优化思路
Xmpp提供电子名片协议
vCard是一种现存的、广泛使用的,用户个人信息存储的标准,有点像是电子名片。基础的功能是存储和获取用户的电子身份,该信息是用XML表示的,数据的存储取决于所有现存的XMPP服务器的实现
XMPP系统特点
客户机/服务器通信模式、分布式网络、简单的客户端、XML的数据格式。
工作原理
(1)节点(client1)连接到服务器;
(2)服务器利用本地目录系统中的证书对其认证;
(3)节点指定目标(client2)地址,让服务器告知目标状态;
(4)服务器查找、连接并进行相互认证;
(5)节点之间(client1与client2)进行交互.
对话栗子:
客户端(kuusipuu)连接到一个XMPP服务器(amessage.de:5222/TCP),发送一条消息(主题和内容均为“test 1449”)到另一个客户端(tero),然后注销。
用户发送连接请求到服务器
kuusipuu:
<?xmlversion='1.0'?>
<stream:stream xmlns:stream="http://etherx.jabber.org/streams"
xmlns="jabber:client" to="amessage.de">
server对请求应答
amessage.de:
<stream:stream xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'
from='amessage.de' id='1461777714'>
server利用本地目录系统的证书对其认证
kuusipuu:
<iq type="set" id="auth_2" to="amessage.de" >
<query xmlns="jabber:iq:auth">
<username>kuusipuu</username>
<password>mypassword</password>
<resource>Work</resource>
</query>
</iq>
server将相应的结果返回给用户端
amessage.de:
<iq from="amessage.de" id='auth_2' type='result'/>
用户发送消息请求,并注销
kuusipuu:
<message to="tero@example.com" >
<subject>test 1449</subject>
<body>test 1449</body>
</message>
<presence type="unavailable" >
<status>Logged out</status>
</presence>
</stream:stream>
server返回注销信息
amessage.de:
</stream:stream>
下篇文章主要从代码的角度介绍基于xmpp的服务器构成、客户端、XMPP网关、XMPP地址格式、XMPP消息格式等我最近学习的相关知识和总结,并简单列举相应的列子。
jessonlv——吕国栋原创文章,转载请注明出处:我的博客 :http://blog.csdn.net/jessonlv