sip中的subscribe和notify扩展应用技术 会话发起协议研究工作组提出3种协议功能扩展方式:方法扩展、头部扩展和消息体扩展。文章深入探讨了包含这3种扩展方法的事件通告机制,给出了基于这一机制的自动回叫业务实例,并讨论了该机制的安全性。 摘要:会话启动协议研究工作组提出3种协议功能扩展方式:方法扩展、头部扩展和消息体 扩展。文章深入探讨了包含这3种扩展方法的事件通告机制,给出了基于这一机制的自动回 叫业务实例,并讨论了该机制的安全性。 value-added service 自1999年至今,会话启动协议基础协议已从最初的RFC 2543发展到了现在的RFC 3261, 协议内容得到了很大的扩充,其描述的信令框架也更加完善。随着会话启动协议被第3代移动 通信合作计划和微软公司正式采用,人们已不再满足于使用会话启动协议完成基本的呼叫控制 ,更多的是关注如何利用会话启动协议灵活实现增值业务。在此背景下,会话启动协议研究工 作组提出了3种会话启动协议功能扩展方式:消息(方法)扩展、头部扩展和消息体扩展。本文 讨论的异步请求事件通告机制就是由上述3种扩展方式构成的,可以应用于如自动回叫、在席 、代答等多种富有市场前景的增值业务,是有代表性的会话启动协议功能扩展技术,体现了会 话启动协议实现增值业务的基本思路和方法。 当那些被订阅的资源的状态发生改变时,负责这一资源的网络实体将向订阅者发送通告 ,通报当前资源状态的变化情况。 ,提出了基于会话启动协议的事件通告机制规范:RFC 3265[1]。 在规范中定义了两个扩展方法 :订阅(SUBSCRIBE)和通告(NOTIFY)。SUBSCRIBE方法用于发起订阅请求,NOTIFY方法用于通告 当前资源状态。 阅者订阅的资源信息。订阅者典型的动作是向通告者发送SUBSCRIBE消息以请求创建一次订阅 关系。 态。通告者典型的动作是接收SUBSCRIBE消息并创建相应的订阅关系。 在于通告者中。 定义,对应具体业务可定义相应的事件包类型,例如:在席事件包、对话事件包等,这些事 件包可使用不同的语法并具有各自的语义。这种框架赋予会话启动协议事件通告机制极大的生 命力和灵活性,有助于快速提供新的业务。 对话。当订阅者想得到网络中某一资源的状态时,便向负责这一资源的会话启动协议实体发 起SUBSCRIBE请求,如图1中的F1所示。SUBSCRIBE消息中的请求统一资源标识符 (Request-URI)就是所要请求的资源的统一资源标识符(URI),这一URI同时还为会话启动协 议代理服务器路由请求提供线索。SUBSCRIBE请求中必须包含一个扩展的Event头部,其中 注明要订阅的事件类型,即事件包标记,如,dialog(用于代答业务)、refer(用于呼叫转交) 等。还可包含扩展的Allowed-Event头部,指示本节点能够支持的事件包类型。如果在一个对 话中有多次订阅,则如图2所示,在Event头部还要增设标识参数id予以区分。 消息中应包含expires头部,这一头部值表明订阅者期望的有效订阅时长。为了延长某一订阅 的时间,订阅者可以在有效期内再次发送SUBSCRIBE消息来刷新这一订阅。具体某次订阅的有 效时长,最终是由对SUBSCRIBE请求的2XX响应中的expires头部值或NOTIFY消息中的 Subscription-State头部的expires参数决定的。expires头部值等于0的SUBSCRIBE请求表 示撤消订阅。如果订阅关系能够建立,SUBSCRIBE消息将会触发通告资源状态的NOTIFY消息立 即回送。订阅者想要获得的资源状态信息封装在后继通告消息NOTIFY的消息体中,为了能够正 确地解释这部分信息,订阅者应该向通告者指明自己支持的消息体格式,因此,在SUBSCRIBE 消息中应携带Accept头部,比如:Accept: application/dialog-info+xml,这表明订阅者支 持用可扩展标识语言(XML)描述的对话事件包[5],实际上就是一种通用Internet邮件扩展 (MIME)格式消息体。如果SUBSCRIBE消息中没有携带Accept头部,则通告者根据SUBSCRIBE 消息中Event头部指明的事件包标记选择默认的格式传送资源状态信息。 权给订阅者未确定。 满足:expires 200 OK <= expires SUBSCRIBE,即禁止通告者延长订阅时长。如果返回非2XX 响应,则表示订阅失败,将没有后继的NOTIFY消息。 返回扩展的“489 Bad Event”(错误事件)响应。通告者还会检查消息中的expires头部,如果其 值满足:(0 < expires SUBSCRIBE < 1 hour) && ( 0 < expires SUBSCRIBE < Min 通告者- config),其中,Min通告者- config为通告者最小配置订阅时长,则通告者向 订阅者返回“423 Interval too small”(时间间隔太短)响应,表示提出的订阅时长太短。 此外,通告者还应根据本地策略对提出SUBSCRIBE请求的用户进行鉴权。 消息,向订阅者通告当前订阅资源的状态,如图1中的F3所示。通告者使用SUBSCRIBE消息中 Accept头部明确允许的或者Event头部隐含指明的消息体格式将资源的状态信息或指向该资源 状态的URI封装在消息中。消息也可包含扩展的Allowed-Events头部,指示本节点能够支持的 事件包类型。NOTIFY消息中必须包含扩展的Subscription-State头部,指示创建的订阅的状 态。共有3种订阅状态,分别是: 对应terminated状态,该头部应包含reason参数指示订阅被终止的原因,或者包含 Retry-After参数,指示订阅者过一段时间后重新发起订阅请求。 active或pending,订阅者创建新的订阅或对话,并对NOTIFY请求回送200 OK响应, 如图1中的F4所示。如果匹配失败,则发送“481 Subscription does not exist” (订阅不存在)响应。 订阅者,如图1中的F5和F6所示。 将创建和该对话关联的订阅,而该对话有可能是由INVITE建立起来的。因此,如果订阅终止, 且当前无其他应用状态(如由INVITE请求建立起来的应用状态)和该对话关联,则该对话结束 。如果仍有订阅和该对话关联,虽然其他的应用状态已结束,但该对话并没有结束。换句话说 ,由INVITE创建的对话并不会因为收到或发送了再见请求而结束,因为仍有订阅关系和此对 话相关联。与此类似,当多个订阅和同一对话关联时,必须当与此对话相关联的所有订阅都结 束时,该对话才结束。这一概念非常类似于程序设计里对文件描述符的引用,其中文件描述符 相当于对话,对文件描述符引用的进程相当于建立的订阅关系。 对资源状态的轮询。当订阅处于激活状态时,订阅者在SUBSCRIBE请求的expires头部写入当 前剩下的订阅有效时长的秒数,这样,能够立即触发通告者产生NOTIFY消息,将当前资源的状 态通告给订阅者。需要指出的是,这种对资源的轮询会导致网络、通告者和订阅者负荷的增加。 在如移动通信这样的特定应用中,订阅者一般是数据处理能力较慢、需要额外供电的移动终端 设备,随着事件通告频度的增加和通告事件包的增大,将消耗很多宝贵的带宽资源,造成网络拥 塞和订阅者的过载。因此,订阅者需要对通告者的状态通告频率作出限制[6]。另外,订阅者还 可以在SUBSCRIBE消息中指定一些事件包的过滤规则,使得通告者能够根据这一过滤规则产生 通告事件,而不是任何状态发生变化时都发起通告。 一种隐式的订阅创建,即订阅者不是通过SUBSCRIBE请求来创建订阅。而是通过转交(REFER)方法 [3],一种由RFC 3515定义的用于实现呼叫转交等业务的方法。REFER请求隐式地在被转交用户 处创建订阅,所要观察的资源是转交请求的状态。 件包被封装在NOTIFY消息中通告资源状态,这一机制为实现各种功能强大的业务提供了坚实的 基础。现给出使用这一机制实现的自动回叫业务流程。 地和B建立会话了。这里,A使用事件通告机制来获取B的会话状态。 Here”(现在正忙)响应(F2)。A希望B能够在通话结束后通知他,于是A向B发起SUBSCRIBE 请求(F4),其Event头部指明事件类型为dialog,即订阅B正在进行中的对话状态;Accept头 部指明A支持使用XML语言封装的dialog事件包。SUBSCRIBE的消息片断如下: 通告当前对话状态的NOTIFY消息。当B结束通话时,A订阅的对话资源状态发生了变化,从确 认状态迁移至了终结状态,B的通告者生成NOTIFY消息,向A通告当前B的对话状态(F8)。A 得到这一信息后,立即向B发起INVITE请求,与B建立新的会话。 些信息对于用户来说是敏感的或者是隐私,因此,通告者应能够根据订阅者的身份,选择性地 拒绝某些用户的订阅请求,并使用标准的会话启动协议鉴权机制[2]对用户进行鉴权。订阅请求 的最终决定权应该由用户(自然人)作出。 信息的泄漏。因此,在这些情况下,通告者应总是对SUBSCRIBE请求回送202 Accepted响应。 后继的NOTIFY中可能并不携带真正的资源状态,但从订阅者的角度来看,这并无任何异常。例 如,在“在席”应用中,用户A向用户B发送SUBSCRIBE请求获取用户B是否在席的信息,B在 席,但他拒绝了A的订阅请求,因为B并不想让A知道他正在网上。如果B直接使用4XX或6XX 响应拒绝,则会泄漏B的策略。为此,B可对SUBSCRIBE回送202 Acceptted响应,在随后的 NOTIFY消息的Subscription-State头部指明订阅终结,原因为没有资源,即A想订阅的资源不 存在,其Subscription-State头部为:Subscription-State:terminated; reason=noresource,这样既拒绝订阅请求又不会暴露通告者的策略信息。 拒绝服务(DoS)攻击,在当前的基于会话启动协议的事件通告模型中,一个SUBSCRIBE请求将触 发一个或多个通告资源状态的NOTIFY消息,通告者接收到SUBSCRIBE请求,要创建相应的状态 ,消耗一定的系统资源。有恶意的订阅者会利用这一点发起过多的订阅请求,就有可能使通告者 因创建过多的订阅而资源耗尽。为了减少这种攻击的机会,通告者的实现必须包含鉴权,以过滤 恶意的订阅请求。 Subscription-State 3个扩展头部,并在定义事件包引入必要的扩展消息体,形成了会 话启动协议事件通知机制,基于此机制可以灵活地实现许多新的增值业务。 |