DROUTING (Dynamic Routing )是一个动态选择最佳网关的路由模块。典型的LCR路由就可以由它实现。动态路由是由一组路由相关的特性决定的可以是:
路由模块可以处理:
还有失败处理:
根据权重选择或随机选择新的网关
网关保活监测
OpenSIPS 的DROUTING 模块的实现设计思想述如下:
DROUTING引擎为了实现路由,定义了几个相关概念:
路由选择后,实际需要接收OpenSIPS分发信令的SIP网元。它们存储在一张表里,表名是 “dr_gateways”。之所以把网关地址放在一张独立的表中,是因为这些 内容在路由处理过程中是独立的存在。
一个网关的定义包括:
SIP address (SIP URI)
type (integer,目的是为了方便分组,比如说,出局网关和入局网关分组)
prefix (string)要增加的前缀
attributes,DROUTING引擎本身没有用到,脚本中可以利用它做逻辑
probing mode ,保活监测控制标识
路由规则表里或运营商定义表里都可以引用网关,引用是通过ID字段关联的。
引入运营商概念是为了给网关分组,DR规则里可以按组操作网关。本质上,运营商定义了一组拥有共同属性的网关。它存储在“dr_carriers” 这张表里。它的定义字段:
id (string)
list of gateways(string),网关列表,可以带权重,也可以不带,比如:“gw1=10,gw4=10” 或“gw1,gw2”
flags : 一个标识位,0x1 - 表示权重排序; 0x2 - 表示仅选用第一个网关(按既有排序选,不按权重选择);0x4 - 禁用
attributes ,一个属性标签,DR引擎本身没有用,可以在脚本里用
路由规则表里会引用Carrier信息。
路由的真正控制规则。这些规则可以基于前缀、时间段选择,它将决定最终选定的网关,并把消息送给被选中的网关。规则信息存储在“dr_rules”这张表里。它的定义字段:
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 状态的方式有两种: