2019独角兽企业重金招聘Python工程师标准>>>

由于博客迁移至www.coderyi.com,文章请看http://www.coderyi.com/archives/434

1为什么选择XMPP协议

在IETF 中,把IM协议划分为四种协议,即即时信息和出席协议(Instant Messaging and Presence Protocol, IMPP)、出席和即时信息协议(Presence and Instant Messaging Protocol, PRIM)、针对即时信息和出席扩展的会话发起协议(Session Initiation Protocol for Instant Messaging and Presence Leveraging Extensions, SIMPLE),以及可扩展的消息出席协议(XMPP)

XMPP协议的前身是Jabber,我们采取XMPP协议主来实现IM主要是考虑XMPP协议是以XML为基础的,它继承了在XML环境中灵活的发展性。这表明XMPP是可扩展的,所以XMPP信息不仅可以是简单的文本,而且可以携带复杂的数据和各种格式的文件

1.    XMPP 协议是公开的,由JSF开源社区组织开发的。XMPP 协议并不属于任何的机构和个人,而是属于整个社区,这一点从根本上保证了其开放性。

2.    XMPP 协议具有良好的扩展性。在XMPP 中,即时消息和到场信息都是基于XML 的结构化信息,这些信息以XML 节(XML Stanza)的形式在通信实体间交换。XMPP 发挥了XML 结构化数据的通用传输层的作用,它将出席和上下文敏感信息嵌入到XML 结构化数据中,从而使数据以极高的效率传送给最合适的资源。基于XML 建立起来的应用具有良好的语义完整性和扩展性。

3.    分布式的网络架构。XMPP 协议都是基于Client/Server 架构,但是XMPP协议本身并没有这样的限制。网络的架构和电子邮件十分相似,但没有结合任何特定的网络架构,适用范围非常广泛。

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

5.    安全性。XMPP在Client-to-Server通信,和Server-to-Server通信中都使用TLS (Transport Layer Security)协议作为通信通道的加密方法,保证通信的安全。任何XMPP服务器可以独立于公众XMPP网络(例如在企业内部网络中),而使用SASL及TLS等技术更加增强了通信的安全性。如下图所示:

2 xmpp的基本网络结构

XMPP是一个典型的C/S架构,而不是像大多数即时通讯软件一样,使用P2P客户端到客户端的架构,也就是说在大多数情况下,当两个客户端进行通讯时,他们的消息都是通过服务器传递的(也有例外,例如在两个客户端传输文件时).采用这种架构,主要是为了简化客户端,将大多数工作放在服务器端进行,这样,客户端的工作就比较简单,而且,当增加功能时,多数是在服务器端进行.XMPP服务的框架结构如下图所示.XMPP中定义了三个角色,XMPP客户端,XMPP服务器、网关.通信能够在这三者的任意两个之间双向发生.服务器同时承担了客户端信息记录、连接管理和信息的路由功能.网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信)、MSN、ICQ等.基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML,工作原理是:

(1)节点连接到服务器;(2)服务器利用本地目录系统中的证书对其认证;(3)节点指定目标地址,让服务器告知目标状态;(4)服务器查找、连接并进行相互认证;(5)节点之间进行交互.

2.1 XMPP客户端

XMPP 系统的一个设计标准是必须支持简单的客户端。事实上,XMPP 系统架构对客户端只有很少的几个限制。一个XMPP 客户端必须支持的功能有:

1. 通过 TCP 套接字与XMPP 服务器进行通信;

2. 解析组织好的 XML 信息包;

3. 理解消息数据类型。

XMPP 将复杂性从客户端转移到服务器端。这使得客户端编写变得非常容易,更新系统功能也同样变得容易。XMPP 客户端与服务端通过XML 在TCP 套接字的5222 端口进行通信,而不需要客户端之间直接进行通信。

基本的XMPP 客户端必须实现以下标准协议(XEP-0211):

RFC3920 核心协议Core

RFC3921 即时消息和出席协议Instant Messaging and Presence

XEP-0030 服务发现Service Discovery

XEP-0115 实体能力Entity Capabilities

2.2 XMPP服务器

XMPP 服务器遵循两个主要法则:

l  监听客户端连接,并直接与客户端应用程序通信;

l  与其他 XMPP 服务器通信;

