不了解XMPP,Android攻城狮,你out了

ProgramVAE 2013-12-24

XMPP(eXtensibleMessagingandPresenceProtocol,可扩展消息处理现场协议)

XMPP是基于可扩展标记语言(XML)的协议,目的是为了解决即时通信标准而提出来的,最早是在Jabber上实现的,主要用于即时消息(IM)以及在线现场探测。它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性,并且XML很易穿过防火墙,所以用XMPP构建的应用不易受到防火墙的阻碍。利用XMPP作为通用的传输机制,不同组织内的不同应用都可以进行有效的通信。这个协议允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。

XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。XMPP目前被IETF国际标准组织完成了标准化工作。在IETF中,把IM协议划分为四种协议,即即时信息和出席协议(InstantMessagingandPresenceProtocol,IMPP)、出席和即时信息协议(PresenceandInstantMessagingProtocol,PRIM)、针对即时信息和出席扩展的会话发起协议(SessionInitiationProtocolforInstantMessagingandPresenceLeveragingExtensions,SIMPLE),以及可扩展的消息出席协议(XMPP)。最初研发IMPP也是为了创建一种标准化的协议,但是今天,IMPP已经发展成为基本协议单元,定义所有即时通信协议应该支持的核心功能集。

XMPP协议特点

1.所有XMPP信息都是以XML为基础的,信息交换的事实标准,扩展性强。

2.XMPP系统是一个分布式系统,每台服务器控制自己的资源,但是如果需要,它能与外在的系统进行通信。XMPP服务器利用开放的XML协议来进行S2S(ServertoServer)通信,就像在C2S(ClienttoServer)一样。相比之下,大多数的IM系统使用了只是支持C2S/S2C通信的协议,因此Jabber/XMPP服务器具有更大的灵活性。

3.XMPP协议是公开的,程序则开放源代码。定义了客户端和服务器端的交互要经由XML流。普通消息类型(message),如改变状态(presence),传递消息内容或查询/更新(info/quey)应用则用每个指定的命名空间(namespace)来建立。

4.状态(Presence)在整个持久连接中。通过持久连接的有效维持,XMPP协议一直有在网络中维持存在和可用信息的能力。

5.XMPP允许建立并行的TCP套接字连接对所有连接上的客户端和服务器端。一旦建立连接,则只有当状态改变,例如存在的改变,通过这个连接传输数据。既然这个连接是持久的,那么设置、认证、状态查找功能都不用每次都重复执行。这种持久的套接字的连接使得XMPP能够更有效的支持高级的具有存在能力的应用在带宽和处理资源的使用中。

6.Jabber/XMPP系统是模块化的,而且Jabber/XMPP的设计强调如何实现可伸缩性、安全性和可扩展性。

XMPP协议网络架构

XMPP是一个典型的C/S架构,而不是像大多数即时通讯软件一样,使用P2P客户端到客户端的架构,也就是说在大多数情况下,当两个客户端进行通讯时,他们的消息都是通过服务器传递的(也有例外,例如在两个客户端传输文件时).采用这种架构,主要是为了简化客户端,将大多数工作放在服务器端进行,这样,客户端的工作就比较简单,而且,当增加功能时,多数是在服务器端进行。XMPP服务的框架结构如下所示。XMPP中定义了三个角色:XMPP客户端、XMPP服务器、网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录、连接管理和信息的路由功能。网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信)、MSN、ICQ等。基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML,工作原理是:

(1)节点连接到服务器;(2)服务器利用本地目录系统中的证书对其认证;(3)节点指定目标地址,让服务器告知目标状态;(4)服务器查找、连接并进行相互认证;(5)节点之间进行交互.

XMPP的基本网络结构如下:

C1----S1---S2---C3

|

C2----+--G1===FN1===FC1

符号表示:C1,C2,C3=XMPP客户端;S1,S2=XMPP;服务端G1=在XMPP和使用外部消息网络(非XMPP)的协议之间转换的网;FN1=外部消息网络;FC1=外部消息网络的客户端。

XMPP客户端

