XMPP

XMPP（全称：Extensible Messaging and Presence Protocol，旧名Jabber，中文可译为可扩展消息和表示协议）是一种以XML为基础的开放式即时通讯协定，是经由互联网工程工作小组（IETF）通过的互联网标准。

## 历史

Jeremie Miller于1998年开始了这个项目。第一个公开版本于2000年5月发行。这个项目的主要产品是jabberd，XMPP的服务器端软件。它既可以创建私人的XMPP网络，也可以加入全球的公共XMPP网络。XMPP的关键特色是，分散式的即时通讯系统，以及使用XML串流。

Jabber已经由IETF XMPP协议（RFC3920）标准化。

Jabber是一个开放源码形式组织产生的网络即时通信协议。XMPP原本是为即时通讯而量身定制，但由于XML Stanza本身是XML元素，在基于XML灵活发展的特性下，使得XMPP也可以适用其他方面，已经得到了IETF的批准。XMPP与IMPP、PRIM、SIP（SIMPLE）合称四大IM协议主流，在此4大协议中，XMPP是最灵活的。

2007年，2001年成立的Jabber软件基金会更名为XMPP标准基金会。

## 特色

### 优点

开放：XMPP协议是自由、开放、公开的，并且易于了解。而且在客户端、服务器、元件、源码库等方面，都已经各自有多种实作。

标准：互联网工程工作小组（IETF）已经将Jabber的核心XML串流协定以XMPP之名，正式列为认可的即时通讯及Presence技术。而XMPP的技术规格已被定义在RFC 3920及RFC 3921。任何IM供应商在遵循XMPP协议下，都可与Google Talk实现连接。

证实可用：第一个Jabber（现在XMPP）技术是Jeremie Miller在1998年开发的，现在已经相当稳定；数以百计的开发者为XMPP技术而努力。今日的互联网上有数以万计的XMPP服务器运作著，并有数以百万计的人们使用XMPP即时传讯软件。

分散式：XMPP网络的架构和电子邮件十分相像；XMPP核心协议通信方式是先建立一个stream，XMPP以TCP传递XML资料流，没有中央主服务器。任何人都可以运行自己的XMPP服务器，使个人及组织能够掌控他们的即时传讯体验。

安全：任何XMPP协议的服务器可以独立于公众XMPP网络（例如在企业内部网络中），而使用SASL及TLS等技术的可靠安全性，已内建于核心XMPP技术规格中。

可扩展：XML命名空间的威力可使任何人在核心协定的基础上建造客制化的功能；为了维持通透性，常见的扩充套件由XMPP标准基金会。

弹性佳：XMPP除了可用在即时通讯的应用程序，还能用在网络管理、内容供稿、协同工具、档案共享、游戏、远端系统监控等。

多样性：用XMPP协定来建造及布署即时应用程序及服务的公司及开放源码计划分布在各种领域；用XMPP技术开发软件，资源及支援的来源是多样的，使得使你不会陷于被“绑架”的困境。

### 缺点

资料负载太重 : 随着通常超过70％的XMPP协议的服务器的资料流量的存在和近60％的被重复转发，XMPP协议目前拥有一个大型架空中存在的资料提供给多个收件人。新的议定书正在研究，以减轻这一问题。

二进制资料传输受限 : XMPP传输单一的XML文件，因此要透过XMPP传输二进制资料，需先将二进制资料以Base64编码。但是大量的二进制资料传输，较佳的作法是用外部的其他协定传输，而以XMPP进行沟通。至于其他二进制资料加密会话（encrypted conversations）或图形图标（graphic icons）以嵌入式使用相同的方法。

## 运作方式

XMPP网络是基于服务器的（即客户端之间彼此不直接交谈），但是也是分散式的。不像AOL即时通或MSN Messenger等服务，XMPP没有中央官方服务器。Jabber.org的公众服务器上有大量的用户，所以有些人误解了，以为它是官方服务器，不过事实上任何人都可以在自己的网域上运行XMPP服务器。

<image>

Jabber识别符（JID）是用户登入时所使用的账号，看起来通常像一个电子邮件地址，如someone@example.com；前半部分为用户名，后半部分为XMPP服务器域名，两个字段以@符号区隔。

