XMPP(eXtensible Messaging and Presence Protocol)可扩展消息与出席协议,是一种基于可扩展标记语言XML的开放式协议。XMPP协议设计的目的是来进行准实时的消息和出席信息以及请求-响应服务,可用于即时通信的消息传递以及在线现场探测等运用。
XMPP协议的前身是出现于1999年的开源社区Jabber协议。XMPP协议是基于Jabber协议原型发展、进化和建立起来的。
XMPP协议的特点:
XMPP协议是一种基于XML流来实现任意两个网络终端准实时的交换结构化信息的通信协议。XMPP提供一个通用的可扩展的框架来交换XML数据,其主要是用来建立即时消息和出席信息应用以实现IETF RFC2778,RFC2779的需求,是一种开放式的传输XML流化元素的协议。
1)开放性:
XMPP最初的原型协议Jabber的初衷就是构建一套免费的、开源的即时通信协议。发展至今,所订立的标准协议是免费的、开源的和容易理解的。任何企业和个人都可以在所需要的任何工程中使用XMPP协议。
2)可扩展性:
XMPP协议是一种基于XML流元素的传输协议,由于所使用的XML技术本身就是一种极具扩展性的标记语言,而XMPP协议订立的特点就是结构化的传输XML元素。
3)安全性:
XMPP协议的采用了多种目前网络传输信息的安全措施保证节信息的安全。一个节信息的成功传递必须经过TLS安全传输层协议、SASL简单验证和安全层协议多层的验证,采用多种强度算法如BIGEST-MD5、KERBEROS_V4、PLAIN等多种加密算法和签名证书认证的方法保证流传输的安全特性。在安全性方面,XMPP可以说是目前的即时通信协议中安全性较高的。
4)平台无关性:
XMPP协议只是一个标准,并不包含具体的实现过程,实现的过程可以在各种平台下独立完成,例如服务器、个人计算机、手持设备、甚至运行于信息采集、感应设备之上。
基于XMPP协议即时通信系统分析:
1)系统架构
通常情况下,XMPP被公认并最终实现为一种类似于Email系统的分布式网络结构。一般情况下,一个终端客户只与它注册成功的XMPP服务端进行通信,不与外部的其他实体进行通信。两个终端客户之间的通信方式都是由各自终端分别与各自注册的服务端通信,两个服务端再分别进行互联通信,中转两个域客户端之间传输的信息;如果为同一个域的两个终端客户,服务端为同一个的情况下,终端客户传输的信息也必须发送到服务器中转,而两个终端客户不进行直接的通信。这一点与大多数现有的即时通信系统两终端客户之间直接进行物理链路通信不同,在安全性上有一定的提升,确保了通信双方都必须通过验证才可以进行通信。像Email系统一样,它属于一种客户端-服务器的架构模型。
XMPP系统主要由四部分组成:
1) XMPP服务器:XMPP服务器充当XMPP通信的一个智能抽象层,主要负责管理发出的连接或者与其他实体的会话,接收或者转发XML流元素给授权的客户端、服务器或者其他实体。
2) XMPP客户端:大部分的客户端直接与服务器相连,通过XMPP获得由服务器或任何其他相关的服务所提供的全部功能。多个不同资源的客户端可以同时登录并且并发地连接到一个服务器,每个不同资源的客户终端通过XMPP地址的资源标识符来区分。例如同一域中同一账号的两个实体:[email protected]/phone和[email protected]/home,标识了同一账号ASCE可以在同一时间与其他终端实体进行通信而互不影响。终端用户[email protected]/phone与[email protected]相互通信的过程中,并不影响同一用户的另外一个实体[email protected]/home与其他终端客户之间的通信。
3) XMPP网关:网关是一种特殊用途的服务器端服务,主要功能是把XMPP协议传输的信息翻译成外部(非XMPP系统)消息系统所能识别的信息,并把返回的消息翻译成XMPP信息。例如翻译成MSN通信消息、Email消息等。
4) XMPP网络:XMPP服务器都是由一个唯一的网络地址来标识的,服务器与服务器之间的通信是一种直接的客户端到服务器通信模式的扩展,实际上整个系统是由很多互通的服务器构成的,任意两个服务器间的通信都是可选的。
2)地址空间
XMPP网络中,只要是通过XMPP协议通信的实体都具有一个唯一性的标识,由于历史原因,在XMPP网络中一个标识地址被称为Jabber Identifier或JID。一个合法的唯一标识地址JID通常会由节点名、域名、资源名三部分组成:<node@domain/resource>。
1) 域名:是整个JID中唯一必须的元素,通常情况下一个域名代表XMPP网络中的一个服务器或者网关,其他实体通过连接它来实现XML流数据的转发和数据管理功能。它可能是一个XMPP服务器的子域名,包含了其他的额外服务(例如多用户的聊天服务、用户目录等)。域名可以是一个IP地址、IANA注册定义过的国际化域名,也可以是一个服务主机的主机名称。
2) 节点名:可选的标识符。通常情况下节点名和域名相组合,标识了一个需要向服务器或网关请求服务的终端客户实体。此外也有可能标识的是一个XMPP服务器一个服务的实体,例如一个房间的地址。
3) 资源名:可选的组成部分,放在域名后面并由符号”/”进行分割,资源名可以跟在<node@domain>后面也可以跟在<domain>后面,通常表示一个特定的会话、连接(比如设备或者所在位置),或者附属于某个节点ID相关实体的对象(比如多用户聊天室中的一个参加者)。对于服务器和其他客户端来说,资源名是不透明的,通常情况由终端客户端来维护资源名。一个实体可以并发维护多个已连接的资源,每个已连接的资源由不同的资源名来区分。
3)XMPP数据传输结构
XMPP协议是基于XML流结构化数据传输的形式进行信息传递的。在XMPP中关于XML的定义有两个:XML流和XML节。
1) XML流:一个容器,包含了两个实体之间通过网络交换的XML元素。一个XML流是由一个XML打开标签<stream>(包含适当的属性和名字空间声明)开始的,XML流的结尾则是一个XML关闭标签</stream>。在流的整个生命周期,初始化它的实体可以通过流发送大量的XML元素,用于流的控制信息和XML节信息。
2) XML节:一个实体通过XML流向另一个实体发送的结构化信息中的一个离散的语义单位。一个XML节直接存在于根元素<stream/>的下一级,通常情况下XML节是一个完整均衡的元素,拥有打开和关闭标签。XMPP协议中,除了XMPP建立连接时进行的TLS询问交互,SASL用户身份验证,其他所有的信息传递都属于XML节。
在所有的XML节元素中一般都含有以下三种最常用的属性值:
to属性:标识此XML信息节发送到的目的实体地址;
from属性:标识此XML信息节发送者的实际地址;
xmlns属性:标识此XML节具体使用的子元素或属性来自哪一个命名空间,是XML节一个重要的属性值。在XMPP标准协议中每一个XML节元素的命名空间都是标准化定义的,但是在XMPP的扩展协议中,通信双方可能支持不同的XMPP扩展协议,此时只能通过xmlns属性来确认通信双方是否能识别对方所发送的XML节所表达的意思。xmlns是每一个XML节元素都必须指明的属性值(除了以下三种类型的XMPP已经定义的主要节元素拥有默认的命名空间之外,其他元素都必须明确地标示出xmlns属性)。
在XMPP通信中大量存在的主要的三种类型的节(Stanza)分别是<presence/>节、<message/>节以及<iq/>。
<presence/>出席信息节:
用于标识一个实体或者资源终端客户的出席信息情况,该元素可以被看作一个基本的广播或“出席-订阅”机制,用于多个实体接收某个以订阅的实体的信息。通常情况下,一个实体应该不带“to”属性发送一个出席信息,这时这个实体所连接的服务器应该广播或多播这个节给所有订阅的实体。当然,如果一个发送实体带“to”属性发送一个出席信息节,这时服务器应该路由或递送这个节给预定的接收者。
例如:
<presence>
<show>chat</show>
<status>call me</status>
</presence>
这是一个基本的<presence/>节的构成,其中包含子元素<show/>节,表达特定的实体或资源的可用性状态,
值为chat,表明了该发送者当前的状态为在线激活状态,在无权限限制或者屏蔽通信的情况下,当前可以和任何人进行沟通联系。<status/>子元素内容节是<show/>节的一个详细描述,提供了供接收方可阅读的详细的可用状态信息。此示例展示的含义是发送的实体或资源此时已经激活,可以和其他用户交流。
<presence/>的使用范围:1) 用于标识一个实体或者资源终端客户的出席信息情况; 2) 订阅其他终端客户的出席信息; 3) 接收一个其他终端客户出席信息的订阅的处理(接受或拒绝); 4) 取消先前的出席信息订阅; 5) 在另一个实体端取消对自身的出席信息订阅。
<message/>消息节:
用于XMPP中信息的传递以及交换。它可以被看作一个Push机制,用于一个实体推送信息给另一个实体。该元素能准确地表达出通信双方传递的信息内容,以及传递的源和目的地址。例如:
<message to="[email protected]" from="[email protected]"
type="chat" xml:lang="cn">
<body>SEE YOU IN ANOTHER LIFR BROTHER!</body>
</message>
例子展示了一个基本的<message/>节的构成,属性值to、from、xml:lang以及type分别代表该信息节发送到的目的地、源地址、所使用的语言以及消息节的类型。其中包含了一个<body/>子元素节,其值就是此次信息的发送内容。
<message/>的使用范围:在XMPP协议的使用中,涉及到最终可供人类阅读理解的消息的传递以及交换都是使用此节完成的。
<iq/>请求-应答节:
Info/Query,是一个“请求-应答”机制,使一个实体能够向另一个实体请求信息并做出应答。请求和应答所包含的数据定义在IQ元素的一个直接的子元素的名字空间声明中,以区分请求或应答的不同内容。在XMPP中,请求用户的联系人名册等信息就是用的<iq/>节。例如:
<iq from="[email protected]/home" type="get" id="roster_1">
<query xmlns="jabber:iq:roster">
</iq>
该实例展示了一个基本的<iq/>节的构成,其中type属性值代表此节的动作,在此例为获取操作。Id属性值用于一个线索跟踪(当此次请求完成时,服务端回复的信息type属性值为“result”,表明</iq>节的类型是回复一个先前的请求;而id属性值与请求时的id值相同,为”roster_1”,则表明回复的是那一个请求),子元素<query/>节的xmlns属性表明了此<iq/>节所需要操作的内容。
<iq/>节请求和应答的信息种类很多,每一个<iq/>节的具体含义以及内容,即是通过子元素<query/>的xmlns属性值所表示的命名空间来区分的。此实例展示的含义是终端用户[email protected]/home向服务端请求该用户的联系人名册。
<iq/>的使用范围:此节是三种基本类型的节中使用用途最多样化的一个节。在获取用户的联系人名册、信息的屏蔽,以及获取用户的私有数据等方面都是使用该节来完成的。