XMPP开源服务器一般被设计成模块化,由各个不同的代码包构成,这些代码包分别处理Session管理、用户和服务器之间的通信、服务器之间的通信、DNS(Domain Name System)转换、存储用户的个人信息和朋友名单、保留用户在下线时收到的信息、用户注册、用户的身份和权限认证、根据用户的要求过滤信息和系统记录等。另外,服务器可以通过附加服务来进行扩展,如完整的安全策略,允许服务器组件的连接或客户端选择,通向其他消息系统的网关。

基本的XMPP 服务器必须实现以下标准协议

RFC3920 核心协议Core

RFC3921 即时消息和出席协议Instant Messaging and Presence

XEP-0030 服务发现Service Discovery

2.3 XMPP网关

XMPP 突出的特点是可以和其他即时通信系统交换信息和用户在线状况。由于协议不同,XMPP 和其他系统交换信息必须通过协议的转换来实现,目前几种主流即时通信协议都没有公开,所以XMPP 服务器本身并没有实现和其他协议的转换,但它的架构允许转换的实现。实现这个特殊功能的服务端在XMPP 架构里叫做网关(gateway)。目前,XMPP 实现了和AIM、ICQ、IRC、MSN Massager、RSS0.9 和Yahoo Massager 的协议转换。由于网关的存在,XMPP 架构事实上兼容所有其他即时通信网络,这无疑大大提高了XMPP 的灵活性和可扩展性。

3服务器端介绍

3.1 什么是Openfire

Openfire 采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议。您可以使用它轻易的构建高效率的即时通信服务器.

Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。

由于是采用开放的XMPP协议,您可以使用各种支持XMPP协议的IM客户端软件登陆服务.

3.2  为什么使用Openfire

A、Openfire为Java开源项目

B、 采用开放的XMPP协议

C、 有多种针对不通系统的版本

D、使用Socket通讯

E、 单台服务器可支持上万并发用户,搭建分布式云服务器可轻松提供大量并发用户。

F、 Socket长连接

G、服务器稳定

H、提供接口,可自己开发插件

4 XMPP协议的组成

RFC 3920 XMPP:核心。定义了XMPP 协议框架下应用的网络架构,引入了XML Stream(XML 流)与XML Stanza(XML 节),并规定XMPP 协议在通信过程中使用的XML 标签。使用XML 标签从根本上说是协议开放性与扩展性的需要。此外,在通信的安全方面,把TLS 安全传输机制与SASL 认证机制引入到内核,与XMPP 进行无缝的连接,为协议的安全性、可靠性奠定了基础。Core 文档还规定了错误的定义及处理、XML 的使用规范、JID(Jabber Identifier,Jabber 标识符)的定义、命名规范等等。所以这是所有基于XMPP 协议的应用都必需支持的文档。

RFC 3921:用户成功登陆到服务器之后,发布更新自己的在线好友管理、发送即时聊天消息等业务。所有的这些业务都是通过三种基本的XML 节来完成的:IQ Stanza(IQ 节), Presence Stanza(Presence 节), Message Stanza(Message 节)。RFC3921 还对阻塞策略进行了定义,定义是多种阻塞方式。可以说,RFC3921 是RFC3920 的充分补充。两个文档结合起来,就形成了一个基本的即时通信协议平台,在这个平台上可以开发出各种各样的应用。

XEP-0030 服务搜索。一个强大的用来测定XMPP 网络中的其它实体所支持特性的协议。

XEP-0115 实体性能。XEP-0030 的一个通过即时出席的定制,可以实时改变交变广告功能。

XEP-0045 多人聊天。一组定义参与和管理多用户聊天室的协议,类似于Internet 的Relay Chat,具有很高的安全性。

XEP-0096 文件传输。定义了从一个XMPP 实体到另一个的文件传输。

XEP-0124 HTTP 绑定。将XMPP 绑定到HTTP 而不是TCP,主要用于不能够持久的维持与服务器TCP 连接的设备。

XEP-0166 Jingle。规定了多媒体通信协商的整体架构。

XEP-0167 Jingle Audio Content Description Format。定义了从一个XMPP 实体到另一个的语音传输过程。

XEP-0176 Jingle ICE(Interactive Connectivity Establishment)Transport。ICE传输机制,文件解决了如何让防火墙或是NAT(Network Address Translation)保护下的实体建立连接的问题。

XEP-0177 Jingle Raw UDP Transport。纯UDP 传输机制,文件讲述了如何在没有防火墙且在同一网络下建立连接的。

XEP-0180 Jingle Video Content Description Format。定义了从一个XMPP 实体到另一个的视频传输过程。

XEP-0181 Jingle DTMF(Dual Tone Multi-Frequency)。

XEP-0183 Jingle Telepathy Transport Method。