大多数客户端是通过TCP直接连接,并且使用XMPP获得服务器提供全部-12-第2章Jabber协议原理及其应用功能和其他服务。许多资源通过认证的客户端也许同时连接到服务器,定义在XMPP地址的每个资源是不同的(比如<node@domain/home>和<node@domain/work>)建议服务器和客户端采用的端中是5222。

XMPP系统的一个设计标准是必须支持简单的客户端。事实上,XMPP系统架构对客户端只有很少的几个限制。一个XMPP客户端必须支持的功能有:

1.通过TCP套接字与XMPP服务器进行通信;

2.解析组织好的XML信息包;

3.理解消息数据类型。

XMPP将复杂性从客户端转移到服务器端。这使得客户端编写变得非常容易,更新系统功能也同样变得容易。XMPP客户端与服务端通过XML在TCP套接字的5222端口进行通信,而不需要客户端之间直接进行通信。

基本的XMPP客户端必须实现以下标准协议(XEP-0211):

RFC3920核心协议Core

RFC3921即时消息和出席协议InstantMessagingandPresence

XEP-0030服务发现ServiceDiscovery

XEP-0115实体能力EntityCapabilities

XMPP服务器

服务系统是XMPP通信的智能提取层,它主要负责:管理来自其他个体的会话连接或者XML流(streams)和来自客户端、服务器、其他个体的认证发送在XML流实体之中的适当的XML地址节点。大多数XMPP服务都允许存储一些客户端数据(比如联系人列表),在这种情况下,服务直接面向这个客户端处理XML数据,而不是其他个体。

XMPP服务器遵循两个主要法则:

l.监听客户端连接,并直接与客户端应用程序通信;

2.与其他XMPP服务器通信;

XMPP开源服务器一般被设计成模块化,由各个不同的代码包构成,这些代码包分别处理Session管理、用户和服务器之间的通信、服务器之间的通信、DNS(DomainNameSystem)转换、存储用户的个人信息和朋友名单、保留用户在下线时收到的信息、用户注册、用户的身份和权限认证、根据用户的要求过滤信息和系统记录等。另外,服务器可以通过附加服务来进行扩展,如完整的安全策略,允许服务器组件的连接或客户端选择,通向其他消息系统的网关。

基本的XMPP服务器必须实现以下标准协议:

RFC3920核心协议Core

RFC3921即时消息和出席协议InstantMessagingandPresence

XEP-0030服务发现ServiceDiscovery

XMPP网关

它的主要功能是将XMPP协议转换成外部消息(non-XMPP)系统使用的协议,也将返回的数据转换成XMPP。这些通信是基于网关和服务器,基于网关和外部消息系统之间的。

XMPP突出的特点是可以和其他即时通信系统交换信息和用户在线状况。由于协议不同,XMPP和其他系统交换信息必须通过协议的转换来实现,目前几种主流即时通信协议都没有公开,所以XMPP服务器本身并没有实现和其他协议的转换,但它的架构允许转换的实现。实现这个特殊功能的服务端在XMPP架构里叫做网关(gateway)。目前,XMPP实现了和AIM、ICQ、IRC、MSNMassager、RSS0.9和YahooMassager的协议转换。由于网关的存在,XMPP架构事实上兼容所有其他即时通信网络,这无疑大大提高了XMPP的灵活性和可扩展性。

XMPP地址格式

一个实体在XMPP网络结构中被称为一个接点,它有唯一的标示符JabberIdentifier(JID),即实体地址,作用类似于IP地址,用来表示一个Jabber用户,但是也可以表示其他内容,例如一个聊天室。一个有效的JID包括一系列元素:(1)域名(domainidentifier);(2)节点(nodeidentifier);(3)源(resourceidentifier)。它的格式是node@domain/resource,node@domain,类似电子邮件的地址格式。一个合法的JID包括节点名,域名资源名,其格式为:jid=[node'@']domain['/'resource]。domain用来表示接点不同的设备或位置,这个是可选的,例如a在Server1上注册了一个用户,用户名为doom,那么a的JID就是doom@serverl,在发送消息时,指明doom@serverl就可以了,resource可以不用指定,但a在登录到这个Server时,fl的JID可能是doom@serverl、exodus(如果a用Exodus软件登录),也可能是doom@serverl/psi(如果a用psi软件登录).资源只用来识别属于用户的位置或设备等,一个用户可以同时以多种资源与同一个XMPP服务器连接。

