SIP 会话_50068

 http://zhendexing.com/jiaru/584.html

SipSession 对象代表点到点的 SIP 牵涉, 无论是作为曾经成立的对话, 或者一个对话切实产生之前的阶段. 可以经过调用一个 SipServletMessage 的 getSession 方法获到 SipSession 对象.

6.2.1 和 SIP 对话的牵涉.

一个 SipSession 既代表一个 RFC3261 中定义的处于其 earyly, confirmed 或者 terminated 状态的切实的 SIP 对话, 也能够代表一个虚伪的对话. 虚伪对话的观念伸展了对话的定义, 有两种定义的含义: RFC3261 中的一个对话产生之前以及在因为收到一个非 2xx 的最后回应而从 early 状态转变尔后. SipSession 接口体现了这个虚伪对话的观念, 正因为这么, 一些 SipSession 实例并不相当于一个 SIP 对话.

容器实行基于对话和事务状态制约上的 SIP 协定. 如何它在一个给定的形势上违法地发送一个音讯, 容器会抛出一个 IllegalStateException 反常.

SIP 对话状态机.

图 6-1 中的"非定义"状态不是一个真实的状态. 对于 INVITE 结局建设的对话, 对话在收到带有 TO tag 的 1xx 或者 2xx 回应后存留.

SipSession 对象处于下面 4 种状态中的一种: INITIAL, EARLY,一位高等软件工程师的概括, CONFIRMED 或许 TERMINATED. 这状态代表了也许和这个 SipSession 关系的 SIP 对话的状态. 在 SipSession 对话中定义的一个新方式准许利用过程能够走访对话的状态. SipSession 的状态不但是仰赖于一个大致的 SIP对话的, 也依靠于 servlet 是否饰演了 UAC, UAS 或者代办的角色. 下面给定的是一个 SipSession 对象的状态管制的规定. 留神对于任何接收 SIP 信息引起的状态的变换, 容器都一定在调用途理收入音信的 SipServlet 的 service 措施之前就转变状态.

1. 对话在一个 SipSession 上创建的请求已接收到或发送了之前, SipSession 的状态定义为 INITIAL.
2. 平常来讲, 在任何时候一个非对话开创和接收恳求, 都不会波及 SipSession 的状态. 同样的对一个非对话的请求的回应也不会波及会话的状态. 除外的是这个规定不实用于终结对话的请求(如 BYE,CANCEL).
3. 假使 Servlet 出演 UAC 的角色并且发送了对话创建请求, 那么这个会话的状态就遵从 SIP 对话的状态机制, 除非在 EARLY 或者 INITIAL 状态收到一个非 2xx 的最终回应会使 SIP 会话的状态回来 INITIAL 状态而不是变成 TERMINATED 状态.
4. 万一 Servlet 饰演一个 UAS 并且收到了一个对话建设恳求, 那么这个会话的状态直接遵从 SIP 对话状态机制. 不像一个 UAC, 一个非 2xx 最后回应直接使会话进去 TERMINATED 状态.
5. 万一这个 Servlet 饰演一个代办...

6. 因为安设 supervised 标志为 false 只影响于目前恳求关系的事务是否会晤到这个回应. 这个记号的值对于 SipSession 状态不曾波及.

SipSession 接口中定义了也许的 SIP 对话的状态的枚举.
public enum SipSession.State {INITIAL, EARLY, CONFIRMED, TERMINATED }

下面的新方法是 SipSession 接口引进的用于归来目前的 SIP 对话状态:
public SipSession.State getState()

这个方法回来一个 SipSession.State enum 值. 这些值代表了当这个方法调用时这个 SipSession 相干的 SIP 对话的状态.

准绳的 SIP 规定在当第二个或后发的响应...


6.2.1.1 废除音讯解决
任何时候一个 servlet 出演一个代理或者 UAS, 收到一个 CANCEL 请求本身不会导致 SIP 会话状态的转变. 不管怎样, 当收到一个 CANCEL请求导致 UAS 批复一个举行中的 INVITE 事务一个非 2xx 回应(487有不同), 这个会话回送给 UAC 一个非 2xx 最后回应的结局, 它的状态平常变为 TERMINATED.

6.2.2 保全 SIP 会话中的对话状态.

UA 在对话中应用 SipSession 的 createRequest 门径开创后续的请求. 这意味着容器务须在应用程序出演一个 UA 时把 SipSessions 和 SIP 对话状态关联起来. RFC3261 中定义的对话由下面的数据形成: 当地/远程的 URI, 本埠/远程的 Tag, 当地/远程的序号, 路由集, 长途对象 URI 以及 secure 标志.

6.2.2.1 当在一个对话中
对于一个应用程序表演一个 UA, SipSession 务必遵从遵照 RFC3261 定义的对话状态. 代理它们自己不能创建新的请求, 因而 SipSession.createRequest 发抛出一个 IllegalStateException 反常. 同样的, 表演 UA 的应用程序创建的请求不可以被转发. 不管怎么说, getCallId, getLocalParty 以及 getRemoteParty 务必完成. getLocalParty 归来主叫的地址(对话的初始请求的 From 头域), getRemoteParty 归来被叫的地址. 这意味着 Call-ID, From 以及 To 务必关联属于任何应用状态的 proxy SIP 会话.

6.2.2.2 当处于 INITIAL SipSession 状态.
当一个 UAC 或许 UAS 事务从 early 状态到 initial 形势, SipSession 中保全的对话形势更新如下:
. 远程宗旨重置为远程 URI
. 长途 Tag 被扫除
. 长途序号被肃清
. 路由集被扫除
. secure 记号被安设为 false.