假设朱丽叶（juliet@capulet.com）想和罗密欧（romeo@montague.net）通话，他们两人的账号分别在Capulet.com及Montague.net的服务器上。当朱丽叶输入讯息并按下传送钮之后，一连串的事件就发生了：

- 朱丽叶的XMPP客户端将她的讯息传送到Capulet.com XMPP服务器。
- Capulet.com XMPP服务器开启与Montague.net XMPP服务器的连接。
- Montague.net XMPP服务器将讯息寄送给罗密欧。如果他目前不在线上，那么储存讯息以待稍后寄送。

$\leftrightarrow$｜Capulet.com｜$\leftrightarrow$｜Montague.net｜$\leftrightarrow$｜Romeo

罗密欧与朱丽叶两人的XMPP服务是由两家不同的业者所提供的，而他们彼此传讯时，不须拥有对方服务器的账号，也不须成为对方业者的会员。

## 与其他协议互联

<image>

XMPP协议的另一功能是运输（transports），也被称为网关（gateways），可允许用户透过网络使用其它协议。这可以是其他的即时通讯协议，也可以是不同协议，如短讯（SMS）或电子邮件。

## XMPP协议通过HTTP运输

在原来的规格，XMPP协议可以使用HTTP的方式有两种：轮询（polling）与绑定（binding）。轮询现在不推荐，基本上，轮询意味着HTTP邮件存储在服务器端的数据库上，客户端必须一再地以HTTP的GET和POST的方式去抓取（以及刊出）其中的讯息。然而使用绑定的方式时，客户端会保留一个长存的HTTP连线，等待一旦服务器有新的讯息时，就立刻接收讯息。因为轮询的结果往往是伺服端没有新讯息，这种推送的通知模式比轮询的方式更有效率。

由于客户端使用HTTP，大多数防火墙允许客户端获取和留言没有任何障碍。因此，即使使用XMPP协议的TCP端口被拦截，服务器也能正常地倾听一般的HTTP端口，其上的讯息也能保持畅通。还有一些网站更允许大众经由浏览器登入进XMPP。尤有甚者，还有一些公共的服务器同时拥有标准HTTP（80埠）和HTTPS（443埠），因此又有助于通过防火墙。

## 使用实例

XMPP 服务器的高容错性和低开销使得许多大公司使用 XMPP 作为其基础平台来创建私人信使和聊天，以及提供推送通知。

- WhatsApp ~8 亿用户，使用修改后的XMPP协议进行聊天
- 艺电 ~4000 万用户，使用XMPP进行聊天
- Nintendo Switch NPNS ~3500万台设备。使用XMPP传递新闻、通知和其他消息。
- Odnoklassniki ~4200万用户。用户之间的内部消息传递通过XMPP客户端提供社交网络连接。
- 英雄联盟 ~2700万用户，使用XMPP进行聊天
- 无冬online ~1600万用户，使用XMPP进行聊天
- 堡垒之夜 ~2.5亿用户，使用XMPP进行聊天
- 星战前夜 ~90万用户，使用XMPP进行聊天
- Google ~15亿用户。使用XMPP传递推送通知。
- 苹果公司 ~5亿用户。使用XMPP传递推送通知。
- 美国国家安全局 ~使用 XMPP 进行内部通信。
- 欧洲议会 ~欧洲议会安全局建议议员使用Cisco Jabber而不是Signal或WhatsApp。

## 实现

### XMPP客户端软件

XMPP协议是由大量的XMPP协议的客户端，服务器和程式库。主要的文章包含了几个XMPP协议清单客户的多种平台。

## 参见

- 即时通讯软件比较
- 流文本定向消息协议(STOMP)，由Codehaus开发，基于文本的消息的传输协议，使用类似JMS的`目的地`语义。
- 高级消息队列协议(AMQP)，一种面向消息中间件提供的开放的应用层协议。
- 消息队列遥测传输(MQTT)，一种轻量级订阅-发布协议。

## 外部链接

- XMPP标准基金会
- Open list of public XMPP servers
- XMPP Case Studies
- XMPP(Jabber) 聊天快速指南由北京GNU/Linux用户组撰写

## 基本资料

- 国际标准：RFC 6120 (Core) (2011)、RFC 6121 (IM & Presence) (2011)、RFC 7622 (Address Format) (2015)、RFC 3922 (CPIM) (2004)、RFC 3923 (Encryption) (2004)
- 规范发布：1999年
- 产业：即时通讯