XMPP
XMPP(全称:Extensible Messaging and Presence Protocol,旧名Jabber[1],中文可译为可扩展消息和表示协议)是一种以XML为基础的开放式即时通讯协定,是经由网际网路工程工作小组(IETF)通过的网际网路标准。
国际标准 | RFC 6120 (Core) (2011) RFC 6121 (IM & Presence) (2011) |
---|---|
规范发布 | 1999年 |
使用于 | 即时通讯 |
官方网站 | xmpp |
历史
编辑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是最灵活的。
特色
编辑优点
编辑- 标准
- 网际网路工程工作小组(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协定来建造及布署即时应用程式及服务的公司及开放源码计划分布在各种领域;用XMPP技术开发软体,资源及支援的来源是多样的,使得使你不会陷于被“绑架”的困境。
缺点
编辑- 资料负载太重
- 随著通常超过70%的XMPP协议的伺服器的资料流量的存在和近60%的被重复转发,XMPP协议目前拥有一个大型架空中存在的资料提供给多个收件人。新的议定书正在研究,以减轻这一问题。
- 二进制资料传输受限
- XMPP传输单一的XML文件,因此要透过XMPP传输二进制资料,需先将二进制资料以Base64编码。但是大量的二进制资料传输,较佳的作法是用外部的其他协定传输,而以XMPP进行沟通。至于其他二进制资料加密会话(encrypted conversations)或图形图标(graphic icons)以嵌入式使用相同的方法。
运作方式
编辑XMPP网路是基于伺服器的(即客户端之间彼此不直接交谈),但是也是分散式的。不像AOL即时通或MSN Messenger等服务,XMPP没有中央官方伺服器。Jabber.org的公众伺服器上有大量的用户,所以有些人误解了,以为它是官方伺服器,不过事实上任何人都可以在自己的网域上运行XMPP伺服器。
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伺服器将讯息寄送给罗密欧。如果他目前不在线上,那么储存讯息以待稍后寄送。
|
|
|
|
罗密欧与朱丽叶两人的XMPP服务是由两家不同的业者所提供的,而他们彼此传讯时,不须拥有对方伺服器的帐号,也不须成为对方业者的会员。
与其他协议互联
编辑XMPP协议的另一功能是运输(transports),也被称为网关(gateways),可允许用户透过网路使用其它协议。这可以是其他的即时通讯协议,也可以是不同协议,如短讯(SMS)或电子邮件。
XMPP协议通过HTTP运输
编辑在原来的规格,XMPP协议可以使用HTTP的方式有两种:轮询(polling)[3]与绑定(binding)[4]。轮询现在不推荐,基本上,轮询意味著HTTP邮件存储在伺服器端的资料库上,客户端必须一再地以HTTP的GET和POST的方式去抓取(以及刊出)其中的讯息。然而使用绑定的方式时,客户端会保留一个长存的HTTP连线,等待一旦伺服器有新的讯息时,就立刻接收讯息。因为轮询的结果往往是伺服端没有新讯息,这种推送的通知模式比轮询的方式更有效率。
由于客户端使用HTTP,大多数防火墙允许客户端获取和留言没有任何障碍。因此,即使使用XMPP协议的TCP端口被拦截,伺服器也能正常地倾听一般的HTTP端口,其上的讯息也能保持畅通。还有一些网站更允许大众经由浏览器登入进XMPP。尤有甚者,还有一些公共的伺服器同时拥有标准HTTP(80埠)和HTTPS(443埠),因此又有助于通过防火墙。
使用实例
编辑XMPP 服务器的高容错性和低开销[5]使得许多大公司使用 XMPP 作为其基础平台来创建私人信使和聊天,以及提供推送通知[6]。
- WhatsApp ~8 亿用户,使用修改后的XMPP协议进行聊天
- 艺电 ~4000 万用户,使用XMPP进行聊天
- Nintendo Switch NPNS ~3500万台设备。使用XMPP传递新闻、通知和其他消息。[7]
- Odnoklassniki ~4200万用户。 用户之间的内部消息传递通过XMPP客户端提供社交网络连接。
- 英雄联盟 ~2700万用户,使用XMPP进行聊天
- 无冬online ~1600万用户,使用XMPP进行聊天
- 堡垒之夜 ~2.5亿用户,使用XMPP进行聊天
- 星战前夜 ~90万用户,使用XMPP进行聊天
- Google ~15亿用户。使用XMPP传递推送通知。
- 苹果公司 ~5亿用户。使用XMPP传递推送通知。
- 美国国家安全局 ~使用 XMPP 进行内部通信。[8]
- 欧洲议会 ~欧洲议会安全局建议议员使用Cisco Jabber而不是Signal或WhatsApp。[9]
实现
编辑XMPP客户端软件
编辑XMPP协议是由大量的XMPP协议的客户端,伺服器和程式库。主要的文章包含了几个XMPP协议清单客户的多种平台。
XMPP服务器端软件
编辑参见
编辑- 即时通讯软件比较
- 流文本定向消息协议(STOMP),由Codehaus开发,基于文本的消息的传输协议,使用类似JMS的`目的地`语义;
- 高级消息队列协议(AMQP),一种面向消息中间件提供的开放的应用层协议;
- 消息队列遥测传输(MQTT),一种轻量级订阅-发布协议。
注释
编辑- ^ Jabber Inc. - About Us. [2009-09-14]. (原始内容存档于2007-07-03).
- ^ Jabber Software Foundation Renamed to XMPP Standards Foundation (页面存档备份,存于互联网档案馆) 1月16日2007年 - jabber.org (页面存档备份,存于互联网档案馆)仍旧被维护
- ^ XEP-0025: Jabber HTTP Polling. [2009-09-08]. (原始内容存档于2020-10-29).
- ^ XEP-0124: Bidirectional-streams Over Synchronous HTTP (BOSH). [2009-09-08]. (原始内容存档于2021-02-13).
- ^ ejabberd Massive Scalability: 1 Node — 2+ Million Concurrent Users | ProcessOne Blog. [2018-06-22]. (原始内容存档于2018-06-22).
- ^ Uses of XMPP. [2018-06-22]. (原始内容存档于2018-06-22).
- ^ ejabberd & Nintendo Switch NPNS | ProcessOne Blog. [2019-06-05]. (原始内容存档于2019-06-05).
- ^ АНБ использует протокол Jabber для чатов — «Хакер». [2018-06-24]. (原始内容存档于2018-06-25).
- ^ EU-Parlament empfiehlt Jabber statt WhatsApp und prüft Signal | heise online. [2019-10-19]. (原始内容存档于2019-10-19).