XMPP之Stream节点属性

版权所有,转载请注明出处:http://guangboo.org/2013/03/06/xmpp-stream-attributes

前面的文章介绍了XMPP通讯的过程,包括流的打开和关闭,特性协商,消息交换等,并在最后简单说明了stream节点的属性,由于stream节点是在XMPP通讯中初始化的节点,也是第一个发送出去的XML节点,因此我们这里以Stream节点为例,介绍一下该节点下的主要属性,当然其他如message,presence,iq等节点有很多与之不同的属性,但通过介绍stream的属性可以让我们对个节点属性的作用等有个初步印象,之后在介绍各节点时会具体介绍其属性。

from

from属性在xmpp节点传输过程中,一般表示消息的发起者,或消息来源。当stream初始化发送在客户端和服务端之间时,from则表示客户端xmpp的标识,即是客户端的身份或ID,这里是用JID来表示,格式类似于email地址<locapart@domainpart>,用于表示客户端的身份,如zhangsan@example.net。此外,如果客户端认为其身份属于隐私的话,也可以不用传递from属性,当然也可以将初始化流在TLS或其它安全性较高的信道中传输。当然包含from属性,采用安全信道传输,是我们推荐的。常见的客户端与服务端的初始化流,如下:

 <?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'>

当初始化流发生在服务端与服务端的通讯时,from属性则表示服务端的域身份,也同样是JID的形式<domainpart>,如example.net。这时的from属性不能省略,因为服务端在XMPP网络中是“公共实体”,并且服务端之间的通讯也要在TLS或其它安全层中通讯才能保证信息的安全性。常见的服务端间通讯的初始化XML流,如下:

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

初始化时的反馈stream流都要包含from属性,无论是服务端向客户端的反馈,还是服务端向服务端的反馈。并且to属性的值必须是请求时的jid,from属性必须是请求时的to属性值。常见的反馈初始化XML流,如下:

 <?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'>

另外,无论是否包含from属性,在发送stream初始化化节点时,都要使用SASL进行身份进行验证,已避免没有验证的攻击者欺骗用户,盗取数据等行为。

to

to属性在Stream节点中表示消息的目的地,或消息的接收方。无论是客户端与服务端之间的初始化通讯,还是服务端与服务端,to属性都使必须的。都是使用JID的域部分表示,如example.net,example.com。实例XML,如下:

 <?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'>

对于反馈stream流,发送在客户端与服务端时,如果客户端发送初始化流时包含了from属性,那么在反馈stream流中,就必须包含to属性,并且to属性的值必须是请求初始化流的from属性值。否则,反馈的stream流中可能不会包含to属性。如下示例:

 <?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流发送在服务端与服务端之间时,反馈stream流必须包含to属性,并且属性值必须是请求初始化流的from属性值。如下示例:

 <?xml version='1.0'?>
   <stream:stream
       from='im.example.com'
       id='g4qSvGvBxJ+xeAd7QKezOQJFFlw='
       to='example.net'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:server'
       xmlns:stream='http://etherx.jabber.org/streams'>

同样的,无论to属性是否包含,在发送stream初始化化节点时,都要使用SASL进行身份进行验证,已避免没有验证的攻击者欺骗用户,盗取数据等行为。

id

id在stream流节点中用于表示流的身份唯一性,也可以称为stream id。它由接收方(一般是服务端)生成,并在接收方应用程序中保证其唯一性。另外,id必须是不可预见的,并且不可重复。当验证机制重复使用这个id时,就会有安全威胁,这就是在之前RFC3020中的Server Dialback【见XEP-0220】和XMPP 0.9的SASL验证机制的情况一下。因此建议随机生成id是明智的。

但在请求初始化XML流中一定不能包含id属性。当如果包含了,接收方也必须忽略它。如下示例:

 <?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'>

xml:lang

xml:lang属性用来说明流中文字数据的首先语言或默认语言。格式必须遵循rfc5646。该属性不是必须的,但你应该包含该属性,如下示例:

 <?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'>

然而,接收端发出的反馈初始化流节点中一定要包含xml:lang属性,需遵循如下规则:

  • 如果请求初始化包含xml:lang属性,并且接收端又支持该属性所表示的语言,那么反馈流中的xml:lang属性的值必须赋值为请求方的首选语言(如de-CH)。
  • 如果接收方不支持请求方的首先语言,但支持通过“匹配”(http://tools.ietf.org/html/rfc4647)请求方的首先语言而得到的语言,那么反馈流中的xml:lang属性应该标记为匹配后的语言,如请求方的xml:lang属性为de,那么接收方可以匹配到的语言是de-CH,那么de-CH将做为反馈流中xml:lang属性值。
  • 如果接收方不支持请求方的首先语言,也不在支持“匹配”的语言,或者请求方根本不包含xml:lang属性。那么反馈流中的xml:lang属性值必须赋值为接收方的默认语言。如“en”。如:
     <?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'>

如果请求方包含xml:lang属性,那么接收端应该保存其值,并做为当前流中所有交换的xml节点的默认语言。当然其他节点,如presence,message等也可以包含xml:lang属性,如果不包含的话,就默认使用初始化时使用的语言,不论接收端是否支持。如果请求端发送的任何节点中都包含xml:lang属性,那么接收端一定不能修改或删除该属性,无论是将节点路由到远程服务器或传输给客户端。

version

version的值最低是1.0,这是TLS协商,SASL协商,流特性,流错误等受支持的最低版本。最新的XMPP规范(RFC6120)是基于XMPP1.0的,并且xmpp 1.0描述了流相关的协议,如基本的三个xml节的语法(<message />, <presence />, <iq />)。

这里的版本与我们见到的软件版本号是一致的,只是这里的版本只有两部分组成,形式为<major>.<minor>。主版本号major已被在stream或其它节,如message, presence,iq等的格式或行为发生变化时,才会往上增长;次版本一般在核心协议添加重要功能时(如message, presence, iq等节点的type属性添加新值时)。版本的生成和处理遵循以下规则:

  1. 请求方必须设置初始化流中的version属性,并且其值必须是其支持的最高版本号(如果它支持最新规范,那么版本必须是1.0)。
  2. 接收方也必须在反馈流中设置version属性,并且其值必须是请求方支持的版本或者是其支持的最高版本号,即使版本较低。接收方必须按版本的数字进行比较,而不是按版本的字符串形式“<major>.<minor>”进行比较。
  3. 如果反馈流中包含的version版本的至少主版本号比请求方初始化流中的版本小,并且拥有较新的版本的实体无法与较老版本的实体进行交互时,该流应该被关闭,并在发送<unsupported-version />错误。如客户端发送初始化流,version版本为11.0,那么反馈流所支持的版本是1.0,不支持11.0的版本,因此反馈流中包括<unsupported-version />错误节点,并关闭流。
    C: <?xml version='1.0'?>
       <stream:stream
           from='juliet@im.example.com'
           to='im.example.com'
           version='11.0'
           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:error>
         <unsupported-version
             xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
       </stream:error>
       </stream:stream>
  4. 如果任何实体接收到的流中都没有version属性,实体必须考虑使用“0.9”作为版本,这样才能让其他实体支持,而不应该在反馈流中不包含version属性。

属性摘要

如下表格,表示了stream流主要属性的基本说明:

 请求-接收接收-请求
to接收者JID请求者JID
from请求者JID接收者JID
id忽略身份标识
xml:lang默认语言默认语言
version支持XMPP 1.0+支持XMPP 1.0+

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值