`
iluoxuan
  • 浏览: 575054 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

XEP-0206: XMPP Over BOSH

 
阅读更多




XEP-0206: XMPP Over BOSH

 

 

 

转载:http://hi.baidu.com/zqhhshs/item/fdb2f5b8257784a1eaba9331

 

摘要:本规范定义了如何采用BOSH技术传输XMPP数据节。在设备或客户端不能为XMPP服务器维持长久的TCP连接的情况下,我们使用HTTP绑定来协助XMPP通信。

1.介绍

BOSH协议定义了如何能够有效并可靠地通过HTTP在客户端和服务器之间双向传输任意XML元素。本文档定义了一些BOSH的小扩展来将XMPP流绑定到HTTP上。

2.<body/>元素

如果BOSH的<body/>元素不为空,它应该包含以下内容之一:

* 一个完整的<stream:features/> 元素 (此时BOSH <body/> 元素一定要包含命名空间 xmlns:stream='http://etherx.jabber.org/streams')。

* 一个用于通过SASL验证的完整元素,并且要由'urn:ietf:params:xml:ns:xmpp-sasl'命名空间认定。

* 一个或者多个完整的<message/>, <presence/>, 和/或者 <iq/> 元素,由'jabber:client'命名空间认定。

* 一个<stream:error/>元素(在这种情况下, BOSH <body/>元素一定要包含命名空间 xmlns:stream='http://etherx.jabber.org/streams' 并且它一定要着重说明'remote-stream-error' 终端错误的条件),在它之前可以有0个或多个完整的<message/>, <presence/>, 和/或者 <iq/> 元素,由'jabber:client'命名空间认定。

注 意:许多BOSH客户端和连接管理器现有的特殊XMPP实现没有指定<message/>,<presence/>,或 者<iq/>元素的命名空间,因为它允许它们传输不经修改的数据节(XMPP <stream:stream/> 元素和TCP一起代表性地设置了默认的命名空间'jabber:client')。作为替代,它们只是简单地假定'jabber:client'命名空间 的所有内容都是'http://jabber.org/protocol/httpbind'命名空间的子集。

注意:可以包含TLS验证元素,但是并不推荐。有关TLS如何通过BOSH来实施的内容目前已经超过了本文档的范围。作为替代,通道加密应该在HTTP传输层完成,而不是在XMPP应用层。

3.会话创建请求

客 户端应该在会话创建请求中包含由'urn:xmpp:xbosh'命名空间认定的'version'属性。这个属性相当于定义在RFC 3920文档中XMPP <stream:stream/>元素的'version'属性。连接管理器应该相应地将其值传给XMPP服务器。

例1 使用version属性请求会话

POST /webclient HTTP/1.1
Host: httpcm.jabber.org
Accept-Encoding: gzip, deflate
Content-Type: text/xml; charset=utf-8
Content-Length: 104

<body content='text/xml; charset=utf-8'
      hold='1'
      rid='1573741820'
      to='jabber.org'
      route='xmpp:jabber.org:9999'
      secure='true'
      wait='60'
      xml:lang='en'
      xmpp:version='1.0'
      xmlns='http://jabber.org/protocol/httpbind'
      xmlns:xmpp='urn:xmpp:xbosh'/>注意:与Jabber HTTP Polling中的定义的协议不同,一个开放的<stream:stream>标签并没有发送给连接管理器(因为BOSH <body/>元素一定不能包含部分XML元素)。连接管理器负责管理任何在它和XMPP服务器之间的数据流(它超越了本文档的范围)。

4.会话创建响应

连接管理器一旦收到服务器的数据,应该在它的会话创建响应或是任何后继响应中包含一个'version'属性(由'urn:xmpp:xbosh'命名空 间认定)和一个<stream:features/>元素(由'http://etherx.jabber.org/streams'命名空 间认定)。

注意:同样的程序也应用于BOSH <body/>元素中过时的特殊XMPP 'authid'属性,它包含了由XMPP服务器产生的XMPP流ID的值。这个值只在旧系统的XMPP客户端使用过时的非SASL认证协议完成摘要认证 时使用。

例2 具有流特征的会话创建响应 HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 674

<body wait='60'
      inactivity='30'
      polling='5'
      requests='2'
      hold='1'
      accept='deflate,gzip'
      sid='SomeSID'
      secure='true'
      charsets='ISO_8859-1 ISO-2022-JP'
      xmpp:version='1.0'
      authid='ServerStreamID'
      xmlns='http://jabber.org/protocol/httpbind'
      xmlns:xmpp='urn:xmpp:xbosh'
      xmlns:stream='http://etherx.jabber.org/streams'>
  <stream:features>
    <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
      <mechanism>DIGEST-MD5</mechanism>
      <mechanism>PLAIN</mechanism>
    </mechanisms>
  </stream:features>
</body>
如果在连接管理器的会话创建响应中没有<stream:features/>元素,客户端应该发送空的请求元素,直到它收到含有<stream:features/>元素的响应为止。

例3 具有流特征的后继响应
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 483

<body xmpp:version='1.0'
      authid='ServerStreamID'
      xmlns='http://jabber.org/protocol/httpbind'
      xmlns:xmpp='urn:xmpp:xbosh'
      xmlns:stream='http://etherx.jabber.org/streams'>
  <stream:features>
    <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
      <mechanism>DIGEST-MD5</mechanism>
      <mechanism>PLAIN</mechanism>
    </mechanisms>
  </stream:features>
</body>
注意:客户端应该忽略任何传输层安全(TLS)特性,因为BOSH的通道加密应该在HTTP层讨论。

不推荐TLS压缩(在RFC 3920中定义)和流压缩(在流压缩中定义[7]),因为压缩应该使用BOSH会话创建响应中的'accept'属性在HTTP层协商。TLS压缩和流压 缩不应该在HTTP内容编码的同时使用。

注意:当添加新数据流到会话中时,由'urn:xmpp:xbosh'命名空间认定的'version'属性也应该包含在请求和响应中。

5. 认证,源绑定和即时通讯会话的建立

以下是成功的使用XMPP协议进行认证和源绑定的实例。需要这些协议的细节说明(包括错误实例),请参考RFC 3920。

例4 SASL认证步骤1

POST /webclient HTTP/1.1
Host: httpcm.jabber.org
Accept-Encoding: gzip, deflate
Content-Type: text/xml; charset=utf-8
Content-Length: 172

<body rid='1573741821'
sid='SomeSID'
xmlns='http://jabber.org/protocol/httpbind'>
<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='DIGEST-MD5'/>
</body> 


例5 SASL认证步骤2

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 250

<body xmlns='http://jabber.org/protocol/httpbind'>
<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
cmVhbG09InNvbWVyZWFsbSIsbm9uY2U9Ik9BNk1HOXRFUUdtMmhoIixxb3A9
ImF1dGgiLGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNzCg==
</challenge>
</body> 


例6 SASL认证步骤3

POST /webclient HTTP/1.1
Host: httpcm.jabber.org
Accept-Encoding: gzip, deflate
Content-Type: text/xml; charset=utf-8
Content-Length: 418

<body rid='1573741822'
sid='SomeSID'
xmlns='http://jabber.org/protocol/httpbind'>
<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
dXNlcm5hbWU9InNvbWVub2RlIixyZWFsbT0ic29tZXJlYWxtIixub25jZT0i
T0E2TUc5dEVRR20yaGgiLGNub25jZT0iT0E2TUhYaDZWcVRyUmsiLG5jPTAw
MDAwMDAxLHFvcD1hdXRoLGRpZ2VzdC11cmk9InhtcHAvZXhhbXBsZS5jb20i
LHJlc3BvbnNlPWQzODhkYWQ5MGQ0YmJkNzYwYTE1MjMyMWYyMTQzYWY3LGNo
YXJzZXQ9dXRmLTgK
</response>
</body>


例7 SASL认证步骤4

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 190

<body xmlns='http://jabber.org/protocol/httpbind'>
<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
cnNwYXV0aD1lYTQwZjYwMzM1YzQyN2I1NTI3Yjg0ZGJhYmNkZmZmZAo=
</challenge>
</body> 


例8 SASL认证步骤5

POST /webclient HTTP/1.1
Host: httpcm.jabber.org
Accept-Encoding: gzip, deflate
Content-Type: text/xml; charset=utf-8
Content-Length: 152

<body rid='1573741823'
sid='SomeSID'
xmlns='http://jabber.org/protocol/httpbind'>
<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
</body>


例9 SASL认证步骤6

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 121

<body xmlns='http://jabber.org/protocol/httpbind'>
<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
</body>

在收到元素以后,客户端一定还要让连接管理器通过发送“重新开始请求”来重新发送数据流,“重新开始请求”的结构如下:

* BOSH <body/> 元素一定要包含布尔型的'restart'属性,(由'urn:xmpp:xbosh'命名空间认定) 其值为真。
* BOSH <body/> 元素应该包含'to'属性。
* BOSH <body/> 元素应该包含'xml:lang'属性。
* BOSH <body/> 元素应该为空 (比如不能包含XML数据节)。然而,如果客户端在body中包含了XML数据节,连接管理器应该忽略它。

下面的例子说明了重新开始请求的格式。

例10 重新开始请求

POST /webclient HTTP/1.1
Content-Type: text/xml; charset=utf-8
Content-Length: 240

<body rid='1573741824'
sid='SomeSID'
to='jabber.org'
xml:lang='en'
xmpp:restart='true'
xmlns='http://jabber.org/protocol/httpbind'
xmlns:xmpp='urn:xmpp:xbosh'/> 

在收到一个重新开始请求后,连接管理器一定要考虑之前由即将关闭的XMPP服务器发送的数据流。之后它一定要在同样的TCP连接上发送一个开放的<stream:stream>标签到XMPP服务器来初始化一个新的数据流。如果连接管理器收到一个来自XMPP服务器的<stream:features/>元素,它一定要将这个元素发送到客户端:

例11 重新发送请求的

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 221

<body xmlns='http://jabber.org/protocol/httpbind'
xmlns:stream='http://etherx.jabber.org/streams'>
<stream:features>
<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/>
</stream:features>
</body> 

客户端之后能完成任何强制的或随意的数据流特性协商。

例12 源绑定请求

POST /webclient HTTP/1.1
Content-Type: text/xml; charset=utf-8
Content-Length: 240

<body rid='1573741825'
sid='SomeSID'
xmlns='http://jabber.org/protocol/httpbind'>
<iq id='bind_1'
type='set'
xmlns='jabber:client'>
<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>
<resource>httpclient</resource>
</bind>
</iq>
</body> 


例13 源绑定结果

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 221

<body xmlns='http://jabber.org/protocol/httpbind'>
<iq id='bind_1'
type='result'
xmlns='jabber:client'>
<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>
<jid>stpeter@jabber.org/httpclient</jid>
</bind>
</iq>
</body> 

6. 远程数据流错误

<body/>元素的内容是来自XMPP服务器的0个或多个数据节,伴随着一个<stream:error/>元素(由'http://etherx.jabber.org/streams'命名空间认定)复本:

例14 远程错误HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 68

<body condition='remote-stream-error'
      type='terminate'
      xmlns='http://jabber.org/protocol/httpbind'
      xmlns:stream='http://etherx.jabber.org/streams'>
  <message from='contact@example.com'
           to='user@example.com'
           xmlns='jabber:client'>
    <body>I said "Hi!"</body>
  </message>
  <stream:error>
    <xml-not-well-formed xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
    <text xmlns='urn:ietf:params:xml:ns:xmpp-streams'
          xml:lang='en'>
      Some special application diagnostic information!
    </text>
    <escape-your-data xmlns='application-ns'/>
  </stream:error>
</body>7. 接收者不存在或断线

即使客户端的连接不存在了,连接管理器也有可能收到要发送给客户端的数据节(例如,在连接管理器通知XMPP服务器客户端的连接已断之前)。在这种情况下,连接管理器会向XMPP服务器返回一个错误信息,我们建议连接管理器进行以下操作,因为它与RFC 3921文档第11部分的第2点中的情况类似:

  1. 如果被传递的数据节是<presence/>,悄悄地抛弃这个数据节并且不向发送者返回错误信息。
  2. 如果被传递的数据节是 <iq/>,向发送者返回一个 <service-unavailable/>错误。
  3. 如果被传递的数据节是 <message/>,向发送者返回一个<recipient-unavailable/>错误。

当XMPP服务器收到来自连接管理器的包含<recipient-unavailable/>错误的<message/>数据节时,它应该将这个消息保存起来,以备日后支持线下存储 (参见 Best Practices for Handling Offline Messages [11])时的信息传递,否则应将这个错误数据节返回给发送者。

分享到:
评论

相关推荐

    XEP-0384:libpurple的OMEMO加密。.zip

    标题 "XEP-0384:libpurple的OMEMO加密" 指涉的是一个与即时通讯安全相关的技术标准,XEP(eXtended Protocol)是XMPP(Extensible Messaging and Presence Protocol)扩展协议的缩写。XEP-0384是其中的一个特定规范...

    XEP-0035: SSL/TLS Integration.pdf

    《XEP-0035: SSL/TLS Integration》是XMPP(Extensible Messaging and Presence Protocol)标准框架下关于SSL/TLS整合的一份文档。该文档由Robert Norris撰写,并于2003年11月5日发布,但随后在同一天被撤销,因为其...

    XMPP-XEP扩展协议

    7. **XEP-0363:HTTP over XMPP**:允许通过XMPP网络传输HTTP内容,比如文件下载。 8. **XEP-0352:客户端证书认证**:增强了安全性的认证方式,使用客户端证书进行身份验证。 每个XEP文档都详细描述了扩展协议的...

    db-smiles-xmpp:自动从code.google.compdb-smiles-xmpp导出

    Xabber-适用于Android的XMPP客户端开源...0138:流压缩XEP-0203:延迟交货XEP-0091:旧版延迟交付XEP-0199:XMPP Ping XEP-0147:XMPP URI方案查询组件XEP-0085:聊天状态通知XEP-0184:邮件传递收据XEP-0155:节会话协

    Tigase 概述

    * XEP-0045:群聊消息,类似互联网的中继聊天(IRC)协议,允许多人在一个虚拟的房间内聊天。 * XEP-0049:私人 XML 存储,定义了私人数据如何在服务端存储。 * XEP-0050:工作流管理,提供实体向另一个实体执行远程...

    xmpp-web:Web的现代XMPP客户端

    XEP-0054:电子名片 XEP-0153:基于vCard的头像 XEP-0085:聊天状态通知 XEP-0280:消息碳 XEP-0092:软件版本 XEP-0012:最后活动 XEP-0333:聊天标记 XEP-0184:邮件传递收据 路线图 追踪最近使用过的贴纸 管理...

    XMPP 常用XEP协议

    10. 跨协议兼容:XEP-0199(XMPP Ping)和其他一些XEP还允许XMPP与非XMPP系统进行交互,增强了与其他通信协议的兼容性。 以上只是部分XMPP常用的XEP协议,实际中还有许多其他协议用于扩展XMPP的功能,如地理位置...

    jabber-http-file-upload:对Emacs jabber.el的HTTP文件上传(XEP-0363)支持

    XEP-0363,即HTTP文件上传扩展,允许Jabber/XMPP用户通过HTTP上传和分享文件,而不是直接通过IM服务器传递大文件,从而减轻服务器负担并提高传输效率。 本文将深入探讨`jabber-http-file-upload`项目,它为Emacs ...

    xampp_stone_dup:xmpp石头包更新

    支持的文件: RFC6120 :可扩展消息和状态协议(XMPP):核心RFC6121 :可扩展消息和状态协议(XMPP):即时消息和状态XEP-0198 :流管理XEP-0085 :聊天状态通知XEP-0318 :客户端启动的状态探针的最佳实践XEP-...

    php-component:PHP 中的 XMPP 组件 (XEP-0114) 框架

    PHP-Component 是 XEP-0114 和相关 XEP 的 PHP 语言实现,专门为 Lopbox ( ) 项目编写。 它旨在非常易于使用并让 PHP 程序员开发各种类型的服务:Jabber / XMPP 机器人、传输、MUC 引擎和许多其他类型的组件。 将 ...

    XEP-Jingle协议文档

    XEP-Jingle协议是XMPP(Extensible Messaging and Presence Protocol)扩展协议中的一部分,用于实现实时多媒体通信,如音频、视频通话以及文件共享等。它为XMPP用户提供了一种标准化的方式来建立、管理和终止多媒体...

    XMPP研究.zip

    - **XEP-0199:XMPP Ping** - 提供心跳检测,保持连接活跃。 - **XEP-0163:个人事件通知(PEP)** - 实现用户分享状态、兴趣、位置等个人信息。 - **XEP-0060:发布订阅** - 允许用户发布和订阅事件。 - **XEP-0133...

    tigase开发指南.pdf

    * message-archive-xep-0136:消息归档 * jabber:iq:auth:简单用户认证 * urn:ietf:params:xml:ns:xmpp-sasl:SASL协商 * urn:ietf:params:xml:ns:xmpp-bind:资源绑定 * urn:ietf:params:xml:ns:xmpp-sessions:...

    XEP-0035 SSL TLS Integration.zip

    XEP-0035是Extensible Messaging and Presence Protocol (XMPP)扩展协议之一,它关注的是如何在XMPP服务器之间以及客户端与服务器之间实现安全的SSL/TLS(Secure Sockets Layer/Transport Layer Security)整合。...

    openfire-gojara-plugin:实施XEP-0321-远程名册管理

    XEP-0321是这个家族中的一项标准,目的是允许用户在不同XMPP服务器之间共享和管理他们的联系人列表,或者名册。 Openfire是一款开源、基于Java的即时通讯服务器,它使用XMPP协议来提供实时通信服务。Gojara插件是为...

    xmpp-master_xmpp_

    8. **扩展功能**:XMPP协议允许通过XEP(XMPP Extension Protocols)进行扩展。这个库可能包含了对某些常见XEP的支持,比如文件传输、私聊、群组管理等。 9. **错误处理和调试**:为了方便开发者,库应该提供良好的...

    oshiya:XEP-0357兼容的XMPP组件

    这允许XEP-0357兼容的客户端在ejabberd服务器上使用mod_push的内部应用服务器,或者在运行Oshiya的任何XEP-0114兼容的服务器上使用。 Oshiya是GSoC 2015项目的一部分。 请发送反馈。 ##功能Oshiya将支持以下推送...

    Smack类库详细说明文档

    - XEP-0065:SOCKS5 Bytestreams,提供了一种通过中间代理进行数据传输的方法。 - RFC-3920:XMPP 核心,定义了 XMPP 的基本框架和数据格式。 - RFC-3921:XMPP 实时通信,详细描述了用户间的实时消息传递机制。 ...

    xep-0045.pdf

    xmpp 扩展协议 xep-0045 中文pdf文档,聊天室协议中文文档

    xabber:这是用于本地局域网的短信通知

    XEP-0128:服务发现扩展 XEP-0115:实体功能 XEP-0054:vcard-temp XEP-0153:基于vCard的头像 XEP-0045:多用户聊天(不完全) XEP-0078:非SASL身份验证 XEP-0138:流压缩 XEP-0203:延迟交货 XEP

Global site tag (gtag.js) - Google Analytics