5 XMPP地址格式

一个实体在XMPP网络结构中被称为一个接点,它有唯一的标示符jabber identifier(JID),即实体地址,用来表示一个Jabber用户,但是也可以表示其他内容,例如一个聊天室.一个有效的JID包括一系列元素:(1)域名(domain identifier);(2)节点(node identifier);(3)源(resource identifier).它的格式是node@domain/resource,node@domain ,类似电子邮件的地址格式.domain用来表示接点不同的设备或位置,这个是可选的,例如a在Server1上注册了一个用户,用户名为doom,那么a的JID就是doom@serverl,在发送消息时,指明doom@serverl就可以了,resource可以不用指定,但a在登录到这个Server时,fl的JID可能是doom@serverl、exodus(如果a用Exodus软件登录),也可能是doom@serverl/psi(如果a用psi软件登录).资源只用来识别属于用户的位置或设备等,一个用户可以同时以多种资源与同一个XMPP服务器连接。

6 XMPP消息格式

XMPP通信原语有3种:message、presence和iq。

6.1 message

message是一种基本推送消息方法,它不要求响应。主要用于IM、groupChat、alert和notification之类的应用中。

主要属性如下:

6.1.1 type属性,它主要有5种类型:

  • normal:类似于email,主要特点是不要求响应;

  • chat:类似于qq里的好友即时聊天,主要特点是实时通讯;

  • groupchat:类似于聊天室里的群聊;

  • headline:用于发送alert和notification;

  • error:如果发送message出错,发现错误的实体会用这个类别来通知发送者出错了;

6.1.2 to属性:标识消息的接收方。

6.1.3 from属性:指发送方的名字或标示。为防止地址外泄,这个地址通常由发送者的server填写,而不是发送者。

载荷(payload):例如body,subject,thread

例子:

<message

to="lily@jabber.org/contact"

type="chat" >

<body> 你好,在忙吗</body>

</message>

6.2 presence

presence用来表明用户的状态,如:online、away、dnd(请勿打扰)等。当改变自己的状态时,就会在stream的上下文中插入一个Presence元素,来表明自身的状态。要想接受presence消息,必须经过一个叫做presence subscription的授权过程。

6.2.1 属性

6.2.1.1 type属性,非必须。有以下类别

  • subscribe:订阅其他用户的状态

  • probe:请求获取其他用户的状态

  • unavailable:不可用,离线(offline)状态

6.2.1.2 to属性:标识消息的接收方。

6.2.1.3 from属性:指发送方的名字或标示。

6.2.2 载荷(payload):

6.2.2.1 show:

  • chat:聊天中

  • away:暂时离开

  • xa:eXtend Away,长时间离开

  • dnd:勿打扰

6.2.2.2 status:格式自由,可阅读的文本。也叫做rich presence或者extended presence,常用来表示用户当前心情,活动,听的歌曲,看的视频,所在的聊天室,访问的网页,玩的游戏等等。

6.2.2.3 priority:范围-128~127。高优先级的resource能接受发送到bare JID的消息,低优先级的resource不能。优先级为负数的resource不能收到发送到bare JID的消息。

例子:

<presence from="alice@wonderland.lit/pda">

<show>xa</show>

<status>down the rabbit hole!</status>

</presence>

6.3 iq (Info / Query)

一种请求/响应机制,从一个实体从发送请求,另外一个实体接受请求,并进行响应。例如,client在stream的上下文中插入一个元素,向Server请求得到自己的好友列表,Server返回一个,里面是请求的结果。

主要的属性是type。包括:

  • Get :获取当前域值。类似于http get方法。

  • Set :设置或替换get查询的值。类似于http put方法。

  • Result :说明成功的响应了先前的查询。类似于http状态码200。

  • Error: 查询和响应中出现的错误。

例子:

<iq from="alice@wonderland.lit/pda"

id="rr82a1z7"

to="alice@wonderland.lit"

type="get">

<query xmlns="jabber:iq:roster"/>

</iq>

XMPP 3920 最靠谱的中文翻译文档

http://wenku.baidu.com/view/563b1ebff121dd36a32d8225.html

XMPP-RFC3921中文

http://wenku.baidu.com/view/37ac3efafab069dc502201c7.html

转载于:https://my.oschina.net/u/1378445/blog/354746