对于这个规矩的结局, 同样的 SipSession 创建的请求有下面的特点:
. 它们有同样的 Call-ID
. 它们有同样的 From 头域包话同样的非空的 tag
. 同样的 SipSession 创建的请求的 CSeq 会主动地以1递加.
. 所有 initial 状态的 SipSession 创建的请求有同样的 To 头域并且没有 tag 参数.
. Initial 状态的 SipSession 不曾路由集. 远程序号没有定义, secure 标志为 false, 并且远程宗旨 URI 是 To 头域的值.

6.2.3 SipSession 的创建
SIP 对话和 SIP 会话之间最大的不同即使 SIP 请求或许在对话外存留(譬如 OPTIONS 和 REGISTER),南大, 而在 SIP Servlet API 中所有的消息都属于一个 SIP 会话.

SIP 对话是由收到一个或许创建对话的请求的非失利的回应开创的. 大致的 SIP 标准定义了一个这么的措施, 名叫 INVITE. 对话办理因....
这意味着一个独自的要求, 譬如一个 INVITE, 能够被多个 UAS 领受, 这将导致创立多个对话. 在这种情形下,UAC SIP Servlet 会看到多个 SipSessions.

SIP 会话和 SIP 对话之间的牵涉概括如下:

...


何时创建一个 SipSession 的规矩是:
. 当地通过 SipFactoryt.createRequest 创建一个初始的请求属于一个新的 SipSession.
. 抵达的初始要求属于一个新的 SipSession.
. 对一个初始请求的回应不会创建一个对话, 而是属于"原始"请求的 SipSession.
. 成立一个 SIP 对话的第一个信息(譬如,架构师一定写代码, 对一个初始的 INVITE 的 2xx 回应) 和这个"原始"的请求相关所有其余消息属于那个对话.
. 后续的创建一个对话的信息和一个新的从原始的 SipSession 所取得的 SipSessoins 相干,.

当一个正在代办的应用过程收到一个回应关系一个新的 SipSession(也即使说. 因为会有对一个 INVITE 请求有第二个 2xx 回应, 那个回应的 getSession 门径回来一个新的取得的 SipSession. 原始的 SipSession 仍旧可以穿过原始的请求对象可用--它经过 Proxy 接口的 getOriginalRequest 计策可用.

6.2.3.1 伸展创立对话.
扩充大致的 SIP 标准或许定义附带的方法来构建对话. SIP 事件框架是这么的一个铺展. 在事件框架中, 一个初始 SUBSCRIGE 请求的 2xx 回应树立一个会话. 实情上,欧洲“弱国”国债交投惨淡, 一个相称的 NOTIFY 请求在对 SUBSCRIBE 的 2xx 回应抵达之前也将创立一个对话.

在其余 SIP 伸展引荐一个对话建设写在 RFC 3515 SIP REFER.

一个不清楚一个扩充有成立对话能耐的 SIP Servlet 容器务须创建一个新的取得的 SipSession 对象对第二个和后续的对话创建了发送一个独自的请求创建多个对话的才能.

6.2.3.2 衍生的 SipSessions
一个衍生的 SipSession 实质上是原始的央求相干的 SipSession 的复制. 在创立一个新的对话的音讯递送到这个利用的时候建立的. 新的 SipSession 单一的不同是被叫的地址的 tag 参数以及路由集. 这些值衍生于 SIP 标准定义的对话产生音信.

新的 SipSessions 相当于第二个或者后续的 2xx 回应(或者有 tag 参数的 1xx 回应) 经过 SipServletResponse 的 getSession 方法可用. 这个请求的原始的 SipSession 仍旧穿过原始的请求对象可用.

6.2.4 SipSession 性命周期

平常来说, SipSession 的性命周期可以由下面的方法掌控:
1. 其父 SipApplicationSession 超时或者明白地失效了那么所有协定的子会话也会失效.
2. 应用程序运用 SipSession 的 invalidate() API 使明白的失效.
3. 使用过程记号 SipSession 为失效并且容器接着当这个会话进去 ready-to-invalidate 状态时使它失效了.

任何试图在一个失效的 SipSession 上获得或者存储数据会导致容器抛出一个 IllegalStateException.

当一个 SipSession 终止了,rs485通讯接口, 不管是因为父使用会话超时了还是因为这个会话确定的失效了, 窗口一定从内存中扫除所有这个状态的会话. 在这种情形下, 万一收到一个属地这个会话的后续的要求或许回应, 容器将随便地按下面的方式解决这个音信:

1. 穿过发送一个 481 差错响应谢绝这个央求
2. 路由这个请求或者回应

很也许在同样的利用路径不同的使用实例有不同的性命周期. 容器解决一个对话的后续的央求和响应...

6.2.4.1 SipSession 失效
在两处情形下一个 SipSession 可以被失效.
1. 确定的失效机制
2. 当就绪时失效机制.

一旦一个 SipSession 对象被应用程序或者容器失效了, 它就不再有用了. 在失效门径中, 容器一定实行 SipSessionListener 接口完成的 sessionDestroyed 回调计策, 假使存留的话.

6.2.4.1.1 确定失效机制.
一个应用程序可以在任何时候运用 invalidate 计策失效一个 SipSession. 在明白失效中, 容器务须从内存中肃清所有那个状态的 SipSession. 这些状态或许包罗应用状态和容器状态像不曾举行的事务.

调用一个曾经失效的 SipSessoin 对象的 invalidate 方式会抛出一个 IllegalStateException 反常. 运用 invalidate 措施失效一个 SipSession 会导致父 SipApplicationSession 有更少的会话.

6.2.4.1.2 当就绪时失效机制.

而不是靠漫无目标的博览代码来发觉差错,那么代码审查的结果会事半功倍。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值