OpenSIPS的无状态及有状态路由
从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的无状态及有状态路由相关推荐
- 【IPv6】IPv6有无状态地址分配及IPv6路由
IPv6有无状态区分 有状态 可控.可管理.有IP地址管理者,能够识别客户端. 根据不同客户端分配对应v6地址,客户端和服务器存在租期及续约. 无状态 无控.难管理.无IP地址管理者,没人识别客户端. ...
- HTTP协议无状态中的 状态 到底指的是什么?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 赛艇队长 来源 | cnblogs.com/bellko ...
- HTTP 无状态中的 状态 到底指的是什么?
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://www.cnblogs.com ...
- php ajax 更改状态,phpajax实现无刷新获取天气状态_PHP教程
首先我们要明白一点我们自己是无法来做天气预报这种功能的,这里我们只要调用api接口返回的数据就可以了,下面是以中国天气网的api接口调用实例我们一起来学习. 天气已经成为生活中不可缺少的话题,与我们的 ...
- SparkStreaming - 无状态与有状态 updataStateByKey
无状态与有状态 简单来说,无状态就是每个采集周期分别采集,并不会把前面的采集周期的数据一起计算 有状态就是:把前面采集周期的也算进来, 比如wordcount,无状态统计的就是每个采集周期内的个数,有 ...
- java bean状态_无状态和有状态企业Java Bean
我将通过Java EE 6教程,我试图了解无状态和有状态会话bean之间的区别.如果无状态会话bean不在方法调用之间保留它们的状态,为什么我的程序执行它的方式? package mybeans; i ...
- 难住了N个面试者,http协议无状态中的 状态 到底指的是什么?!
作者:赛艇队长 cnblogs.com/bellkosmos/p/5237146.html 引子 最近在好好了解http,发现对介绍http的第一句话[http协议是无状态的,无连接的]就无法理解了: ...
- 无状态与有状态的区别
无状态与有状态 有状态服务 有状态服务,即服务端记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行相应的处理. 无状态服务 明白了有状态服务,无状态服务就好理解了,无状态服务在实际比较常见 ...
- 应用的无状态和有状态!
应用的无状态和有状态! 什么是有状态和无状态 ? 场景: 当用户登录时,将session或者token传给应用服务器管理,应用服务器里持有用户的上下文信息,这时应用服务器是有状态的 . 同样用户登陆时 ...
最新文章
- xml file too big to import to wordpress website
- 来啦!机器学习画图神器来啦!
- C++赋值运算符与赋值表达式
- QT:KeepAliveOption的应用
- Java_01_环境变量的配置
- 《移动优先与响应式Web设计》一1.2 设备不同,功能不同
- Angular应用带参数的路由实现
- sys python3 常用_python之sys模块【获取参数】
- 对IO设备的控制方式
- 运算服务器v9型号,V9服务器
- 脑机接口技术介绍、应用与挑战
- google vr 简介
- 入职腾讯第九年,我辞职了
- 软件确认测试和验收测试有什么区别?
- v-model的实现原理
- 一些常用外围电路的设计/硬件电路设计参考及注意事项(个人经验总结)
- 学习数据结构有什么用?
- 智能家居混战再起,华为、海尔和小米谁能率先破局?
- 大数据时代,python竟是最好的语言?
- 5年后将有一半企业加码隐私计算,如何应对主权技术封锁?|算力隐私专栏