XMPP协议详解:可扩展消息与存在协议的技术解析

本文深入解析XMPP协议的技术架构和工作原理,涵盖其XML驱动的通信机制、客户端-服务器架构、持久TCP连接等核心特性,并详细介绍其在WhatsApp、Zoom等知名应用中的实际应用场景。

什么是XMPP?——可扩展消息与存在协议

引言

在21世纪初,当聊天应用的概念正在形成时,XMPP允许开发者构建交互式聊天应用。自诞生以来,该协议已经走过了漫长的道路,现在已被纳入建议用于开发高端聊天应用(如WhatsApp)的技术栈(或框架)中。

二十多年后,在众多协议中,该协议仍未失去其光泽和重要性。为什么会这样?是什么让XMPP与时俱进?关键标志是什么?让我们更好地了解这个协议。

什么是XMPP——可扩展消息与存在协议?

这是一个通常用于开放标准通信的XML驱动协议。简而言之,它是一个聊天协议,允许无缝地来回发送基本的XML组件(如数据)。除了实现即时消息和实时"对话"外,XMPP还在联系人列表维护和状态详细信息中找到了应用。

用途

XMPP最常用于两点之间的直接消息交互、检查用户状态、与服务器共享状态详细信息。它还负责服务器状态记录保存、订阅管理、联系人列表更新以及阻止某些用户。

属性

  • 它是去中心化的
  • 支持数据/信息的异步交换
  • 传输小片段数据,而不是直接转发大块数据
  • 通过TCP工作
  • 网络配置和组件(硬件/软件)在基于XMPP的数据传输中不起作用
  • 专为客户端-服务器模型设计
  • 使用3种状态,即"离线"、“忙碌"或"在线”,来告知用户或网络的状态
  • 在两个端点之间来回传输数据

XMPP架构

在结构层面,XMPP与在应用层工作的协议非常相似。例如,它也涉及通过关联服务器进行通信的唯一命名客户端。根据两个客户端强制执行协议,XMPP监视并处理它们的路由。

上图直接说明了XMPP架构。

然而,在复杂的实现中,也可能存在多个XMPP网关。在这种情况下,协议还需要处理多域路由的互通。因此,网关充当了在信息交换周期中各种协议和域之间的转换媒介。

此外,XMPP网关还承担着在目标协议上启动和终止客户端到服务器会话的任务,同时包括所需的协议转换元素。

即使使用大量的网关和域,借助XMPP,也可以在所有的网络点之间实现持续的连接。

在理解XMPP架构时,理解一些术语至关重要。

例如,您必须了解XMPP节。这些简单来说就是用于启动通信会话的小型XML片段。它们可以有3种类型:

  • 状态节:定义网络或用户当前状态给其他人。例如,用户/网络是在线还是离线。
  • 消息节:是聊天消息交换所必需的推送工具。
  • IQ节:是XMPP用于数据请求和修改的元素。就像HTTP有GET和POST一样,XMPP有IQ节。

XMPP协议如何工作?

XMPP的整个处理依赖于客户端-服务器架构,该架构首先将消息传输到服务器,然后再传输到客户端。

为了找出哪个客户端应该接收消息,XMPP服务器利用接收者的唯一ID。唯一ID或Jabber ID非常类似于电子邮件地址,只有细微的变化。

Jabber ID的格式是:user@domain.com/resource

这里,user指向用户名,domain.com是发送者的域名详情,resource是消息接收者的设备类型。例如:JohnDoe@technology.testing/terminal

在这个例子中,JohnDoe是用户名,technology.testing是域名,terminal是John使用的设备或资源类型。resource是可选的,而前两个是必需的。

XMPP服务器使用这个Jabber ID通过TCP连接进行正确的消息路由。一旦通信会话开始,就会向服务器共享一个XML流,并借助Jabber ID完成客户端识别。

识别完成后,服务器将接收请求并启动另一个XML流传输请求。这个流将从服务器端发送回客户端。这样,每个XML流都变成双向的。

XMPP能够生成一个称为联邦的大规模消息网络。借助联邦,客户端可以同时与多个XMPP服务器通信。

XMPP特性

使XMPP从其他协议中脱颖而出的基本特性如下:

异步推送消息

使用XMPP,可以实现持续和异步的消息传递。这意味着连续发送消息,不等待接收者或发送者回复,并且不需要用户在线来接受消息。消息以XML节的形式共享,这些是独特的信息单元,具有元数据、消息正文以及发送者和接收者的唯一ID等部分。

XMPP与其他客户端-服务器系统的区别在于XMPP不支持轮询。轮询是客户端不断提示服务器以检查是否存在任何最新信息的过程。由于轮询是定期进行的,最终用户没有即时通信体验。此外,它还会导致巨大的带宽消耗。

相反,即使先前的请求未被服务器处理或接收,XMPP也会自动将最新消息推送到服务器。在服务器到客户端的通信中也会发生这种情况。这为用户构建了即时通信体验。