XMPP消息格式

Jabber/XMPP系统使用XML流在不同实体之间相互传输数据。在两个实体的连接期间,XML流将从一个实体传送到另一个实体。在实体间,定义了3个顶层XML元素:Message、Presence、IQ,下面针对这三种元素进行介绍。

<Message>消息元素:

用于在两个jabber用户之间发送信息。Jsm(jabber会话管理器)负责满足所有的消息,不管目标用户的状态如何。如果用户在线jsm立即提交;否则jsm就存储。

To:标识消息的接收方。

from:指发送方的名字或标示(id)

Text:此元素包含了要提交给目标用户的信息。

结构如下所示:

<messageto=‘lily@jabber.org/contact’type=’chat’>

<body>你好,在忙吗</body>

</message>

<Presence>

用来表明用户的状态,如:online、away、dnd(请勿打扰)等。当用户离线或改变自己的状态时,就会在stream的上下文中插入一个Presence元素,来表明自身的状态.结构如下所示:

<presence>

From=‘lily@jabber.com/contact’

To=‘yaoman@jabber.com/contact'

<status>Online</status>

</presence>

<presence>元素可以取下面几种值:

Probe:用于向接受消息方法发送特殊的请求

subscribe:当接受方状态改变时,自动向发送方发送presence信息。

<IQ>

一种请求/响应机制,从一个实体从发送请求,另外一个实体接受请求,并进行响应.例如,client在stream的上下文中插入一个元素,向Server请求得到自己的好友列表,Server返回一个,里面是请求的结果.

<iq>主要的属性是type。包括:

Get:获取当前域值。

Set:设置或替换get查询的值。

Result:说明成功的响应了先前的查询。

Error:查询和响应中出现的错误。

结构如下所示:

<iqfrom=‘lily@jabber.com/contact’id=’1364564666’Type=’result’>

XMPP协议采用的是客户端-服务器架构,所有从一个客户端发到另一个客户端的消息和数据都必须经过XMPP服务器转发,而且支持服务器间DNS的路由,也就是说可以构建服务器集群,使不同的服务器下的客户端也可以通信,XMPP的前身是一个开源组织制定的网络通信协议——Jabber,XMPP的核心是在网络上分片段发送XML流的协议,这个协议是XMPP的即时通讯指令的传递手段。

为了防止服务器间发送的数据被篡改或偷听,XMPP服务器通信引入了TLS机制,使用TLS机制能实现数据的加密,从而保证了在数据传输过程种数据的安全。

XMPP协议的命名空间:

jabber:iq:private--私有数据存储,用于本地用户私人设置信息,比如用户备注等。

jabber:iq:conference--一般会议,用于多个用户之间的信息共享

jabber:x:encrypted--加密的消息,用于发送加密消息

jabber:x:expire--消息终止

jabber:iq:time--客户端时间

jabber:iq:auth--简单用户认证,一般用于服务器之间或者服务器和客户端之间的认证

jabber:x:roster--内部花名册

jabber:x:signed--标记的在线状态

jabber:iq:search--用户数据库查询,用于向服务器发送查询请求

jabber:iq:register--注册请求,用于用户注册相关信息

jabber:x:iq:roster--花名册管理

jabber:x:conference--会议邀请,用于向参加会议用户发送开会通知

jabber:x:event--消息事件

vcard-temp--临时的vCard,用于设置用户的头像以及昵称等

有开源的项目BEEM。Beem是一个运行于Android手机平台的XMPP(jabber)的客户端软件,兼容标准的XMPP服务器和服务,例如Ejabberd,Openfire,Facebook,和Gmail。支持SASL,代理(Socks4,Socks5,HTTP),DNSSRV,andchattingwithaspecificresource。开源的用于Android的XMPP框架asmack,asmack是smack的android版本。

相关推荐