基于XMPP协议的即时通信系统服务器集群的研究
陈武,杨世达
武汉理工大学计算机学院,武汉(430071)
E-mail:chenwu0211@
摘要:本文描述了在实现基于xmpp协议的即时通信系统的服务器集群时遇到的关键性问题,从安全、性能和通用性方面考虑提出了解决方案,重点介绍了服务器间的寻址和路由机制、服务期间通信的安全机制、故障转移机制。
关键词:xmpp;集群;服务器;安全
中图分类号:TP319 文献标识码:A
1. 引言
XMPP是一个开放的、基于XML的数据模型和协议。对用户而言,在面对现有的各种即时通讯服务,没有统一标准,无法实现互联互通的局面下,XMPP 的出现实现了整个即时通信服务协议的统一。它提供了一种开放式的、基于XML的、能在分布式网络中传输即时消息和在线发现的标准,并解决了不同IM 系统间互操作的问题[1],但是对于即时消息系统服务器集群的实现并没有统一的标准,各个系统服务器集群的实现不尽相同。
2. 集群技术
2.1集群的概念
简单的说,集群就是两台或多台计算机或节点在一个群组内共同工作。与单独工作的计算机相比,集群能够提供更高的可用性和可扩充性。集群中的每个节点通常都拥有自己的资源(处理器、内存、操作系统),并对自己的用户集负责。集群中的每一个服务器都相当于一个结点,各个结点之间通过网络互联,并且在各个节点上都有集群软件用以实现节结点之间寻址和路由,同时保证各节点间通信时的安全,当某个结点出现故障时能实现故障转移和动态的负载平衡。
2.2集群的体系结构
每个用户都有自己的本地服务器,并从该服务器上接受信息, 所有从一个客户端发给另一个客户端的消息和数据都必须通过服务端。每一个服务器都独立于其他服务器,并且拥有其自身的用户列表,通过Internet这些服务器构成了一个分布式网络。服务器通过发送一个探针了解一个用户是否在线,这是实现即时通信的关键。当用户量不是很大时,一台服务器就可以承受,但当用户量超过服务器所能承受的极限时,我们需要多台服务器来分摊负荷,这就带来了新的问题:但不同服务器下的客户端通信时,服务器之间的交互方式。这就要引入服务器集群的概念。集群就是两台或多台计算机或节点共同工作,与单独的计算机相比,集群具有高效性、稳定性和安全性。集群由授权服务器、应用程序服务器和数据库服务器组成,其结构如下所示:
图 1.1 服务器集群结构图
3. 深入分析和研究
集群并不是新事物,但在软件和硬件方面直到最近它们都还没有形成标准。集群技术在未来将会获得更大的发展,现在,不断推出新的集群选件,而真正的集群标准尚在制定之中。无论怎样,对任何一个服务器集群来说以下三个问题无法回避:服务器间通信的安全机制、服务器的寻址和路由机制、服务器的故障转移机制。
3.1服务器间的寻址和路由机制
在即时消息系统中肯定会涉及到隶属于不同应用程序服务器的客户端之间的信息交互,这就要求服务器必须能将用户发出的消息转发到用户指定的服务器上,而在服务器集群中各个应用程序服务器之间是独立互不相干的,无法直接定位目标服务器,这时要实现不同服务器之间的通信,就必须借助第三方的服务器,也就是前面所讲的授权服务器[1]。在授权服务器上实现了JID和IP地址的映射,源服务器只需将目标服务器的JID发送到授权服务器,授权服务器将其解析(类似于DNS解析),然后把解析后的地址发送给源服务器,源服务器按照解析后的地址发送消息就可以实现服务器路由。
其不同服务器下的客户端发送消息的流程如下:
图1.2 不同服务器下的客户端通信的时序图
3.2服务器间通信的安全机制
该安全机制包含了两个方面:认证和数据的机密性完整性。认证就是保证网络的各个环节都能得到相应的服务,数据完整性和机密性就是保证数据在传输过程中数据不被篡改和窃听。对于认证,服务期间引入了服务器回拨机制,不同于信息保护和加密处理,它只是为了避免通信过程中出现利用服务器欺骗方式进行信息伪造的情况。回拨认证依靠DNS技术完成,利用回拨认证一个服务器可以确认与自己建立连接的服务器是否经过合法授权。其过程中一般涉及到源服务器、接收方服务器和授权服务器。其中授权服务器能够提供对源服务器的DNS验证查询,它可以是源服务器本身,也可以是源服务器网络中的一个独立服务器。一般的回拨认证过程为:
1、源服务器和接收服务器建立认证连接。首先由源服务器告诉接收服务器需要认证,然后接收服务器回应源服务器采用认证并分配认证会话ID。
2、源服务器向接收服务器发送密钥。在这个过程中接收服务器不对密钥进行验证处理,因为接收服务器没有保存任何源服务器的信息,它需要把密钥传递给授权服务器进行验证。
3、接收服务器与授权服务器建立连接。整个建立连接的过程与源服务器和接收服务器之间建立认证连接相同,授权服务器同时为处理来自接收服务器的认证过程分配一个验证会话ID。
4、接收服务器要求授权服务器验证密钥。接收服务器把源服务器提交来的密钥以及双方的会话ID传递给授权服务器。
5、授权服务器验证密钥,并返回认证结果给接收服务器。
6、接收服务器通知源服务器认证结果。
为了保证服务器间发送的数据被篡改或偷听,服务器通信引入了TLS机制,使用TLS 能实现数据加密,从而保证了在传输过程中数据的安全,该协议由两层组成: TLS 记录协议和TLS握手协议。较低的层为TLS记录协议,位于TCP上面[2]。 TLS 记录协议有以下优点:使用对称加密以对数据进行加密,对称加密所产生的密钥对每个连接都是唯一的,且此密钥基于另一个协议(如握手协议)协商。进行信息传输包括使用密钥进行信息完整性检查。安全哈希功能(SHA、MD5等)用于MAC计算。记录协议在没有MAC的情况下也能操作,但一般只能用于这种模式,即有另一个协议正在使用记录协议传输协商安全参数。TLS 记录协议用于封装各种高层协议。作为这种封装协议之一的握手协议允许服务器与客户机在应用程序协议传输和接收其第一个数据字节前彼此之间相互认证,协商加密算法和加密密钥。可以使用非对称的密码术来认证对等方的身份。加密密钥是通过双方协商确定的,对第三方来说协商加密是难以获得的。此外经过认证过的连接不能获得加密,即使是进入连接中间的攻击者也不能。
以下例子展示两个服务器之间使用STARTTLS保护数据流。
步骤 1: Server1 初始化流给 Server2:
xmlns='jabber:server' xmlns:stream='/streams' to='' version='1.0'> 步骤 2: Server2 发送一个流标签给 Server1 作为应答: