您的位置:首页 > 其它

XMPP协议

2016-07-16 17:23 260 查看
XMPP 全称Extensible Messaging and Presence Protocol,前称Jabber

从本质上讲, 一个XML流作为会话期间发送的XML节的信封, 而另一个XML流作为会话期间接收的XML节的信封. 我们可以用如下的简化模型做一个展示.

+--------------------+--------------------+
| INITIAL STREAM     |  RESPONSE STREAM   |
+--------------------+--------------------+
| <stream>           |                    |
|--------------------|--------------------|
|                    | <stream>           |
|--------------------|--------------------|
| <presence>         |                    |
|   <show/>          |                    |
| </presence>        |                    |
|--------------------|--------------------|
| <message to='foo'> |                    |
|   <body/>          |                    |
| </message>         |                    |
|--------------------|--------------------|
| <iq to='bar'       |                    |
|     type='get'>    |                    |
|   <query/>         |                    |
| </iq>              |                    |
|--------------------|--------------------|
|                    | <iq from='bar'     |
|                    |     type='result'> |
|                    |   <query/>         |
|                    | </iq>              |
|--------------------|--------------------|
| [ ... ]            |                    |
|--------------------|--------------------|
|                    | [ ... ]            |
|--------------------|--------------------|
| </stream>          |                    |
|--------------------|--------------------|
|                    | </stream>          |
+--------------------+--------------------+


XMPP协议的组成

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

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。

XMPP XML格式

XMPP定义了三种顶级XML节

<iq />
<message />
<presence />


< message />节定义了消息语义,< message />节可被看作“推”机制,一个实体推信息给其它实体,与EMAIL系统中发生的通信类似。所有消息节应该拥有‘to’属性,指定有意的消息接收者;根据接收到那样的一个节,服务器应该路由或传送它到有意的接收者。

用于两个用户之间发送消息

例子:

<message
to="lily@jabber.org/contact"
type="chat" >
< body> 你好,在忙吗</ body>
</ message >


< presence />节定义了出席语义,< presence />节可被看作基本广播或“出版-订阅”机制,多实体收到他们已订阅(在这种情况下,网络可利用信息)实体的信息。总的来说,出版实体应该发送一个不带‘to’属性的出席节,在这种情况下,与此实体相连的服务器应该广播给所有订阅实体。然而,一个出版实体也可能发送一个带有‘to’属性的出席节,此种情况下,服务器应该路由或传送节到有意的接收者。

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

show:

chat:聊天中

away:暂时离开

xa:eXtend Away,长时间离开

dnd:勿打扰

status:

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

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>


< iq />节定义了请求语义,< iq />节可被看作一个请求-响应机制,与[HTTP]在某些方面相似。IQ语义让一个实体向其它实体请求或接收其它实体的响应成为可能。请求与响应的数据内容由IQ无素的直接子元素的命名空间声明定义,并且,交互由请求实体通过使用‘id’属性来跟踪。因此,IQ交互遵从结构化数据交换的一个通用模式,此交换例如得到/结果或设置/结果(虽然如果合适的话,对一个请求的响应可能会以错误返回)。

IQ消息是通过“请求/响应”机制在实体间进行交换的。IQ元素用于不同的目的,它们之间通过不同的命名空间来加以区分。在Jabber/XMPP消息协议里有许多的命名空间,但最常用的命名空间是:”jabber:iq:register”,”jabber:iq:auth”,”jabber:iq:roster”

请求实体                     应答实体
----------                  ----------
|                            |
| <iq id='1' type='get'>     |
|   [ ... payload ... ]      |
| </iq>                      |
| -------------------------> |
|                            |
| <iq id='1' type='result'>  |
|   [ ... payload ... ]      |
| </iq>                      |
| <------------------------- |
|                            |
| <iq id='2' type='set'>     |
|   [ ... payload ... ]      |
| </iq>                      |
| -------------------------> |
|                            |
| <iq id='2' type='error'>   |
|   [ ... condition ... ]    |
| </iq>                      |
| <------------------------- |
|                            |


例子:

<iq from="alice@wonderland.lit/pda"
id="rr82a1z7"
to="alice@wonderland.lit"
type="get">
< query xmlns="jabber:iq:roster"/>
</ iq>


XMPP协议的命名空间:

jabber:iq:private – 私有数据存储,用于本地用户私人设置信息,比如用户备注等。

jabber:iq:conference – 一般会议,用于多个用户之间的信息共享

jabber:x:encrypted – 加密的消息,用于发送加密消息

jabber:x:expire – 消息终止

jabber:iq:time – 客户端时间

jabber:iq:auth – 简单用户认证,一般用于服务器之间或者服务器和客户端之间的认证

jabber:x:roster – 内部花名册

jabber:x:signed – 标记的在线状态

jabber:iq:search – 用户数据库查询,用于向服务器发送查询请求

jabber:iq:register – 注册请求,用于用户注册相关信息

jabber:x:iq:roster – 花名册管理

jabber:x:conference – 会议邀请,用于向参加会议用户发送开会通知

jabber:x:event – 消息事件

vcard-temp – 临时的vCard,用于设置用户的头像以及昵称等

XMPP协议属性

XMPP给这三种节定义了五种通用属性

to
from
id
type
xml:lang


1、to属性指定接收节的JID。

2、from属性指定发送者的JID。

3、id属性是可选的。并且,在接收应用(通常是一个服务器)中是唯一的。(注意:流ID可能是严格安全的,并且因此必须是即不能预测也不能重复的)

4、type属性指定目的或消息上下文,出席或IQ节的详细信息。

(1)、IQ节的type属性有

Get :获取当前域值。类似于http get方法。
Set :设置或替换get查询的值。类似于http put方法。
Result :说明成功的响应了先前的查询。类似于http状态码200。
Error: 查询和响应中出现的错误。
如果是错误类型,会提示一下错误类型
"error-type" 必须是以下之一:
auth -- 在提供身份之后重试
cancel -- 不要重试 (该错误不能加以弥补)
continue -- 继续 (这个条件只是个警告)
modify -- 在修改发送的数据之后重试
wait -- 等待之后重试 (该错误是暂时的)


(2)、presence节的type(非必须)属性有:

subscribe:订阅其他用户的状态
Subscribed:已订阅
Unsubscribe:不能订阅
Unsubscribed:不可订阅的
probe:请求获取其他用户的状态
unavailable:不可用,离线(offline)状态
Available:可用,在线状态
Error:请求中出现的错误
Invisible:不可见


(3)、 message节的type属性有:

Chat:类似于qq里的好友即时聊天,主要特点是实时通讯;
Error:如果发送message出错,发现错误的实体会用这个类别来通知发送者出错了;
GroupChat:类似于聊天室里的群聊;
Headline:用于发送alert和notification;
Normal  :类似于email,主要特点是不要求响应;


5、xml:lang属性值指定任意可读XML字符数据的缺省语言
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xmpp