`
songhuagao
  • 浏览: 8955 次
  • 性别: Icon_minigender_1
  • 来自: 香格里拉
最近访客 更多访客>>
社区版块
存档分类
最新评论

RFC 3921:session建立

阅读更多
Session Establishment
许多基于XMMP的IM都实现这么一个client-server构架:要求client来建立一个和server相关的的session用来处理预料中的即时通讯和出席状态。然而,这有很多前提条件:

1.流认证Stream Authentication
在尝试建立session和发送任何xml节之前,client必须完成流认证(Stream Authentication)

2.资源绑定Resource Binding
在完成流认证之后,client必须绑定资源到流上,so that the client's address is of the form <user@domain/resource>, after which the entity is now said to be a "connected resource" in the terminology of [XMPP‑CORE]

如果server支持session,他必须包含一个<session/>元素,这个元素是被'urn:ietf:params:xml:ns:xmpp-session'命名空间限制的。他向client宣告session建立
server向client告知session建立功能

<stream:stream
    xmlns='jabber:client'
    xmlns:stream='http://etherx.jabber.org/streams'
    id='c2s_345'
    from='example.com'
    version='1.0'>
<stream:features>
  <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/>
  <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
</stream:features>

在接到必须建立session的通知(完成资源绑定),如果client期望使用即时通讯和出席功能的话,它就必须建立session。
第一步:client向server请求session
<iq to='example.com'
    type='set'
    id='sess_1'>
  <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
</iq>

第二步:server告知client,session已经被建立
<iq from='example.com'
    type='result'
    id='sess_1'/>

当建立session的时候,一个连接的资源被称之为活跃的资源。
可能会出现多种错误情况。例如,由于用户名或授权身份(authorization identity)没有创建session的许可,或者资源标识符已经有了一个活跃的资源连接, server就可能在创建session时遇到内部的错误。
第二步(alt):server返回错误(内部错误)
<iq from='example.com' type='error' id='sess_1'>
  <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
  <error type='wait'>
    <internal-server-error
        xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
  </error>
</iq>

如果用户或者资源不允许创建资源,server必须返回错误
<iq from='example.com' type='error' id='sess_1'>
  <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
  <error type='auth'>
    <forbidden
        xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
  </error>
</iq>

如果已经存在一个一个活跃的资源连接,server会有两种处理:1)终止连接,创建一个新的连接;2)驳回新连接创建请求,继续维护以前的活跃连接。这两种server都都要实现,但是建议实现第一种情况。
在第一种情况,server应该向活跃的资源连接发送<conflict/>流错误,并终结该活跃资源的XML流和潜在的TCP连接,同时向新请求的session返回一个类型为‘result’的IQ节以表示成功。
在第二种情况,server应该向新请求的连接发送<conflict/>流错误,同时维护以前连接的XML流,以便于新请求的连接有机会在另一个session请求建立发送过来前议定一个不冲突的资源标示符(non-conflicting resource identifier)。
情况一
<stream:error>
  <conflict xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
</stream:error>
</stream:stream>

情况二
<iq from='example.com' type='error' id='sess_1'>
  <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
  <error type='cancel'>
    <conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
  </error>
</iq>


在请求建立后,client应该发送初始的出席信息和请求花名册(roster),虽然这些都是可选的。
Note:在允许创建一个即时通讯和出席的session之前,server也许会要求事先帐户配置(prior account provisioning)。事先帐户配置(prior account provisioning)的方法包括server管理员创建帐户和用'jabber:iq:register'的帐户创建
分享到:
评论
Global site tag (gtag.js) - Google Analytics