当前位置: 首页 > 工具软件 > OpenSIPS > 使用案例 >

opensips DROUTING 模块说明

皇甫雨华
2023-12-01

引言

        DROUTING (Dynamic Routing )是一个动态选择最佳网关的路由模块。典型的LCR路由就可以由它实现。动态路由是由一组路由相关的特性决定的可以是:

  • 号码前缀
  • 呼叫群组
  • 时间段
  • 权重

路由模块可以处理:

  • 剥离/添加前缀
  • 出入局处理
  • 触发opensips路由脚本

还有失败处理:

  • faile over
  • 根据权重选择或随机选择新的网关

  • 网关保活监测

 

特性描述

        OpenSIPS 的DROUTING 模块的实现设计思想述如下:

  • 路由信息(宿端、运营商、规则、分组,等等)存储在DB里,启动时加载到内存中。运行时可以通过MI接口重载。
  • 目标选择可以基于权重选择,也可以随机选择,可以测试网关的存活状态,自动过滤失活网关。
  • 可以处理大量的规则。
  • 可以集成脚本,伪变量。规则匹配时触发脚本。
  • 双向控制路由,可以处理出局和入局
  • 支持黑名单
  • 支持从多个DB加载路由信息。

DROUTING 的概念

        DROUTING引擎为了实现路由,定义了几个相关概念:

 

宿端Destination/网关Gateway

        路由选择后,实际需要接收OpenSIPS分发信令的SIP网元。它们存储在一张表里,表名是 “dr_gateways”。之所以把网关地址放在一张独立的表中,是因为这些 内容在路由处理过程中是独立的存在。

        一个网关的定义包括:

  • id (string)
  • SIP address (SIP URI)

  • type (integer,目的是为了方便分组,比如说,出局网关和入局网关分组)

  • strip value,剥离前缀的位数
  • prefix (string)要增加的前缀

  • attributes,DROUTING引擎本身没有用到,脚本中可以利用它做逻辑

  • probing mode ,保活监测控制标识

        路由规则表里或运营商定义表里都可以引用网关,引用是通过ID字段关联的。

 

 运营商Carrier

        引入运营商概念是为了给网关分组,DR规则里可以按组操作网关。本质上,运营商定义了一组拥有共同属性的网关。它存储在“dr_carriers” 这张表里。它的定义字段:

  • id (string)

  • list of gateways(string),网关列表,可以带权重,也可以不带,比如:“gw1=10,gw4=10” 或“gw1,gw2”

  • flags : 一个标识位,0x1 - 表示权重排序; 0x2 - 表示仅选用第一个网关(按既有排序选,不按权重选择);0x4 - 禁用

  • attributes ,一个属性标签,DR引擎本身没有用,可以在脚本里用

路由规则表里会引用Carrier信息。

 

路由规则

        路由的真正控制规则。这些规则可以基于前缀、时间段选择,它将决定最终选定的网关,并把消息送给被选中的网关。规则信息存储在“dr_rules”这张表里。它的定义字段:

  • group,是一个数字列表,一条规则可以属于不同的组,在特定时刻,可以只使用某个特定的组。
  • prefix (string with digits only) ,前缀,用于匹配呼叫号码,只能是数字0到9级成,匹配时,按最长匹配选择

  • time validity ( string) ,时间段限定,其值按RFC 2445的定义描述

  • priority (number),规则的权重,其值越高,权重越大

  • script route ID (string),如果规则命中,触发脚本里对应的ID逻辑。也就是说,OpenSIPS的脚本可以划分为多个ID。注意,这类脚本不允许有任何的信令级的改动。

  • list of GWs/carriers (string) ,一个逗号分割的字符串,引用网关或运营端ID,如果引用运营商,在ID前加“#”。可以给每个ID加一个权重描述,比如:“gw1,gw4,#cr3” 或“gw1=10,gw4=10,#cr3=80”

  • attributes(string),DR引擎本身不用,脚本可以利用它区分逻辑 

关于时间规则的补充说明

  • 它是一条date-time 表达式,定义了规则匹配的有效时间段。语法规则遵循RFC2445定义。DR里使用的属性仅是其中的部分子集。

  • DB里存储的字段串格式要求: <dtstart>|<duration>|<freq>|<until>|<interval>|<byday>|<bymonthday>|<byyearday>|<byweekno>|<bymonth>

  • 如果某个属性没有定义,那么对应的位置放空,即便其后的属性都为空,也必须显式放空。

 

路由规则的处理

        这个模块的作用是为PSTN呼叫选择 最佳的网关。选择网关的算法描述如下:

  • 查找源用户所属的路由组。如果路由脚本中直接传递路由组参数,那么跳过这一步。

  • 一旦选定路由组,从规则表中过滤出这一组相关的子集。然后,基于"prefix" 字段进行前缀匹配,选择最长匹配的规则。如果前缀匹配不成功,那么选择默认规则(没有指定前缀那条规则)。

  • 在指定时间的规则子集中进行时间段匹配,选择时间匹配并且权重最高的规则。

  • 一旦规则命中,它可能指定了一个route ID。那么,跳转到脚本中对应ID的入口处继续执行脚本的代码块。 

  • 规则中必须指定一个网关链(或者运营商)。DR模块可以并行处理,或者根据权重串行处理,如果是串行处理,前一个网关处理失败时,链中的后一个网关接替。

  • 对于选定的网关,执行前缀处理(剥离前缀,增加前缀),然后,把网关地址替换为R-URI的host。

如果规则匹配成功,必须执行默认操作,比如说返回一个错误码。如果网关中没有指定prefix字段,那么不需要对R-URI增加前缀。

 

 

失活监测

 

        DR模块有能力对网关进行失活监测 (发SIP OPTIONS)。

对每个网关,可以指定失活监测的方式 (通过网关表里的probe_mode 字段)。

  • (0) - 不监测

  • (1) - 只在网关处于disabled 状态时监测(如果是通过MI禁用,那会彻底禁用,这时也不会监测)。网关可用时会自动恢复。

  • (2) - 持续监测。如果网关失活后恢复,资源会自动恢复。

网关变为disabled 状态的方式有两种:

  • 脚本逻辑 - 脚本在网关处理失败时调用dr_disable() 函数。这时,如果失活监测模式是 (1) 或(2),那么,在网关恢复之后,会自动enabled。
  • MI 命令 - 通过 dr_gw_status MI 命令禁用。如果是这样,表示手工禁用网关。失活监测也会停止,只能通过MI命令手工恢复。这一设计主要是为了方便运维。

 类似资料: