从SIP消息路由的角度看,OpenSIPS既可以作为无状态代理,也可以作为有状态代理。区别仅仅是处理SIP信令的脚本中调用了什么函数而已。

在有状态模式下,OpenSIPS在内存中记录了SIP事务的状态。事务是由一个SIP请求及与之相关的所有应答消息所组成的。因此,在有状态模式下,OpenSIPS知道应答消息是属于哪个请求的(它有记录,能匹配);它记得请求被送往何方、最后收到的应答是什么;还知道事务当前处理什么状态。

在无状态模式下,OpenSIPS处理消息时,不会留存任何信息。当消息处理完毕并被转发之后,它立马忘记所有相关信息。因为没有事务状态信息,所以,OpenSIPS独立处理每条SIP请求或应答消息,它们之间没有任何关联。

无状态处理所需要的资源较少,由于不需要做SIP消息匹配,所以性能较高。但是,无状态处理的能够胜任的功能却非常有限。

很多特性只能在有状态模式下实现,因为它们依赖事务状态实现功能逻辑,比如说:

  • 重传监测:监测事务的重传消息,需要事务的关联(知道这个消息已经处理过),而在无状态模式下,重传消息只能处理为新的消息。
  • 实现重传:根据事务信息OpenSIPS可以实现SIP消息的重传。
  • 超时:OpenSIPS可以为特定的事务指定一个等待时间(以处理最终应答)。如果超时,OpenSIPS会结束事务,并向上游返回一个408 timeout应答。TM模块提供了$T_fr_timeout    和$T_fr_inv_timeout两个变量,可用于控制超时时长。
  • 串行或并行分支处理:事务实现会存储每个分支的状态。如果没有这些信息,OpenSIPS将对此无能为力。那么,记录每个分支的消息状态,就成唯一选项了。
    注意:在无状态模式下,即使你建立新的branch,在消息发出之后,它也是会消失的
  • 脚本路由:有几种路由脚本只能在有状态模式下工作。因为它们的实现依赖于事务所存储的信息。其中包括: branch route、failure route、onreply route,以及local route,它们的实现都依赖事务的上下文信息,因此只能用于有状态模式。

无状态处理由OpenSIPS core和StateLess模块(SL)直接提供;而有状态处理则由Transaction模块(TM)提供。处理有状态SIP,需要在脚本中加载TM模块。下表是无状态和有状态对应的不同调用对照:

Operation Stateless Stateful
SIP    forward forward() t_relay()
SIP    replying sl_send_reply() t_reply()
Create    transaction n/a t_newtran()
Match    transaction n/a t_check_trans()

注意:可以按每个请求选择无状态或有状态模式。你可以决定每条请求使用哪种处理方式。

在有状态模式下,事务的生命周期由创建、匹配和监测组成。可以在脚本中调用 t_newtran()直接创建事务,也可以调用事务相关的函数隐式创建事务(t_relay() 或t_reply())。

OpenSIPS对SIP请求的处理始于无状态模式,也就是说,它不会主动创建事务,除非你的脚本中触发创建事务的动作。

一旦建立事务,那么后面的SIP消息就可以做事务匹配,具体有:

  • 原始请求的重传消息:一旦发现,自动结束脚本的执行
  • 对错误应答消息的ACK(INVITE 事务):如果事务匹配成功,不需要脚本干预,自动更新事务状态
  • CANCEL请求(匹配INVITE事务)

所有有状态函数在自执行实质动作前都要先做事务匹配。TM模块提供了t_check_trans()函数用于显式事务匹配。它只执行事务匹配,不做其它动作,匹配成功就退出脚本。如果要监测并消除重传消息,尽早地在你的脚本逻辑中调用t_check_tran()或t_newtran()。

CANCEL请求是一个特殊的应用场景。根据RFC3261的定义,CANCEL请求必须路由到INVITE相同的目的地,并且与待取消的INVITE请求保持相同的Via和RURI。你不必关心事务层的实现细节,OpenSIPS已经实现了。一旦CANCEL与INVITE请求匹配,OpenSIPS会按保存的事务信息处理,其过程遵循RFC3261的定义。在脚本层面,你只需要调用t_relay(),OpenSIPS就会把其它事务事项办理妥帖。

if (is_method("CANCEL")) {#see if this CANCEL matches an INVITE,#if not, simply drop itif (!t_check_tran())exit;#if an INVITE transaction was matched,#let TM to do the job for ust_relay();
}

至于应答消息的事务匹配,OpenSIPS会自动执行,你不需要在脚本层面做什么。所有接收到的应答消息,都会先做事务匹配。如果匹配失败,那就按无状态模式的规则处理并转发消息。

小贴士:如果脚本里没有调用无状态转发函数(forward()),那么OpenSIPS会把不匹配事务的应答消息丢弃,不会做无状态转发。这背后的设计逻辑很简单:没有无状态发送请求,哪来的无状态应答消息。

在事务结束时,OpenSIPS 会自动删除内存里的记录。根据SIP协议,事务结束于收到最终应答或超时。

OpenSIPS的无状态及有状态路由相关推荐

  1. 【IPv6】IPv6有无状态地址分配及IPv6路由

    IPv6有无状态区分 有状态 可控.可管理.有IP地址管理者,能够识别客户端. 根据不同客户端分配对应v6地址,客户端和服务器存在租期及续约. 无状态 无控.难管理.无IP地址管理者,没人识别客户端. ...

  2. HTTP协议无状态中的 状态 到底指的是什么?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 赛艇队长 来源 | cnblogs.com/bellko ...

  3. HTTP 无状态中的 状态 到底指的是什么?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://www.cnblogs.com ...

  4. php ajax 更改状态,phpajax实现无刷新获取天气状态_PHP教程

    首先我们要明白一点我们自己是无法来做天气预报这种功能的,这里我们只要调用api接口返回的数据就可以了,下面是以中国天气网的api接口调用实例我们一起来学习. 天气已经成为生活中不可缺少的话题,与我们的 ...

  5. SparkStreaming - 无状态与有状态 updataStateByKey

    无状态与有状态 简单来说,无状态就是每个采集周期分别采集,并不会把前面的采集周期的数据一起计算 有状态就是:把前面采集周期的也算进来, 比如wordcount,无状态统计的就是每个采集周期内的个数,有 ...

  6. java bean状态_无状态和有状态企业Java Bean

    我将通过Java EE 6教程,我试图了解无状态和有状态会话bean之间的区别.如果无状态会话bean不在方法调用之间保留它们的状态,为什么我的程序执行它的方式? package mybeans; i ...

  7. 难住了N个面试者,http协议无状态中的 状态 到底指的是什么?!

    作者:赛艇队长 cnblogs.com/bellkosmos/p/5237146.html 引子 最近在好好了解http,发现对介绍http的第一句话[http协议是无状态的,无连接的]就无法理解了: ...

  8. 无状态与有状态的区别

    无状态与有状态 有状态服务 有状态服务,即服务端记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行相应的处理. 无状态服务 明白了有状态服务,无状态服务就好理解了,无状态服务在实际比较常见 ...

  9. 应用的无状态和有状态!

    应用的无状态和有状态! 什么是有状态和无状态 ? 场景: 当用户登录时,将session或者token传给应用服务器管理,应用服务器里持有用户的上下文信息,这时应用服务器是有状态的 . 同样用户登陆时 ...

最新文章

  1. xml file too big to import to wordpress website
  2. 来啦!机器学习画图神器来啦!
  3. C++赋值运算符与赋值表达式
  4. QT:KeepAliveOption的应用
  5. Java_01_环境变量的配置
  6. 《移动优先与响应式Web设计》一1.2 设备不同,功能不同
  7. Angular应用带参数的路由实现
  8. sys python3 常用_python之sys模块【获取参数】
  9. 对IO设备的控制方式
  10. 运算服务器v9型号,V9服务器
  11. 脑机接口技术介绍、应用与挑战
  12. google vr 简介
  13. 入职腾讯第九年,我辞职了
  14. 软件确认测试和验收测试有什么区别?
  15. v-model的实现原理
  16. 一些常用外围电路的设计/硬件电路设计参考及注意事项(个人经验总结)
  17. 学习数据结构有什么用?
  18. 智能家居混战再起,华为、海尔和小米谁能率先破局?
  19. 大数据时代,python竟是最好的语言?
  20. 5年后将有一半企业加码隐私计算,如何应对主权技术封锁?|算力隐私专栏

热门文章

  1. Linux系统安装常遇到的问题,linux 安装遇到的问题和解决
  2. 大小写字母转换(C语言)
  3. python常用库文件一键安装
  4. Secure-CRT 多窗口合一
  5. 关于tlq的一些命令
  6. 编码器相关知识及ESP32-Arduino程序
  7. win11系统防火墙怎么关闭
  8. nginx安装rewrite模块
  9. 有了这些包装样机,以后再也不用求人设计啦!
  10. 数的进制转换(任意两个进制之间的转换)