XMPP学习——3、XMPP协议学习补充

流基础

两个基本概念,使得XMPP实体之间的小的结构化信息有效载荷能快速地进行异步交换:XML流和XML节。这些术语的定义如下。

XML流的定义:

XML流是一个容器,用于任何两个实体通过网络进行XML元素的交换. XML流的开始明确表达为一个打开的 "流头" (即, 一个包含了适当树形和命名空间声明的 XML <stream> 标签), 而这个XML流的结尾明确表达为一个关闭的XML </stream> 标签. 在流的生存期间, 发起方实体可以通过这个流发送不限数量的XML元素, 这些元素或用来协商这个流 (例如, 完成 TLS协商 或 SASL协商)
或用于 XML节. "发起流" 是从发起方实体 (通常是一个客户端或服务器) 到接收方实体 (通常是一个服务器), 也可视为对应发起方 "连接到" 或 "和......开启会话" 接收方实体. 发起流允许从发起方实体到接收方实体的单向通讯; 为了让接收方实体能够向发起方实体发送节, 接收方实体必须(MUST) 协商一个相反的流 ("应答流").

XML节的定义:

XML节是一个XMPP中的基本语义单位. 一个节就是一个第一层元素 (在流的深度=1),它的元素名是 "message", "presence", 或 "iq" ,而它的合格命名空间是 'jabber:client' 或 'jabber:server'. 相比之下, 任何其他命名空间限定的第一层元素都不是一个XML节 (stream errors, stream features, TLS相关的元素, SASL相关的元素, 等等.), 由'jabber:client' 或 'jabber:server' 命名空间限定的
<message/>, <presence/>, 或 <iq/> 元素但不在第一层 (例如, 包含在一个扩展元素中的 <message/> 元素 ( 做报告用的 8.4 )也不是一个XML节,
不是命名空间 'jabber:client' 或 'jabber:server'限定的 <message/>, <presence/>, 或 <iq/> 元素也不是一个XML节. 一个XML节典型的包含一个或多个必要的子元素 (以及相关的属性, 元素, 和 XML 字符串数据) 来传达所需的信息, 子元素可以(MAY)使用任何XML命名空间 (见 XML?NAMES 和本协议的 8.4).

有三种节: message, presence, 和 IQ ("Info/Query"的缩写). 这些节类型提供三种不同的通讯原语: 一个 "推送" 机制用于已生成的消息, 一个特定的 "发行-订阅" 机制用于广播网络可用性信息, 和一个 "请求-应答" 机制用于更结构化的数据交换 (类似 HTTP .
更多解释分别位于 8.2.1 , 8.2.2 ,
和 8.2.3 .

 

从本质上讲, 一个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>          |
+--------------------+--------------------+
 
下表总结了根元素<stream/>的属性。

+----------+--------------------------+-------------------------+
|          |    初始实体 到 接收实体     |    接收实体 到 初始实体    |
+----------+--------------------------+-------------------------+
| to       | 接收实体JID               | 初始实体JID              |
| from     | 初始实体JID               | 接收实体JID              |
| id       | 忽  略                       | 流标识                     |
| xml:lang | 默认语言                     | 默认语言                   |
| version  | XMPP 1.0+ supported      | XMPP 1.0+ supported     |
+----------+--------------------------+-------------------------+
 

一个基本的连接:

C: <?xml version='1.0'?>
   <stream:stream
       from='juliet@im.example.com'
       to='im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://etherx.jabber.org/streams'>

S: <?xml version='1.0'?>
   <stream:stream
       from='im.example.com'
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='
       to='juliet@im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://etherx.jabber.org/streams'>

[ ... stream negotiation ... ]

C:   <message from='juliet@im.example.com/balcony'
              to='romeo@example.net'
              xml:lang='en'>
       <body>Art thou not Romeo, and a Montague?</body>
     </message>

S:   <message from='romeo@example.net/orchard'
              to='juliet@im.example.com/balcony'
              xml:lang='en'>
       <body>Neither, fair saint, if either thee dislike.</body>
     </message>

C: </stream:stream>

S: </stream:stream>
 

消息语义(Message)

<message/>节是一个"推送"机制,这里一个实体推送信息到另一个实体, 类似发生在email系统里的通讯一样. 所有消息节将拥有'to'属性用来指定该消息期望的接收者 (见8.1.110.3),
除非消息是被一个已连接的客户端帐号的纯JID发送的. 接收到一个带有'to'地址的消息节之后, 服务器应该尝试路由或递送它到期望的接收者那里(见第十章里和XML节相关的通用路由和递送规则).

 

联机状态语义(Presence)

<presence/>节是一个特定的"广播"或"发布-订阅"机制, 这里多个实体接收关于他们订阅的一个实体的信息(在这个案例中, 是网络可用性信息). 通常, 发布客户端应该发送一个不带有'to'属性的联机状态节, 这种情况下该客户端连接的那个服务器将广播那个节给所有已订阅的实体. 然而, 发布客户端也可以发送一个带有'to'属性的联机状态节, 这种情况下该服务器将路由或递送那个节到期望的接收者. 尽管<presence/>节大部分情况下是由XMPP客户端使用, 它也可能被服务器, 附加服务, 以及任何其他类型呃XMPP实体使用.
参见第十章中和XML节相关的通用路由和递送规则,
以及XMPP?IM中联机状态应用的特定规则.

 

IQ语义(IQ)

信息查询(Info/Query),或IQ, 是一个"请求-应答"机制, 类似某些情况下的超文本传输协议HTTP.
IQ的语义允许一个实体对另一个实体做出一个请求, 并接收一个应答. 这个请求和应答的数据内容由schema或其他限定IQ元素的直接子元素的XML命名空间相关的结构化定义(见8.4)来限定,
发出请求的实体使用'id'属性来跟踪交互过程. 所以, IQ交互沿用了结构化数据交换的常见模式,类似 get/result 或 set/result (尽管适当的时候对于某个请求会返回一个error):

请求实体                     应答实体
----------                  ----------
    |                            |
    | <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>                      |
    | <------------------------- |
    |                            |
 

为强制这些语义, 以下规则适用:

1. 'id'属性对于IQ节是必需的.
2. 'type'属性对于IQ节是必需的. 这个值必须是以下之一; 如果不是, 接收者或中间路由器必须返回一个<bad-request/>节错误(8.3.3.1).

  • get -- 该节请求信息, 查询需要什么数据以完成更多操作, 等等.
  • set -- 该节为完成某个操作提供需要的数据, 设置新值, 取代旧值, 等等.
  • result -- 该节是对成功的get或set请求的应答.
  • error -- 该节报告关于处理或递送一个get或set请求时发生的错误(见8.3).
3. 接收到类型为"get"或"set"的IQ请求的实体必须返回一个类型为"result"或"error"的IQ应答. 该应答必须保留请求中的'id'属性(或为空,如果生成的节没有包含'id'属性).
4. 接收到类型为"result"或"error"节的实体不能(MUST NOT)发送更多的类型为"result"或"error"的IQ应答来应答; 然而, 请求实体可以发送另一个请求(例如, 一个类型为"set"的IQ对之前在get/result对中查询到的信息提供特定的信息).
5. 类型为"get"或"set"的IQ节必须严格地包含一个子元素, 它定义特定请求的语义.
6. 类型为"result"的IQ节必须包含零或一个子元素.
7. 类型为"error"的IQ节可以包含相关的"get"或"set"子元素并且必须包含一个<error/>子元素; 详见8.3.

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学习——2、登陆的例子 截取的协议传输过程图。

 

以上内容均参考自wiki百科:xmpp中文翻译计划

时间: 2024-10-29 06:05:50

XMPP学习——3、XMPP协议学习补充的相关文章

我以前没接触过计算机网络,想学习TCP/IP协议,需要先看《计算机网络》这本数吗

问题描述 可以直接看<TCP/IP协议详解>卷一吗?是不是在看卷一前要了解下Lunx编程呢?请大家指点下 解决方案 解决方案二:没有5年编程经验,也没有正规学习过软件专业,最好不要学这个.不需要学习任何linux,学习windows即可.解决方案三:建议还是看下计算机网络,你需要首先有个大致的概念.好比学习初等代数,你应该去看数学教科书,而不是看数学手册.如果i你根本没有电子/计算机科学的基础,最好先看看通讯原理.编码,这些都是计算机网络的基础.解决方案四:该回复于2014-09-12 23:

Http协议学习总结(转)

  因为项目中很多地方都与Http协议有关,零散的了解了一下Http协议,但是没有系统的学习过.   今天根据网上其他同学的整理,加上我的一些经验,我也整理了一份.当做学习记录吧.        一.什么是HTTP协议   HTTP,全名HyperText Transfer Protocol.因特网上应用最为广泛的一种网络协议.设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法.现在对与HTTP协议的应用已经很多了,浏览器上网,下载文件,服务器间通信等.   二.HTTP协议格式

苹果ANCS协议学习【转】

  苹果ANCS协议学习 转自:http://www.cnblogs.com/alexcai/p/4321514.html 综述 苹果通知中心(Apple Notification Center Service, ANCS)的目的是提供给蓝牙外设一种简单.方便的获取ios设备通知信息的方式.   依赖 ANCS的使用没有依赖,它是GATT的一个子集,任何一个实现了GATT client的设备可以方便的从ios设备获取通知信息.   传输注意事项 如果没有特殊说明,通过ANCS传输的数值均使用小端

【双11背后的技术】基于深度强化学习与自适应在线学习的搜索和推荐算法研究

选自<不一样的技术创新--阿里巴巴2016双11背后的技术>,全书目录:https://yq.aliyun.com/articles/68637 本文作者:灵培.霹雳.哲予 1. 搜索算法研究与实践 1.1 背景 淘宝的搜索引擎涉及对上亿商品的毫秒级处理响应,而淘宝的用户不仅数量巨大,其行为特点以及对商品的偏好也具有丰富性和多样性.因此,要让搜索引擎对不同特点的用户作出针对性的排序,并以此带动搜索引导的成交提升,是一个极具挑战性的问题.传统的Learning to Rank(LTR)方法主要是

『干货』深度强化学习与自适应在线学习的阿里实践

1搜索算法研究与实践 1.1背景 淘宝的搜索引擎涉及对上亿商品的毫秒级处理响应,而淘宝的用户不仅数量巨大,其行为特点以及对商品的偏好也具有丰富性和多样性.因此,要让搜索引擎对不同特点的用户作出针对性的排序,并以此带动搜索引导的成交提升,是一个极具挑战性的问题.传统的Learning to Rank(LTR)方法主要是在商品维度进行学习,根据商品的点击.成交数据构造学习样本,回归出排序权重.LTR学习的是当前线上已经展示出来商品排序的现象,对已出现的结果集合最好的排序效果,受到了本身排序策略的影响

(zhuan) 深度学习全网最全学习资料汇总之模型介绍篇

  This blog from : http://weibo.com/ttarticle/p/show?id=2309351000224077630868614681&u=5070353058&m=4077873754872790&cu=5070353058   深度学习全网最全学习资料汇总之模型介绍篇 雷锋网  作者: 三川 2017-02-21 16:38:00 查看源网址 阅读数:4       本文旨在加速深度学习新手入门,介绍 CNN.DBN.RNN.RNTN.自动编码

怎样找到一份深度学习的工作 | 附学习材料,资源与建议

如果你是一个软件工程师(或者你现在正在学习这一方面),你肯定有机会听说过深度学习(有时候深度学习缩写为"DL").它现在是一个热门.且快速发展的研究领域,解决工业界的一系列问题,从图像识别.手写识别到机器翻译,更甚于AlphaGo4比1击败了世界围棋冠军.  大部分人认为找与深度学习相关的工作应该具有博士学位或者大量的相关经验,但是如果你已经是一名很好的工程师,那你就可以很快.很好的学习这些必要的技能和技巧.至少,这是我们的观点.(即使你是深度学习的初学者,非常欢迎您加入我们的职位申请

《中国人工智能学会通讯》——7.13 深度学习与分布式表示学习概览

7.13 深度学习与分布式表示学习概览 深度学习的概念源于人工神经网络的研究.深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的有效表示,而这种使用相对较短.稠密的向量表示叫做分布式特征表示(也可以称为嵌入式表示).本部分主要对于目前使用较广的一些学习算法进行一个简单的回顾. 首先介绍一些浅层的分布式表示模型.目前在文本领域,浅层分布式表示模型得到了广泛的使用,例如 word2vec.GloVec 等[6] .与传统词袋模型对比,词嵌入模型可以将词或者其他信息单元(例如短

(转) 深度学习全网最全学习资料汇总之入门篇

  本文转自: http://www.dlworld.cn/ZiLiaoXiaZai/3428.html 深度学习全网最全学习资料汇总之入门篇  作为人工智能领域一个重要的研究分支,深度学习技术几乎出现在当下所有热门的AI应用领域,包括语音识别,语义理解,图像识别,大数据分析等等,甚至有人把当前的人工智能等同于深度学习.面对如此重要的江湖地位,我们相信一定有为数众多的 AI 开发者对深度学习技术充满了好奇心,想要快速着手使用这项强大的技术来解决现实生活中的实际问题.因此,雷锋网将围绕深度学习技术

强化学习之 免模型学习(model-free based learning)

  强化学习之 免模型学习(model-free based learning) ------ 蒙特卡罗强化学习 与 时序查分学习   ------ 部分节选自周志华老师的教材<机器学习> 由于现实世界当中,很难获得环境的转移概率,奖赏函数等等,甚至很难知道有多少个状态.倘若学习算法是不依赖于环境建模,则称为"免模型学习(model-free learning)",这比有模型学习要难得多.   1. 蒙特卡罗强化学习: 在免模型学习的情况下,策略迭代算法会遇到几个问题: 首