XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程序。而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测。它在促进服务器之间的准即时操作。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。XMPP目前被IETF国际标准组织完成了标准化工作。
1 XMPP的地址和数据结构
1.1 实体地址
XMPP整体框架如图1所示。图中,XMPP框架的各类实体(如XMPP客户、服务器和网关等)的地址称为甲吧地址(Jabber Identifier,JID)。JID惟一确定进行即时消息和在线状态信息通信的独立对象或实体,并可兼容其他即时通信系统(如MSN等)相应的实体标识及其在线状态信息。其语法规则为:[节点″@″] 域名[″/″资源],其中各个域的长度不能超过1 023 字节,总长度最大为3 071字节。
XMPP中定义了三个角色,客户端,服务器,网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接管理和信息的路由功能。网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML。传输的是与即时通讯相关的指令。在以前这些命令要么用2进制的形式发送(比如QQ),要么用纯文本指令加空格加参数加换行苻的方式发送(比如MSN)。而XMPP传输的即时通讯指令的逻辑与以往相仿,只是协议的形式变成了XML格式的纯文本。这不但使得解析容易了,人也容易阅读了,方便了开发和查错。而XMPP的核心部分就是一个在网络上分片断发送XML的流协议。这个流协议是XMPP的即时通讯指令的传递基础,也是一个非常重要的可以被进一步利用的网络基础协议。所以可以说,XMPP用TCP传的是XML流。
域名指定了实体连接的XMPP服务器。每个可用XMPP服务器都拥有一个完整域名,域名可在域名系统(DNS)中查找;节点可表示某用户、一类应用或某项服务,所有节点都对应一个精确的域名;资源用来识别属于用户的特殊对象(如设备或位置),允许一个用户同时以多个资源与同一XMPP服务器连接。
1.2 XMPP的数据结构
由于XMPP是基于XML的协议,因此用户可根据自己的需要定义标记,表述几乎任何一种结构化数据,并可方便地创建定制的应用或增加功能。
1.2.1 三个顶级XML元素
XMPP定义的3个关键顶级XML元素为<message/>、<presence/>和<iq/>(info/query),每个元素都可以通过属性和名字空间包含大量数据,其属性和名字空间都是XMPP的组成部分。
<message/>元素用来包含2个XMPP实体间互相发送的消息内容;<presence/>元素表示实体可用性信息,可用性信息有“可用”和“不可用”2种;<iq/>元素用来构建2个实体间的会话,并且允许实体间来回传送XML格式的请求和响应以便取得或设置公共的用户信息,如名字等。
即时通信中名字冲突问题使用XML的命名空间特性来解决。XML命名空间定义了一种将XML中使用的元素和属性与统一资源定位符(Uniform Resource LOCator,URL)引用联系起来对元素和属性进行定义的方法。 统一资源定位符(URL)是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL地址,这种地址可以是本地磁盘,也可以是局域网上的某一台计算机,更多的是Internet上的站点。简单地说,URL就是Web地址,俗称“网址”。
1.2.2 XMPP的数据结构
从结构上看,XMPP有3种数据:XML流、流认证和XML节。XML流是实体交换XML元素的容器,以<stream>开始,以</stream>结束,是通信双方采用异步方式进行数据传输的标准方法,在整个XMPP通信过程中处于最外层;XML节是实体通过XML流传输的结构化信息单元,在XML流中以深度为1的子标记开头,并以深度为1的子标记结束,这些标记为<message/>、<presence/>和<iq/>。
XMPP为XML流扮演通用“传输层”的角色。XML流中包含传输的认证信息和现场消息,XMPP能使数据高效路由至最合适的请求源,并最大限度地简化客户机上的实现,使跨应用实时交流信息成为可能。
2 工作过程
(1)节点(如yb、pt)向本地服务器连接。
①XMPP用户通过开启一个从客户端到服务器端的XML流,来申请一个在服务器上的Socket连接。
SEND: <stream:stream
to=′sdpt.com′
xmlns=′jabber:client′
xmlns:stream=′http://etherx.jabber.org/streams′>
②服务器通过开启一个从服务器到客户端的XML流进行回复。
RECV: <stream:stream
from=′sdpt.com′
id=′180763465′
xmlns=′jabber:client′
xmlns:stream=′http://etherx.jabber.org/streams′>
(2)节点向本地服务器申请登录。
①用户询问登录服务器时需提供的信息。
SEND: <iq id=′2′ type=′get′>
<query xmlns=′jabber:iq:auth′>
<username>yb</username>
</query>
</iq>
②服务器回应用户,告知用户登录所需要的信息。
③用户提供所需的信息。
④服务器响应一个空的类型为“result”的iq元素,表明登录成功。
RECV:<iq id=′3′ type=′result′/>
⑤yb用户发送当前状态给服务器,表明其在线。
SEND: <presence>
<status>Online</status>
</presence>
(3)用户获得花名册,好友增加一个联系人(如yb获知朋友sd在线)。
(4)用户间发送消息(如yb向sd发送消息)。
用户发送一条消息:
SEND: <message to′sd@jabber.org′>
<body>Where are you?</body>
</message>
服务器会根据XMPP用户的会话信息加上一个源地址,这样接收者收到消息时,消息中已经包含了源地址。
(5)XMPP服务器根据目标JID中的域名查找、连接到目标服务器并进行认证(如sdpt.com使用DNS查找jabber.org,连接到jabber.org服务器上并进行认证)。
(6)XMPP服务器jabber.org证实sd连接到该服务器上,yb被授权与sd进行通信。
(7)数据在yb与sd间流动。
(8)用户退出,退出时只需要关闭<stream>。