目录

  1. 功能描述

  2. 架构

    1. 全局地址
    2. 在线状态
    3. 持续的流
    4. 结构化的数据
    5. 客户端和服务端的分布式网络

1. 功能描述

XMPP 用于在任意两个(或多个)实体之间,通过网络,交换相对较小的结构化数据块(被称为 XML 节)。XMPP 通常被实现为分布式的客户端-服务端架构。其中,客户端需要连接到服务端,以获得对网络的访问,被允许与其它实体(可与其它服务端关联)交换 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. 打开 XML 流
  4. 最好通过 TLS 为信道加密
  5. 使用 SASL 机制进行认证
  6. 直接为服务端或间接代表与每个服务端关联的实体(比如,已连接的客户端)交换 XML 节
  7. 关闭 XML 流
  8. 关闭 TCP 连接

2. 架构

XMPP 通过直接的、连续的 XML 流的方式,在由可全局寻址的(globally addressable)、可感知在线状态的(presence-aware)客户端和服务端组成的分布式网络间,提供异步的、端到端的结构化数据交换技术。因为该架构风格涉及给定的客户端到服务端或服务端到服务端会话的上下文中的网络可用性的常见知识和概念上无限数量的并发信息事务,为区分它与万维网上常见的 REST 架构风格,我们称其为 ACT(Availability For Concurrent Transactions)。尽管 XMPP 的架构在很多重要方面与 email 的架构相似,但为实现近实时通信,它引入许多修改。ACTive 架构风格的显著特征如下。

2.1. 全局地址

为在网络上路由和传送消息,XMPP 与 email 一样使用全局唯一地址(基于域名系统)。在网络上,所有 XMPP 实体都是可寻址的,尤其是客户端和服务端,但也包括能被客户端和服务端访问的各种附加服务。通常,服务端地址具有 <domainpart> 形式(比如,<im.example.com>),托管在服务端的账号具有 <localpart@domainpart> 形式(比如,<juliet@im.example.com>,被称为“裸 JID”),当前被授权代表账号进行交互的特定连接设备或资源具有 <localpart@domainpart/resourcepart> 形式(比如,<juliet@im.example.com/balcony>,被称为“完整 JID”)。由于历史原因,XMPP 地址通常被称为 JabberID 或 JID。因为 XMPP 地址格式的正式规范依赖于撰写本文时不断变化的国际化技术,因此该格式在 XMPP‑ADDR 而非本文档中定义。术语 “localpart”、“domainpart” 和 “resourcepart” 在 XMPP‑ADDR 中有更正式的定义。

2.2. 在线状态

XMPP 包括实体向其它实体通告其网络可用性或“在线状态”的能力。在 XMPP 中,通过专用的通信原语:<presence /> 节的方式,表示端到端的通信可用性。即便对于 XMPP 消息交换而言,网络可用性的知识不是严格必须的,但因为消息的发起者可以在发起通信前知道预期的接收者在线和可用,XMPP 可以促成实时交互。端到端的在线状态在 XMPP-IM 中定义。

2.3. 持续的流

通过在常驻的 TCP 连接上使用连续的 XML 流,通信可用性也被构建进每个点到点的"跳"中。这些“始终在线”的客户端到服务端和服务端到服务端流使每一方可以随时将数据推送到另一方,以便立即路由或传送。XML 流在 Section 4 中定义。

2.4. 结构化数据

XMPP 中的基本协议数据单元不是 XML 流(它只提供点到点通信的传输),而是 XML "节",其本质是通过流发送的 XML 片段。节的根元素中包含路由属性(比如,"from" 和 "to" 地址),节的子元素包含传送给预期接受者的载荷。XML 节在 Section 8 中定义。

2.5. 客户端和服务端的分布式网络

实际上,XMPP 由相互通信的客户端和服务端网络组成(但是,任何两个给定的已部署服务端间的通信是严格自主的,取决于本地服务策略的情况)。因此,比如,与服务 <im.example.com> 关联的用户 <juliet@im.example.com> 能够和与服务 <example.net> 关联的用户 <romeo@example.net> 交换消息、在线状态以及其它结构化数据。该模式与使用全局地址的消息协议(比如 email 网络)相似。因此,XMPP 中的端到端通信在逻辑上是点到点的,但在物理上是客户端到服务端到服务端到客户端,如下图所示。

下面的段落描述网络上客户端和服务端的职责:

客户端通过使用已注册账号的凭证进行认证(通过 SASL 协商),与服务端建立 XML 流,然后完成资源绑定,以便服务端和客户端之间可以通过协商的流传送 XML 节。然后,客户端使用 XMPP 与服务端、其它客户端以及网络上的任意其它实体进行通信,其中服务端负责将节传送到其它已连接客户端,或者将它们路由到远程服务。代表相同已注册账号的多个客户端可以并发地连接到同一个服务端,每个客户端通过 XMPP 地址的 resourcepart 进行区分(比如,<juliet@im.example.com/balcony> vs. <juliet@im.example.com/chamber>)。

服务端是一个实体,其主要职责是:

取决于应用程序,XMPP 服务端的次要职责包括: