1、XMPP介绍
XMPP (Extensible Messaging and Presence Protocol ,以前称为Jabber)可扩展消息出席协议,是一种以XML为基础的可扩展应用层实时通信协议,让任何两个或多个网络实体之间进行结构化和可扩展的信息交流,是目前主流的四种IM(IM:instant messaging,即时消息)协议之一,其他三种分别为:即时信息和空间协议(IMPP)、空间和即时信息协议(PRIM)、针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)。
XMPP协议可以分为两个部分,一个是核心协议,RFC6120规范了XML流的配置和解除,通道的加密、验证、错误处理、基础通讯,RFC6121规范了XMPP的IM功能,RFC6122规范XMPP中的地址格式。另一个是XMPP的扩展协议,比如XEP-0045 聊天室(多人聊天)
XEP-0054 电子名片,XEP-0065 SOCKS5字节流,XEP-0077 带内注册,XEP-0085 聊天状态,XEP-0096 文件传输
2、XMPP的网络结构
XMPP中定义了三个角色,客户端,服务器,网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接管理和信息的路由功能。网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML。
3、XMPP的通信原理
所有的一个Client到另一个Clinet的XMPP消息和数据都要通过XMPP服务器
1、clinet连接到server
2、server利用本地目录系统的证书对其认证
3、client制定目标地址,让server告知目标状态
4、server查找,连接并进行相互认证
5、client间进行交互
在一个客户端和一个服务器(或两个服务器)完成了流协商之后, 双方就可以发送XML节了. 对于'jabber:client'和'jabber:server'命名空间定义了三种XML节: <message/>, <presence/>, 和 <iq/>
4、XMPP协议的地址格式
一个实体在XMPP网络结构中被称作为一个节点,它有唯一的标识符jabber identifier(JID),即实体地址,用来表示一个用户,但是也可以表示其他内容,例如一个聊天室.统一的JID(jabber identifier)如下:
JID=[ node”@” ] domain [ “/” resource ] domain:服务器域名 node: 用户名 resource:资源,属于用户的位置或设备 一个用户可同时以多种资源与同一XMPP服务器连接
eg: chengwenlong@im.cvte.cn/IT
5、XMPP通过TCP传什么了?
即时通讯的聊天是指上就是二进制流或者字符流。在以前这些命令要么用2进制的形式发送(比如QQ),要么用纯文本指令加空格加参数加换行苻的方式发送(比如MSN)。而XMPP传输的即时通讯指令的逻辑与以往相仿,只是协议的形式变成了XML格式的纯文本。这不但使得解析容易了,人也容易阅读了,方便了开发和查错。而XMPP的核心部分就是一个在网络上分片断发送XML的流协议。这个流协议是XMPP的即时通讯指令的传递基础,也是一个非常重要的可以被进一步利用的网络基础协议。所以可以说,XMPP用TCP传的是XML流。
如:
客户端:
<?xml version='1.0'?>
<stream:stream to=‘example.com' xmlns=‘jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>
服务器:
<?xml version='1.0'?>
<stream:stream from=‘example.com' id=‘someid' xmlns=‘jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>
…其他通信…
客户端:
<message from='juliet@example.com’ to='romeo@example.net’ xml:lang='en'>
<body>Art thou not Romeo, and a Montague?</body>
</message>
服务器:
<message from='romeo@example.net’ to='juliet@example.com’ xml:lang='en'>
<body>Neither, fair saint, if either thee dislike.</body>
</message>
客户端:
</stream:stream>
服务器:
</stream:stream>
以文档的观点来看,客户端或服务器发送的所有XML文本连缀在一起,从<stream>到</stream>构成了一个完整的XML文档。其中的stream标签就是所谓的XML Stream。在<stream>与</stream>中间的那些<message>…</message>这样的XML元素就是所谓的XML Stanza(XML节)。XMPP核心协议通信的基本模式就是先建立一个stream,然后协商一堆安全之类的东西,中间通信过程就是客户端发送XML Stanza,一个接一个的。服务器根据客户端发送的信息以及程序的逻辑,发送XML Stanza给客户端。但是这个过程并不是一问一答的,任何时候都有可能从一个方发信给另外一方。通信的最后阶段是</stream>关闭流,关闭TCP/IP连接。
6、基本语义
消息语义
<message />节定义了消息语义,<message />节可被看作“推”机制,一个实体推信息给其它实体,与EMAIL系统中发生的通信类似。所有消息节应该拥有‘to’属性,指定有意的消息接收者;根据接收到那样的一个节,服务器应该路由或传送它到有意的接收者。
联机状态语义
<presence />节定义了出席语义,<presence />节可被看作基本广播或“出版-订阅”机制,多实体收到他们已订阅(在这种情况下,网络可利用信息)实体的信息。总的来说,出版实体应该发送一个不带‘to’属性的出席节,在这种情况下,与此实体相连的服务器应该广播给所有订阅实体。然而,一个出版实体也可能发送一个带有‘to’属性的出席节,此种情况下,服务器应该路由或传送节到有意的接收者。
IQ语义
<iq />节定义了请求语义,<iq />节可被看作一个请求-响应机制,与[HTTP]在某些方面相似。IQ语义让一个实体向其它实体请求或接收其它实体的响应成为可能。请求与响应的数据内容由IQ无素的直接子元素的命名空间声明定义,并且,交互由请求实体通过使用‘id’属性来跟踪。因此,IQ交互遵从结构化数据交换的一个通用模式,此交换例如得到/结果或设置/结果(虽然如果合适的话,对一个请求的响应可能会以错误返回)。
7、常见的五种属性
A、'to'属性指定该节期望的接收者的JID.
<message to='romeo@example.net'> <body>Art thou not Romeo, and a Montague?</body> </message>
B、'from'属性指定发送者的JID.
<message from='juliet@im.example.com/balcony' to='romeo@example.net'> <body>Art thou not Romeo, and a Montague?</body></message>
C、'id'属性是由发起方实体用来跟踪可能从其他实体(类似中间服务器或预期的接收者)收到的和它生成的节有关的任何应答或错误节. 这个'id'属性仅在当前流保持唯一性还是全局保持唯一性,取决于发起方实体本身.
对于<message/>和<presence/>节来说, 建议发起方实体包含一个'id'属性; 对于<iq/>节来说, 它是必需的.
D、type属性指定目的或消息上下文,出席或IQ节的详细信息。
iq节的type属性有:Error,Get,Result,Set;
presence节的type属性有:Available,Subscribe,Subscribed,Unsubscribe,Unsubscribed,Unavailable,Probe,Error,Invisible;
message节的type属性有:Chat,Error,GroupChat,Headline,Normal。
E、一个节应该拥有'xml:lang’属性,如果这个节包含了XML字符串数据打算展示给用户(如CHARSETS所解释的, "可读国际化"). 'xml:lang'属性的值指定任何这类可读XML字符串数据的缺省语言.