`
bcyy
  • 浏览: 1823783 次
文章分类
社区版块
存档分类
最新评论

XMPP简介(一)

 
阅读更多

版权所有,转载请注明出处:http://guangboo.org/2013/01/30/xmpp-introduction

可扩展消息与出席协议(XMPP)是基于XML,针对消息中间件的通讯协议,协议原名为Jabber,由Jabber开源社区在1999年开发,功能包括近乎实时的即时消息,出席信息,用户列表的维护。协议被设计成可扩展的,也可以用于发布-订阅系统;VoIP,视频,文件传输的信号处理;游戏;及其他网络应用,如智能电网,社交网络等。

与其他即时消息协议不同,XMPP定义了一个开放的标准,并采用开放系统的发展和应用方式,因此任何人都可以实现XMPP服务,并与其他组织的实现进行交互。由于XMPP是开放的协议,在任何软件许可证下都可以对其进行开发实现;尽管很多服务端、客户端和类库的实现都是采用开源软件方式进行分发的,但也有相当一部分是非开源的免费或付费的。

互联网工程任务组(IETF)在2002年成立了XMPP工作小组,正式将XMPP的核心协议作为一项IETF即时消息与出席的技术。 XMPP工作小组完成了4个规范(RFC3920, RFC3921, RFC3922, RFC3923)的编写,并在2004年作为建议性标准发布。2011年RFC3920与RFC3921分别被RFC6120和RFC6121取代,并且RFC6122还规范了XMPP地址格式。除了IETF标准化的核心协议外,XMPP标准基金会(前身是Jabber软件基金会)正致力于开发更多开放的XMPP扩展。

基于XMPP的软件在互联网上得到广泛应用,据XMPP标准基金会统计,到2003年,有超过一千万用户的使用量。

背景

从1998年,Jeremie Miller开始供职于Jabber技术公司,1999年1月4日,jabberd服务第一个版本发布。早期的Jabber社区专注于开源软件,主要是jabberd服务(如,2000年5月的1.0版本,2000年10月的1.2版本,2001年2月的1.4版本),但如今看来,其主要成果则是XMPP协议的开发。

早期的Jabber协议于1999~2000年间开发完成,形成了XMPP的基础,并由RFC3920与RFC3921发布(IETF的XMPP工作小组在正规化的过程中的主要修改在于添加了用于加密信道的TLS和安全验证的SASL)。要注意的是RFC3920和RFC3921在2011年已被新颁布的RFC6120和RFC6121取代。

第一个基于XMPP协议的IM服务是Jabber.org,自1999年以来一直运行着,并免费提供XMPP用户账户。从1999年到2006年2月,其服务端软件一直使用jabberd,之后才迁移至ejabberd上(两者都使免费的)。直到2010年1月,服务又迁移到Isode公司的专有M-Link服务上。

2005年8月,Google推出Google Talk, 集成了VoIP和IM系统,采用了XMPP作为即时消息处理,并采用了以XMPP为基础的Jingle协议来处理语言和文件传输。(首次推出时并不包括服务端到服务端的通讯功能,直到2006年1月17日才启用该功能)。之后,google又添加了视频功能,同样是采用Jingle协议来处理信号。2008年1月, AOL尝试推出了支持XMPP的AIM服务,允许AIM用户使用标准化、开源的XMPP协议进行通讯。然而,2008年3月,该项服务终止。2011年5月,AOL又提供了对XMPP的有限支持。

2008年9月,思科收购了Jabber公司,从而出现了商业产品Jabber XCP。

2010年2月,社交网络公司Facebook通过XMPP协议向第三方应用开放了聊天功能。Facebook开发者网站指出,Facebook聊天功能在其后台并没有XMPP服务运行, 而仅仅提供一个XMPP的客户端;因此,一些服务端功能,如花名册的编辑功能无法通过XMPP来完成。

类似的,2011年11月,微软发布了Microsoft Messenger service的XMPP接口。Skype也提供了有限的XMPP支持,但没有对XMPP的原生实现。

优点

分布式

XMPP网络架构类似于email;任何人都可以运行各种的XMPP服务,而没有中心主服务。

开放标准

IETF已正式批准XMPP为一项即时消息和出席技术(最新的规范为RFC6120和RFC6121)。实现对规范的支持不需要特许使用费,开发也不依赖于单独的供应商。

背景

XMPP技术从1999年开始应用至今,已有多种XMPP标准的实现,包括客户端,服务端,组件及代码库等。

安全性

XMPP服务器可以与公共的XMPP网络(如公司局域网)隔离,强安全性(通过SASL和TLS实现)是XMPP核心规范的重要组成部分。

灵活性

可以在XMPP的上添加自定义功能;为保持互操作性,常见的扩展都由XMPP标准基金会管理,IM背后的XMPP应用包括群聊,网络管理,内容聚合,协作工具,文件共享,游戏,远程系统控制和监控,地理定位,中间件和云计算,VoIP及身份识别服务等。

缺点

二进制数据传输较低效

由于XMPP除了长连接的XML流意外,还没有那种编码方式可以有效的进行XML交换,二进制数据必须首先进行base64编码,才能在带内进行传输。因此任何大数据(如文件传输)最好在带外进行传输,使用带内消息进行配合。最后的例子是XMPP扩展协议Jingle, 参加XEP-0166。

分布式及地址

XMPP网络采用客户端-服务端架构(客户间相互不直接通讯)。然而,分布式的设计是没有中心权威服务器的,而像AIM和Live Messenger却有。从这方面来说,经常会出现一些混乱,就像一个公共的XMPP服务器正运行在jabber.org域名上,并有大量用户进行了注册,然而任何人也可以运行各自的XMPP服务器,使用他们自己的域名。

网络中的每个人都有一个唯一的Jabber ID(通常简写为JID)。为了避免不使用中心服务器来ID列表,JID的结构被设计的像email地址一样,由名称和用户所在服务器的域名(或IP地址)组成,使用@符合分隔,如username@example.com。

由于用户可能希望从多个位置登录,他们需要指定一个资源。资源标识了登录用户使用的特定客户端(如home,work, mobile等),它可以通过在斜杠后跟一个资源名来包含在JID中,如用户手机账户的JID全名可能为:username@example.com/mobile。

每个资源都有一个称为优先级的特定数字,给username@example.com的消息将会使用最高优先级发送给客户端,然而给username@example.com/mobile的消息则只会发送到手机客户端。优先级越高数值就越大。没有名称部分的JID也是合法的,可用于系统消息和服务器端特殊功能的控制。JID中资源部分也是可选的。

XMPP通过HTTP和WebSocket传输

XMPP最初和原生的传输协议是TCP,在TCP长连接上传输XML流的方式。

作为TCP传输的替代方案,XMPP社区还为web客户端和被防火墙限制的用户,开发了HTTP传输方式。在最初的规范中,XMPP可以使用通过两种方式来使用HTTP协议:轮询和绑定。轮询方式已经过时,这基本就是意味着存储于服务端数据库中的消息会被XMPP客户端通过HTTP的GET, POST请求频繁的进行提取(和提交)。绑定方式使用Bidirectional-streams Over Synchronous HTTP (BOSH)技术实现,允许服务端进口将消息”推送“到客户端。这种消息的”推送“模式比轮询更高效,因为大部分轮询操作都是无用的,是没有新数据返回的。

由于HTTP协议的使用,大部分防火墙允许用户任意的获取和发送消息。因此,在XMPP使用的端口被屏蔽的情况下,服务可以在HTTP端口上进行监听,并畅通无阻。大部分网站都允许用户通过浏览器登录XMPP,此外,还有一些公共的服务器,是监听标准HTTP端口(80),和HTTPS端口(430)的,因此这样穿越防火墙进行连接是允许的。然而,IANA注册的BOSH端口实际是5280,而非80端口。

一个也许更高效的实时消息传输方式是WebSocket,它能在单独的TCP连接中提供双向,全双工通信信道的web技术,基于WebSocket的XMPP传输实现已进入实验阶段,其文档草案(已过去)也已由IETF发布,但尚未标准化。

原文地址:http://en.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol

分享到:
评论

相关推荐

    XMPP协议简介

    XMPP协议的详细简介 android上的通讯协议的其中一种

    Android XMPP通讯自定义Packet&Provider

    摘要 在xmpp通信过程中,asmack中...androidpn (Android Push Notification)是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。 androidpn包括Server端和Client端,项目名

    基于Qt+opencv开发的桌面应用+xmpp+Mqtt即时通讯+图像处理+vtk3D点云显示+WebEngine展示三维页面

    基于VS2017嵌套Qt插件开发的一款桌面应用程序,程序整体架构采用插件框架,各摸块通过插件管理器与主系统进行通讯,主系统主要功能包含xmpp、Mqtt即时通讯,opencv视觉处理,vtk3D点云显示,WebEngine展示WebGL或三...

    javasmack源码-xmpp-push-notification:xmpp消息推送

    简介:XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性,有很强的可扩展性。包括上面讲的GCM服务器底层也是采用XMPP协议封装的。 优点:协议成熟、强大、可扩展性强、目前主要应用于许多聊天系统中,且已...

    D3Xmpp_v2:learningxmppandroid

    这是一个完整的xmpp的Android的项目 服务端使用openfire3.9.3 客户端使用Android4.2.2 集成第三方: 百度地图sdk asmack.jar universal-image-loader-1.9.3.jar ##功能 注册登录会员 会员个人资料修改 基本聊天 语音...

    TestXMPP:Android应用原始代码基于XMPP的即时聊天项目

    TestXMPP Android应用原始代码基于XMPP的即时聊天项目原始代码简介:本项目是一套基于android + asmack + openfire + xmpp的安卓即时聊天服务端,项目直连google talk服务器,可以使用谷歌帐号登录客户端,测试需要...

    基于Java的校园语音通信软件设计.docx

    第一章 绪 论 1.1 课题的研究背景与意义 1.2 国内外研究现状 1.3 要解决的问题 1.4 本文的主要工作 1.5 各章节安排 第二章 软件相关技术简介 2.1 Java 语言 2.1.1 Java 语言概述 2.1.2 Java 的移植性 2.1.3 Java 与 ...

    WebRTC零基础开发者教程(纯净版)

    WebRTC 简介 WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音通话或视频聊天的技术,是谷歌2010年以6820万美元收购Global IP Solutions公司而获得的一项...

    轻松使用rabbitmq.rar

    RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展...

    计算机毕业论文 即时通讯系统语音通信模块

    2.1.1 XMPP协议简介 7 2.1.2 XMPP协议基本网络结构 7 2.1.2 选择XMPP协议的理由 7 2.2 网络通信协议 8 2.3 SOCKET网络编程 9 2.4 音频捕获技术 9 2.5 音频回放技术 9 2.6 音频采样技术 10 2.7 音频压缩/解压技术 10 ...

    细细品味架构·从零开始搭建高可用IM系统(第3期)

    1、本期内容 1.1 版权申明 1.2 内容详情 1.2.1 什么是IM 1.2.2 协议设计 1.2.3 WEB 聊天室 ...2.6.2 一个简单的例子 2.6.3 和其他类似技术的比较 2.6.4 高级应用话题 2.6.5 Protobuf 的更多细节 2.6.6 结束语

    JGroups-2.6.2.bin.zip

    介绍部分摘自XMPP Jabber即时通讯开发实践 http://hi.baidu.com/jabber/blog/item/7e879852a23efd0f0cf3e3ea.html<br>JGroups 适合使用场合 服务器集群cluster、多服务器通讯、服务器replication(复制)等,...

    使用Meteor全栈框架以JavaScript开发的Web聊天服务器+即时在线聊天

    Rocket.Chat 是特性丰富的 Slack 开源替代品之一。 主要功能:群组聊天,直接通信,私聊群,桌面通知,媒体嵌入,链接预览,文件上传,语音/视频聊天,截图等等。 Rocket.Chat 原生支持 Windows,Mac OS X,Linux,...

    springCloud

    RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展...

    CentOs 7.3中搭建RabbitMQ 3.6单机多实例服务的步骤与使用

    RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展...

    euc-2014:Tsung for Erlang用户大会2014负载测试简介

    XMPP / MongooseIM工程师 / / 什么是负载测试? 性能测试的类型: 在特定负载下进行测试-在一个4核,64GiB RAM盒上,如果有10万用户登录并彼此交换消息,则平均消息传递时间/速率是多少? 压力测试-该盒子的...

    webrtc-node-app:该存储库的创建是出于教学目的,它补充了我的WebRTC文章《柠檬紧缩》

    如何使用WebRTC和Node实施视频会议WebRTC简介WebRTC(Web实时通信)是一个开放源代码项目,可实现浏览器之间的对等通信。 换句话说,WebRTC允许您通过Web交换任何类型的媒体(例如视频,音频和数据),而无需任何...

    smack4-doc-zh:smack4 中文文档

    6月毕业后来到帝都上班,找了一份Android开发的工作,公司开发的APP需要使用XMPP和Smack进行即时聊天,服务端和IOS平台都已经投入使用,目前在捣鼓Android端的IM,反复看了几次文档依旧不太会使,想着还是一点一点...

    RabbitMQ消息中间件实战(附讲义和源码)

    RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展...

Global site tag (gtag.js) - Google Analytics