XMPP 概述
XMPP 刘宇帅 6年前 阅读量: 2703
原文地址: https://xmpp.org/about/technology-overview
可扩展与表示协议(XMPP,全称Extensible Message and Presence Protocol)是一系列开源技术包括即时通讯、表示、群聊、语言和视频通讯、协作、轻量级插件、内容聚合和广义的XML数据路由等。
XMPP是由Jabber开源社区提供的一个开源、分布式的及时通讯服务的一个可行方案。XMPP有以下几个优点:
- 开放 - XMPP 协议是自由、开放、公开并易于理解的。而且在客户端、服务端、服务端组件和源码库等方面都有多种实现。
- 标准 - 互联网工程工作小组(IETF)已经将核心XML流协议列为标准的即时通讯和表示技术。而XMPP的技术规范在2004年被发表在RFC3920和RFC3921中,并且XMPP标准基金会也陆续发表了许多XMPP扩展协议。2011年的时候修改了XMPP的核心协议,并生成了最新的规范包括RFC6120、RFC 6121、RFC 7622
- 证实可用 - Jabber/XMPP 协议一开始是被Jeremie开发的并且现在已经非常稳定。现在有数以百计的开发者再为这些技术做贡献、数以万计的服务器运行在因特网上并且有数以百万计的人们在使用像Google Talk这样基于XMPP的即时通讯服务。
- 分布式的 - XMPP的网络架构和email很像,任何个人和组织都可以假设XMPP服务器并体验即时通讯服务。
- 安全的 - 任何XMPP服务都可以独立与公开网络独立部署(例如公司内网),并且XMPP内置支持了SASL和TLS来保证安全性。另外XMPP开发者社区正在积极的推进端到端的加密以提高数据安全性。
- 可扩展 - 基于XML的强大能力,任何人可以在核心协议的基础上开发自定义功能。为了保证互操作性,常见的扩展被发布在XMPP基金会协议系列里,但是这些并没有要求各组织必须发表他们自己维护的私有扩展。
- 灵活的 - XMPP不仅被应用在即时通讯上,还包括网络管理、内容聚合、协作工具、文件共享、有些、远程系统监控、网络服务、轻量级中间件、云计算等等。
- 多样性 - 很多公司和开源组织用XMPP构建和部署即时通讯服务,你永远不会受到限制。
本页介绍了XMPP的各方面技术,包括规范地址、实现、入门指南和 special-purpose discussion venues。
XMPP技术关键:
- Core - XMPP技术的核心技术XML流的介绍
- Jingle - SIP-compatible multimedia signalling for voice, video, file transfer, and other applications
- 群聊 - 灵活的、群聊
- 订阅 - 可订阅聚合数据和各种丰富的数据
- BOSH - 基于HTTP实现的XMPP
Core
XMPP核心是基于网络的XML流技术。XMPP协议首次出现在1999年的Jabber开源社区,最初被设计的目的是提供一个开放、安全、分布式的服务用于代替像ICQ、AIM和MSN。互联网工程工作小组在2004年将协议的核心列为XMPP标准。核心技术包括:
- 基本的XML流层
- 加密的数据通讯
- 完整的utf8的Unicode支持,包括完整的国际化地址
- 内置的网络可用性信息
- 双方授权
- 及时的联系人列表
规范
XMPP技术的核心包含在互联网工程工作小组发布的两个标准协议中:
- RFC 6120: XMPP Core
- RFC 6121:XMPP IM
- RFC 7622:XMPP Address Format
XMPP的第一份协议(RFC 3920 和 RFC 3921)是互联网工程工作小组的XMPP工作组在2004年制定的。2011年的时候又重新修订了协议,就生成当前的新的协议规范。
实现
有很多XMPP核心协议的实现。具体内容可以一下页面查看:
Jingle
本质上,Jingle给通讯协议提供了创建、管理和关闭多媒体会话的方法。会话支持很多数据类型(例如 语言聊天、视频聊天和文件传输等)和各种协议的传输协议(例如TCP,UDP,RTP甚至XMPP本身)。在XMPP中媒体直接使用点对点或则媒体传递建立会话连接。Jingle为应用类型和数据传输提供了可插拔的框架。在语音和视频通讯中,Jingle使用即时传输协议并支持已有的多媒体技术例如会话初始化协议(SIP-Session Initiation Protocol)。 Furthermore, the semantics of Jingle signalling was designed to be consistent with both SIP and the Session Description Protocol (SDP), thus making it straightforward to provide signalling gateways between XMPP networks and SIP networks.
规范
Jingle有多个协议规范:
- XEP-0166: Jingle
- XEP-0167: Jingle RTP Sessions
- XEP-0176: Jingle ICE-UDP Transport Method
- XEP-0177: Jingle Raw UDP Transport Method
- XEP-0181: Jingle DTMF
- XEP-0234: Jingle File Transfer
实现
客户端
- Coccinella
- Gajim
- Jitsi (formerly named SIP Communicator)
- Movim
- Pandion
- Pidgin (formerly named Gaim)
- Psi
- Telepathy
- Yate
连接库
- libjingle (C/C++)
- Smack (Java)
- Telepathy Gabble (C)
- yjingle (C++)
呼叫管理/网路电话服务
- Asterisk
- FreeSWITCH
- Yate
群聊
群聊是基于XMPP的多方信息交换的一个类似于在线聊天室的扩展实现,即多个用户可以交换信息在同一个房间或则频道。除了标准的聊天室所具有的主题和邀请等特性外,协议还实现了一个强制的房间控制模型,包括禁言和踢人、房间名字、管理员管理、会员限制、密码限制等。因为群聊是基于XMPP的,所以不仅可以传输铭文信息也可以传递各种xml数据。
规范
群聊规范包含一个主协议和几个副协议:
- XEP-0045: Multi-User Chat
- XEP-0249: Direct MUC Invitations
- XEP-0272: Multiparty Jingle
实现
服务端 - 一下协议内置支持群聊
- ejabberd
- Jabber XCP
- M-Link
- MongooseIM
- Openfire
- Prosody
- Tigase
外部组件 下面的外部组件可以被多种XMPP服务使用
- mu-conference
- palaver
客户端
- Adium
- Gajim
- JWChat
- mcabber
- Movim
- Pidgin
- Psi
连接库
- AnyEvent XMPP (Perl)
- gloox (C++)
- jabber-net (.Net)
- libpurple (C)
- Smack (Java)
- XMPP4R (Ruby)
订阅
订阅功能是由 XEP-0060 规范中定义的一个发布订阅功能的通用扩展协议。协议允许XMPP主体创建一个节点实现订阅服务,并发布信息到这些节点。一个事件通知被广播到所有订阅这个节点的用户实体。订阅坚持传统的订阅者模式,可以作为各种应用的基础,包括新闻、内容聚合、丰富表现、地理定位、工作流系统、网络管理系统和其他需要事件通知的应用。个人事件协议定义在 XEP-0163 规范中,提供一个类似订阅服务的虚拟订阅服务未用户提供丰富表现、微博、社交网络和及时交互等。
规范
订阅包含多个协议规范
- XEP-0060: Publish-Subscribe
- XEP-0163: Personal Eventing Protocol
- XEP-0248: PubSub Collection Nodes
传输数据内容
订阅和个人事件协议(PEP)是传输数据结构随意的,你可以用他们传输任何数据格式,一下是一些比较流行的传输数据格式,特别是于用户即时通讯相关的丰富消息内容:
- Activities
- Atom / RSS Notifications
- Avatars
- Chatroom Visits
- Gaming Activities
- Geolocation
- Moods
- Music Tunes
- TV/Video Activities
- Website Visits
实现
服务端 - 一下XMPP服务端支持订阅和个人事件协议
- ejabberd
- Jabber XCP
- M-Link
- Openfire
- Tigase
服务端组件
- Idavoll
客户端
- Gajim
- Movim
- Psi
连接库
- strophe (C or JavaScript)
- XMPP4R (Ruby)
BOSH
BOSH是基于HTTP实现的双向通信,BOSh模拟类似TCP的传输单元传输。对于同时需要提交和拉取数据的应用程序,BOSH比大多数其他基于http的双向传输协议例如Ajax效率更好。BOSH通过避免HTTP轮询提高效率和实现低延迟,但是并没有实现像Comet那样切块HTTP相应。到目前为止BOSH主要用于Jabber/XMPP的客户端和服务端数据交互。然后,BOSH并没有跟XMPP绑定,也可以用于其他的数据传输,等等。
规范
BOSH规范包含两个:
- XEP-0124: Bidirectional-streams Over Synchronous HTTP
- XEP-0206: XMPP Over BOSH
实现
以下服务内置支持BOSH:
- ejabberd
- Jabber XCP
- M-Link
- MongooseIM
- Openfire
- Prosody
- Tigase
连接管理
以下独立的XMPP连接管理可以被在多个XMPP服务器中使用:
- JabberHTTPBind
- Punjab
- node-xmpp-bosh
- rhb
客户端
- Adium
- Gajim
- JWChat
- Pidgin
- Soashable
- SparkWeb
- Swift
- Tigase Messenger
- Tigase Minichat
连接库
- emite (gwt)
- gloox (C++)
- JSJaC (JavaScript)
- strophe (C or JavaScript)
- Swiften (C++)
- XIFF (Flash)
- XMPP4GWT (gwt)
- xmpp4js (JavaScript)
- XMPP4R (Ruby)