`
Utone
  • 浏览: 20491 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

解析XMPP协议分析与应用

阅读更多

http://www.dzsc.com/data/html/2011-8-31/96203.html

 

 

  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>。

  3  安全机制

  3.1 简单认证和安全层协商机制

  简单认证和安全层(Simple Authentication and Security Layer,SASL)可以为基于连接的协议加入认证机制,提供KERBEROS_V4、PLAIN和DIGEST-MD5等多种认证方法。每种认证机制包含认证机制名、认证过程初始化命令、认证控制命令、特定8位码和解释器等信息。

  在认证过程中,认证服务器完成认证、授权标识传送、简单认证和安全层协商3个方面的工作。在XMPP中,SASL处理步骤如下(C:客户端,S:SASL认证服务器):

  (1)C、S之间建立连接。(2)S向C提供认证机制列表。(3)C在认证机制列表中选择一种认证机制。(4)S向C询问授权信息。(5)C向S提交授权信息。(6)S向C返回认证成功或失败信息。

  3.2 回拨认证

  在通信过程中,2个XMPP服务器之间经常需要通信,为避免利用服务器欺骗方式进行信息伪造,XMPP 采用了回拨认证机制。回拨认证依靠DNS技术完成,利用回拨认证机制,一个服务器可以确认与自己建立连接的服务器是否经过合法授权,回拨认证过程为:(1)源服务器和接收服务器建立连接,并向接收服务器请求认证。接收服务器回应,并分配认证会话ID。(2)源服务器向接收服务器发送认证密钥。(3)接收服务器与认证服务器建立连接。认证服务器同时为该认证会话分配一个验证会话ID。(4)接收服务器把源服务器提交来的密钥和验证会话ID 发送给认证服务器,请求验证。(5)认证服务器验证密钥,并给接收服务器返回认证结果。(6)接收服务器给源服务器返回认证结果。

  3.3 加  密

  虽然SASL提供了先进的认证机制,通信双方必须经过特定的授权认证才能进行正常通信,但是登录信息一般都是密码和用户名等重要信息,它们大多采用明文方式传送,因此很容易被拦截查看到。为解决该问题,XMPP采用基于传输层安全协议的“STARTTLS”扩展来为通信双方提供机密性和数据完整性服务。TLS 协议包括两个协议组―― TLS 记录协议和 TLS 握手协议――每组具有很多不同格式的信息。TLS 记录协议是一种分层协议。每一层中的信息可能包含长度、描述和内容等字段。记录协议支持信息传输、将数据分段到可处理块、压缩数据、应用 MAC 、加密以及传输结果等。对接收到的数据进行解密、校验、解压缩、重组等,然后将它们传送到高层客户机。TLS 连接状态指的是TLS 记录协议的操作环境。它规定了压缩算法、加密算法和 MAC 算法。TLS 记录层从高层接收任意大小无空块的连续数据。密钥计算:记录协议通过算法从握手协议提供的安全参数中产生密钥、 IV 和 MAC 密钥。TLS 握手协议由三个子协议组构成,允许对等双方在记录层的安全参数上达成一致、自我认证、例示协商安全参数、互相报告出错条件。

  TLS协议框架主要有2个层次的协议:TLS握手协议和TLS记录协议。TLS握手协议用来让服务器与客户在传输应用层数据之前交换TLS协议版本信息、协商加密算法、进行(相互)身份认证并交换密钥。TLS记录协议用来将应用层提供的信息进行分组、压缩、数据完整性检查和加密。数据完整性检查通过比较传输前后使用安全散列函数(如SHA和MD5 等)计算出来的数据的MAC值是否一致来完成。数据加密采用对称密码算法(如R4和DES等)。对数据进行完整性检查和加密的密钥由TLS握手协议来协商。

  XMPP中采用的STARTTLS扩展处理流程如下(C:客户端,S:TLS服务器):

  (1)C、S之间建立XML流会话连接。

  (2)S 向C 发送STARTTLS扩展服务需求及支持的其他认证机制列表,代码实例如下:

  <stream:features>

  <starttls xmlns=′urn:ietf:params:xml:ns:xmpp-tls′>

  <required/>

  </starttls>

  <mechanisms xmlns=′urn:ietf:params:xml:ns:xmppsasl′>

  <mechanism>DIGEST-MD5</mechanism>

  <mechanism>PLAIN</mechanism>

  </mechanisms>

  </stream:features>

  (3)C发送STARTTLS命令给S。

  (4)C、S中TLS握手协议开始协商相关加密算法及密钥。

  (5)若TLS握手协议协商成功,则关闭当前XML流会话,C发起一个新的XML流会话,所有传送的信息均被TLS记录协议加密。TLS握手协议协商不成功则发出警告信息。

  (6)S向C回复新XML流会话。

  4  客户端程序设计中的关键问题

  由于网络中已存在大量的XMPP服务器,在一般的应用开发中,只要设计自定功能的客户端程序即可,并可以选用Smack库来加速开发。

  (1)创建一个XMPP连接。因为XMPP使用TCP协议,所以首先必须创建一个网络连接,XMPPConnection就是Smack库用来创建与XMPP服务器连接的类,创建一个XMPP连接的代码如下:

  XMPPConnection connection=new XMPPConnection(″jab-

  ber.org″);

  如要创建加密连接,可以使用SSLXMPPConnection类:

  XMPPConnection connection=new SSLXMPPConnection(″jabber.org″);

  (2)登录。TCP连接创建后,需要使用用户名和密码登录到XMPP服务器,登录程序可以使用XMPPConnection.login(String username,String password)方法。登录后就可以和其他人聊天。

  connection.login(″yb″,″password″);//connection为已创建的XMPP连接,下同

  connection.createChat(″yb@sdpt.com″)。sendMessage

  (″Hello!″);

  (3)操作名册。每个用户都包括:一个XMPP地址(如mailto:%E2%80%9Cyb@sdpt.com”)、名称或昵称(如″yb″),及其所属列表(如好友、同事等)。名册能够跟踪好友或某用户组是否在线及其状态信息,登录后,可以使用Roster类来取得好友或某用户组的状态,代码如下:

  Roster roster=con.getRoster( );

  for (Iterator i=roster.getEntries( );i.hasNext( ); ) {

  System.out.println(i.next( ));}

  名册信息通常是随时变化的,可能需要增加或删除。要监听名单及其在线状态的改变,可以使用RosterListener。

  (4)发送和接收消息。发送接收消息可以使用Chat和GroupChat类。下面介绍如何使用Chat发送文本消息,GroupChat的使用方法类似。

  Chat newChat=connection.createChat(″yb@sdpt.com″);//创建新Chat

  newChat.sendMessage(″Hello!″);//发送消息″Hello!″

  利用Chat.sendMessage( )方法可以方便地创建一个消息对象,它的参数就是消息内容,执行后消息会发送出去。

  Chat newChat=connection.createChat(″yb@sdpt.com″);

  newMessage.setBody(″Hi, I′m waiting for you.″);

  while (true) {

  Message message=newChat.nextMessage( );//等待对方发送消息

  newChat.sendMessage(message.getBody());//把对方

  }//发送来的消息发回去

  (5)修改状态。要修改状态可以用presence.Type.UNAV-ILABLE作为参数创建一个presence,状态将改变为不在线状态。

  Presence presence=new Presence(Presence.Type.UNAVAILABLE);

  presence.setStatus(″Gone skating″);

  5  结束语

  目前,全球有20万个即时通信平台支持XMPP,有1 000万人在使用。简单的接口、开放的协议、互联的架构、权威的标准再加上坚实的用户基础是XMPP的优势。

分享到:
评论

相关推荐

    xmpp协议分析

    ### XMPP协议分析 #### 一、XMPP协议概述 XMPP(Extensible Messaging and Presence Protocol,可扩展消息出席协议)是一种基于XML的即时通讯协议,最初由Jabber开源社区于1999年开发。2002年,IETF(Internet ...

    XMPP协议中文版

    XMPP协议的核心功能被定义在RFC3920和RFC3921中,分别涉及核心协议和即时消息与出席协议(XMPP-IM)。 通用架构章节阐述了XMPP协议所采用的客户-服务器模型,该模型允许任意两个网络终端通过TCP连接实现结构化信息...

    XMPP协议(可扩展消息出席协议):核心.doc

    ### XMPP协议(可扩展消息出席协议):核心知识点解析 #### 一、绪论 **1.1 概览** XMPP(可扩展消息和出席协议)是一种开放式的XML协议,旨在支持接近实时的消息传递、出席信息以及请求-响应服务。该协议的基本...

    基于XMPP协议的Android即时通信应用项目源码

    1. **理解XMPP协议原理**:学习XMPP的底层工作方式,包括XML流的解析和构建,以及如何处理连接、认证和消息传递。 2. **Smack库使用**:深入研究Smack的API文档,了解如何创建连接、发送和接收消息、管理用户状态等...

    XMPP协议工具openfire_3_10_3

    **XMPP协议详解** XMPP(Extensible Messaging and Presence Protocol,可扩展消息与存在协议)是一种基于XML的开放标准通信协议,主要用于实时双向通信,如即时消息(IM)、语音及视频通话、文件传输等。该协议...

    xmpp协议详解

    XMPP协议还包括网关的概念,网关允许XMPP与其他通信协议(如电子邮件、IRC、SMS等)互操作。虽然网关的功能是将XMPP数据转换为其他协议,反之亦然,但具体实现和通信细节不在XMPP核心规范中定义,而是由实现者根据...

    XMPP协议详解

    XMPP协议还规定了XML元素的处理规则,包括服务器如何解析和处理接收到的XML数据。XMPP使用XML流来封装所有的通信,这使得数据传输更有序,且易于处理。 在安全性方面,XMPP要求客户端和服务器之间的连接必须使用TLS...

    在android环境下 用XMPP协议数据传输程序

    在Android应用中,通常会要求用户输入其gmail邮箱,因为Google的Talk服务(现为Hangouts)就是基于XMPP协议的。 要创建一个XMPP应用,你需要以下关键组件: 1. **连接库**:Android中常用的XMPP库有Smack和...

    基于xmpp协议的多端即时通讯方案

    XMPP协议的优势在于它是基于XML的,具有高度的灵活性和扩展性,不仅可以用于人与人之间的交流,还可以用于软件与软件、软件与人之间的交互。因此,选择XMPP协议作为多端即时通信方案的基础,具有重要的战略意义和...

    XMPP.rar_xmpp _通讯协议中文

    XMPP(Extensible Messaging and Presence Protocol)是一种...对于想要理解和应用XMPP协议的人来说,这将是一份宝贵的资源。通过阅读这份文档,你可以深入理解XMPP的工作原理,从而在你的项目中有效利用这一强大工具。

    中文版 xmpp协议之 可扩展消息出席协议:核心 RFC3920

    以下是XMPP协议中几个核心概念和组件的详细解析: 1. XMPP架构概述: - XMPP主要采用客户-服务器架构模型,客户端通过TCP连接服务器,服务器之间也通过TCP连接实现通信。这种架构保证了网络端点间能够近实时地交换...

    net平台 基于 XMPP协议的即时消息服务端简单实现

    通过解析和处理XMPP协议中的流事件,实现了用户认证、消息传递等功能。此示例仅为一个基础实现,实际项目中可能还需要添加更多的功能,如群聊、文件传输等。此外,考虑到安全性问题,还需加强加密通信、数据存储等...

    xmpp协议+ios

    【XMPP 协议 + iOS 开发】是即时通讯领域中的一个重要组合,XMPP(Extensible Messaging and Presence Protocol)是一种基于 XML 的实时...通过理解并熟练运用XMPP协议,开发者可以构建出高效、可靠的即时通讯应用。

    xmpp协议 中文版

    ### XMPP协议中文版知识点详解 #### 一、概述与背景 **XMPP**(Extensible Messaging and Presence Protocol)是一种基于XML(可扩展标记语言)的即时消息与在线状态协议,它提供了一种开放的标准来实现实时通信,...

    openfire xmpp协议源码

    《Openfire与XMPP协议在Android即时通讯中的应用解析》 Openfire是一款开源的服务器软件,它基于XMPP(Extensible Messaging and Presence Protocol)协议,为实时通信提供了一个强大而灵活的平台。XMPP,原名为...

    基于XMPP协议文件传输的研究与实现

    通过实证分析,证明了基于XMPP协议进行XML流传输的优势,尤其是在与其他通用协议相比时的表现。未来的研究可以进一步探索如何提高系统的性能和安全性,以及如何更好地集成第三方服务和功能。 综上所述,本文提供了...

    jabber/xmpp技术研究与应用

    根据给定文件的信息,本文将深入探讨Jabber/XMPP技术的相关知识点,重点解析其技术体系、安全机制以及在即时通信系统中的应用。 ### Jabber/XMPP技术概述 Jabber/XMPP(eXtensible Messaging and Presence ...

Global site tag (gtag.js) - Google Analytics