XMPP-core

来源:互联网 发布:怎么提高编程能力 编辑:程序博客网 时间:2024/06/01 22:33

译自[RFC6120]: Extensible Messaging and PresenceProtocol (XMPP): Core

通俗的讲XMPP核心只是定义了基于TCP交换XML结构化数据的方法和XML节的基本定义。至于双方交换的XML的具体格式和内容的定义是由各个XMPP扩展完成的。

概述

XMPP协议是基于XML的应用协议,用于在任何两个或多个网络实体间近实时的交换结构且可扩展的数据。该文档定义XMPP协议的和核心协议内容:建立和拆除XML流、通道加密、身份验证、错误处理、消息通信原语、网络可用性(”Presence”)和请求响应交互。

功能摘要

这里的非规范描述提供了对开发人员友好的XMPP协议的功能概要。XMPP的规范定义参阅后面章节。

XMPP的目的是,使任意两个或多个实体能够通过网络交换相对小片的结构化数据(叫做”XML节”)。XMPP是典型的分布式C/S架构,一个客户端需要连接到一个服务器才能够访问网络,进而与其它实体(能够连接到其它服务器)交换XML节。这个过程可以概括为:客户端连接到服务器,交换XML节,结束连接:

1.        确定要连接的IP地址和端口,这通常是通过解析一个合法的域名得到。

2.        打开一个TCP连接

3.        在TCP上打开XML流

4.        协商TLS用于通道加密(不是必须的,但推荐这么做)

5.        使用SASL进行身份验证

6.        绑定一个资源到流

7.        与其它实体交换任意个XML节

8.        关闭XML流

9.        关闭TCP连接

 

在XMPP中,一个服务器可以选择连接到另一个服务器以启用跨域或跨服务器通信。为此,两个服务器需要在它们之间协商一个连接然后交换XML节;具体过程如下:

1.        确定要连接的IP地址和端口,这通常是通过解析一个合法的域名得到。

2.        打开一个TCP连接

3.        在TCP上打开XML流

4.        协商TLS用于通道加密(不是必须的,但推荐这么做)

5.        使用SASL进行身份验证

6.        服务器之间直接交换,或代表连接到每个服务器的客户端间接交换任意个XML节

7.        关闭XML流

8.        关闭TCP连接

 

该文档指定了客户端怎么样连接到服务器和XML节的基本语义。然而,该文档没有定义XML节的“有效载荷”,“有效载荷”的定义被交给了各个XMPP扩展。例如,XMPP-IM基本的即时消息和出席功能扩展。

 

架构

XMPP提供了一种技术,在全局可寻址的、包括在线状态感知客户端和服务器的分布式网络中,通过直接的、永久的XML流实现异步的、端到端结构化数据交换。因为这种风格的架构涉及到,在一个给定客户端-到服务器,或服务器到服务器会话上下文中必不可少的关于网络可用性的信息和理论上无限制的并发信息交换,我们称之为“并发交易可用性”,以区别于“表述性状态转移”的架构。XMPP的架构在一些重要方面很类似于email,此外,它也做了某些改动以帮助实现近实时的通信。这一ACTive 架构的显著特性如下:

全局地址

与Emial一样,为了通过网络路由和发送消息,XMPP也使用全局唯一地址(基于域名管理系统)。所有的XMPP实体都是可寻址的。一般而言,服务器地址格式:<domainpart>(例如:<im.example.com>),服务器上的账号的格式:

<localpart@domainpart>(例如:juliet@im.example.com, 称为:”bare JID”), 一个特定的已连接设备或资源具有类似这样的一个名字:<localpart@domainpart/resourcepart> 例如:juliet@im.example.com/balcony,这称为”full JID”。由于历史原因,XMPP地址通常叫做JabberIDS 或者JIDs。相信的地址格式定义请参阅“Extensible Messaging and Presence Protocol (XMPP): AddressFormat,” RFC 612。

出席

在XMPP中,一个实体可以把它的网络可用性或“出席情况”通报给其它实体。通信可用性是通过一个专门的通信原语:<presence/>节进行端到端的通知的。尽管网络可用性信息对于交换XMPP信息不是必须具备的,但它有助于实时交互,因为信息发送者在初始化一个通信前就知道对方的在线情况。端到端的presence定义在[XMPP-IM]中。

持续流

XMPP使用长TCP连接,并在TCP连接上建立一个持续的XML流,在流没有关闭前,网络都是可用的。这种“总是在线”的客户端到服务器和服务器到服务器流使每一方都可以在任何时间即时的把消息发送到其它通信方。

结构化数据

XMPP基本协议数据单元不是XML流(简单的来说,端到端的通信是通过XML流完成的,XML流提供了双方通信的管道),而是XML节,XML节实际上是一个通过流传输的XML片段。一个节的根元素包含有路由属性(比如:“from”和”to”地址),节的子元素包含要发送给潜在接受者的有效载荷。

分布式网络

XMPP由一个包含有客户端和服务器的网络组成,它们之间可以互通(然而,两个服务器之间的通信方式是不固定的,并且通常与本地服务器策略相关)。比如一个叫juliet@im.example.com的用户,她连接到服务器im.example.com,另一个叫romeo@example.net的用户,他连接到服务器example.net。虽然他们是属于不同服务器的用户,但他们可以互相交换信息、出席情况和其它结构化的数据。这个模式在那些使用全局地址的消息协议中很常见,比如Email网络。这样,看起来是两个客户端之间通信,但实际上通信流程是客户端-服务器-服务器-客户端,如下图所示:


职责划分是这样的:

客户端通过注册账号登陆服务器进行用户验证(通过SASL协商),验证通过后建立一个XML流,然后完成一个资源绑定,这样就可以在服务器和客户端协商好的流智商传输XML节了。流建立好后,客户端就可以使用XMPP与它的服务器、其它登陆同一服务器的客户端、或者网络中的任意实体进行通信,服务器负责把XML节发送到同一服务器的其它已连接客户端,或者路由到远程服务器。代表同一注册用户的多个客户端可以同时登陆一个服务器,但每一个客户端XMPP地址的resourcepart是不同的。

服务器的主要职责是:

l  管理已连接客户端的XML流,发送XML节到其它客户端。在赋予客户端访问XMPP网络之前,要对其进行合法性验证。

l  在与其它服务器通信时遵循本地服务器策略,管理与远程服务器的XML流,路由XML节到其它服务器。

依赖实际的应用,XMPP服务器的次要责任可能包括:

l  记录客户端用到的数据(比如联系人列表);与此相关的XML节将由服务器直接代为处理,而不会路由到其它远程服务器或发送个其它已连接客户端。

代管基于XMPP的扩展服务;比如XEP-0045定义的多人会议服务和XEP—0060定义的发布-订阅服务。


原创粉丝点击