客户端-服务器架构

这是XMPP遵循的核心架构。在这种架构中,XMPP仅传播一小部分XML元素。这个轻便的XML元素首先到达服务器,然后到达用户。

XMPP客户端被分配了单独的名称,就像电子邮件一样。这个唯一ID用于识别客户端并将消息路由到正确的方向。这样,XMPP保证每个XMPP客户端都遵循固定且标准的路径与服务器连接。

持久TCP连接

最初,XMPP只能通过TCP传输数据或指定连接。这里建立的连接是不变的,不需要在每次传输新消息时重新建立。

这样,XMPP构建了一个支持自由XML数据交换的XML流。然而,某些尖端的XMPP扩展现在也使用TLS和WebSockets。

去中心化托管

通过去中心化托管,我们指的是没有中央机构控制服务器。任何人都可以维护、运行甚至维护XMPP服务器。此外,还授予了在云上或本地设置服务器的自由。在这方面,它也与电子邮件类似。每个电子邮件所有者都可以根据自己的选择设置电子邮件。他们可以自由地根据自己的偏好设置登录详情、密码和其他详细信息。

网关

XMPP的另一个非常显著的特性是它为众多聊天和消息传递协议提供了网关。它与许多协议兼容,并且可以广泛地链接到网络。

例如,当向移动设备上的接收者提供消息时,给定的XMPP网络可以访问SMS域,同时访问SMTP域以在接收者的电子邮件上传递相同的消息。除此之外,XMPP网络还可以同时使用任何其他特定的消息协议,以另一种形式(如IRC)传递消息。

XMPP协议示例

XMPP享有我们目前使用的许多通信应用的核心元素的声誉。一些使用XMPP开发的最著名应用如下所述。

  • WhatsApp是使用专有的XMPP构建的。
  • Zoom惊人的聊天能力全归功于XMPP。
  • 为了即时推送通知传递,Apple在iPhone和Mac中都使用XMPP。
  • XMPP用于Grindr的聊天功能。

对于开发功能强大的聊天应用,XMPP是提供的多种选择之一。然而,由于其独特的特性和带来的多重好处,它继续成为许多人的首选。

XMPP的好处

得到IETF支持并被数千名开发者采用,XMPP已成为聊天应用开发的主流开放标准协议。

凭借出色的标志,XMPP设法填补了由严格协议造成的空白,并已确认为点对点通信及其他领域的必需品。

以下是采用XMPP协议后可以享受的基本好处。

可靠的支持协议

该协议已为开发者社区服务了20多年。这些年来,该协议加强了其基础设施并获得了巨大的社区支持。目前,有多个XMPP服务器,数千名开发者已使用它,并且它是许多应用的核心。

所有这些确保了这个协议是经过时间考验的,并拥有强大的技术支持。如果这还不能打动您,那么免费且非常简单肯定会。

改善您的通信基础设施

作为一个高度可扩展的协议,它使最终用户能够在通信中使用不同类型的媒体和消息。它不会问您是在传输音频还是视频;XMPP将继续支持创建有效的通信基础设施。

交付保证

使用XMPP,可以加倍确定消息的传递,因为它使用通过TCP的持续连接。它几乎不会错过任何XML节的传递,无论它有多小。

大多数标准编程语言的支持

大规模采用和巨大的全球需求导致了对各种语言的支持。XMPP库可在许多主要语言中使用,如Perl、C++、C#、Java、Python等。您能想到的,XMPP库很可能与该语言兼容。这使开发者能够在兼容和首选的生态系统中工作。

去中心化

XMPP是去中心化的,允许多种实现。在服务器和库设置方面没有限制。每个人都可以使用它。这赋予了更多的自由并为灵活性创造了空间。

更高的安全性

增强的安全性是一个额外的优势。在设置不同的XMPP服务器时,开发者可以根据选择选择加密、安全协议和访问偏好。安全完全在控制之中,从而减少网络攻击并带来更好的安心。

不间断的数据传输

性能可以轻松维护,因为如果一个XMPP服务器受到影响或离线,无论原因如何,只有相应的用户会受到影响。其余用户将继续享受不间断的通信和数据传输。这使得实现100%的操作连续性成为可能。

服务器到服务器传输

服务器联邦是一个可选选择。因此,开发者可以出于安全原因自由关闭服务器到服务器的通信,同时为服务器分配特定任务。

兼容性

XMPP的一个主要客户端优势是丰富的客户端。XMPP客户端不缺。无论设备类型如何,您都会找到一个XMPP客户端。它通过提供命令行进一步为Windows和Unix系统服务。此外,一个用户可以通过不同的设备注册,从而实现更好的可访问性。

核心要点

对于构建精通实时通信的应用至关重要,XMPP(可扩展消息与存在协议)是一个完全可扩展的协议。阅读上面的文章,找出关于这个创新协议的其他细节。我们已尝试全面覆盖它。

最初发表于https://www.wallarm.com。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计