XMPP协议简单介绍相关推荐

  1. 中国移动WMMP物联网协议简单介绍

    这段时间一直在实现中国移动WMMP物联网协议,现在将该协议简单总结一下. 该协议主要是M2M平台通过GPRS网络或者短信远程管理M2M终端,包括分配终端序列号,采集终端配置信息, 配置终端参数, 软件 ...

  2. POP3协议简单介绍

    在Internet,POP3(Post Office Protocol 3)协议通常被用来接收电子邮件.这个协议很容易学,因为它只包含12个命令(其中有3个你完全可以忽略它们的存在).这些命令被客户端 ...

  3. SSL和SSH协议简单介绍。

    工作的网络层次 在OSI七层模型中,这两个安全传输协议其实都是建立在应用层上的. (图片来源:Wikipedia) 设计意图及举例 ①.在最初的设计意图中: SSL被设计为加强Web安全传输(HTTP ...

  4. PBAP协议 简单介绍

    以下的内容摘自PBAP规范1.2.3 1,phone book object类型 pb:主电话本.有的电话本数据是存储在手机本身里,还有的存储在SIM卡里. ich:接电话列表. och:打电话列表. ...

  5. Http协议简单介绍

    一.Http协议解析 HTTP(HyperText Transfer Protocol)即超文本传输协议,是一种详细规定了浏览器和万维网服务器之间互相通信的规则,它是万维网交换信息的基础,它允许将HT ...

  6. 量子BB84,B92协议简单介绍

    最近开设量子课程,闲着没事把学过协议做一个整理,这次准备BB84与B92协议,E91协议也看了,不过还有很多地方没有想明白,等学明白了在写一下E91理解,参考书籍为<量子密码学>,曾贵华著 ...

  7. Zookeeper的Paxos算法,(2P/3P/CAP/BASE)一致性协议简单介绍

    2P/3P提交(为了保证事务的ACID) 2P 就是二段提交(RDBMS经常就这种机制,保证强一致性),3P就是三段提交: 2P提交 -- 1阶段:提交事务请求(投票阶段)               ...

  8. 开源Jabber(XMPP) IM服务器介绍

    一.摘要 这是我粗略读了一遍Jabber协议和相关技术文章后的产物,有些地方不一定准确.在文章中引用的一些代码来自www.jabber.org上的文章. 二. 什么是Jabber     Jabber ...

  9. 基于SIP和RTP协议的开源VOIP之QuteCom简单介绍

    **************************************************************************************************** ...

最新文章

  1. linux挂载点的容量设置
  2. 【opencv】6.视频编码格式与封装格式
  3. 【转载】SAP表修改概览
  4. 电脑下面的任务栏怎么取消隐藏_电脑桌面右下方任务栏的小图标如何隐藏
  5. opencv入门课程:彩色图像灰度化和二值化(采用skimage库和opencv库两种方法)
  6. OCP 笔记,非常感谢那位告诉的博客。谢谢。
  7. 使用OUTPUT从句从SQL Server表删除和归档大量记录
  8. 调剂2002年计算机科学与技术,东莞理工学院2020年硕士研究生调剂信息公告 (计算机科学与技术、资源与环境专业(原...
  9. 141178万人, pyechart制作第七次人口普查数据动态图
  10. 第六章 三维全景技术
  11. Lattice PCIe 学习 1
  12. 电主轴编码器测试工具VS sensorikHCU500/DCMU-BOX,海德汉PWM21/PWT101,LENORD+BAUER(L+B)211BSO/211CS04E2M使用对比
  13. 2022年上海应届生落户流程及步骤!应届生落户上海材料清单!
  14. 什么是IP65?仅仅是防水等级吗?看完本文直呼666!
  15. 小红书流量红利词「0基础」实操手册
  16. Java 在线编程编译工具上线,直接运行Java代码
  17. 查看网段内所有ip设备
  18. 冶化工业计算机模拟仿真工作,工业仿真,工业三维虚拟仿真技术平台 - 【中视典数字科技】...
  19. 重新认识康德的“头上星空”
  20. 常规 JavaScript 加密大全

热门文章

  1. ITK:使用最小最大曲率流平滑RGB图像
  2. VTK:可视化之TransformActorCollection
  3. VTK:相互作用之InteractorStyleTerrain
  4. VTK:几何对象之EllipticalCylinder
  5. C语言二叉树总和等于k的所有路径的算法(附完整源码)
  6. C++words search单词搜索的算法实现(附完整源码)
  7. OpenGL球体的Phong渲染
  8. C语言实现双向链表Doubly Linked List(附完整源码)
  9. QML基础类型之url
  10. 6.支持向量机(SVM)、什么是SVM、支持向量机基本原理与思想、基本原理、课程中关于SVM介绍