在Kamailio中,路由关键字就像其他编程语言中的函数。然而,由于 Kamailio 的消息处理性质,Kamailio 中存在各种类型的路由。并不是所有路由类型都能访问所有函数,要了解其工作原理可能会有些困惑。让我们来看看其中的一些:
核心路由
这些路由由Kamailio核心提供,这意味着即使不加载任何模块,它们仍然可以使用。
request_route(请求路由)
如果说Kamailio的路由就像函数,那么request_route就可以看作是其他大多数路由的主函数。这是处理接收到的 SIP 请求的主要入口点。最简单的形式是这样的:
request_route{
exit;
}
收到的请求将从该路由的顶部开始,并继续通过该路由,直到到达末尾或exit
. 这里处理的消息的上下文是REQUEST_ROUTE。如果不采取任何操作,则当到达路由末端时,请求将被丢弃。该路由不需要任何名称标识符。
reply_route(回复路由)
与此类似的request_route
是接收 SIP 回复的入口点。与它一样,request_route
它也没有命名标识符。然而,与 request_route
不同的是,reply_route
默认情况下不会丢弃消息。它将基于非正常 SIP 路由规则来中继回复。这意味着遵循回复Via
标头堆栈中的数据。如果您不希望转发回复,则必须明确drop
回复。这条路线是可选的。如果不存在,则转发回复。这里消息的上下文是ONREPLY_ROUTE。
重要的是要记住,不能保证处理请求的 PID 和处理回复的 PID 相同,因此私有变量不会在它们之间保留值。
onsend_route(发送路由)
onsend_route
在发送 SIP 请求时执行。在此过程中不会出现很多操作或路由逻辑,因为当请求到达时,这些决定已经做出。onsend_route
提供的功能是在发送前检查消息。例如,如果目标 URI 是一个主机名,就无法在处理过程中提前获取目标 IP 地址。
默认情况下,onsend_route
仅针对 SIP请求执行,但是如果启用onsend_route_reply
参数,则在发送 SIP 回复时也会执行。
route[NAME]
Kamailio 中还有命名路由。这些路由可视为 “子路由”,可在任何路由上下文中执行。这样就可以对 Kamailio 代码进行逻辑分组和分离。与许多其他路由不同,这些路由没有特定的上下文–上下文基于调用处理过程中的调用位置。TMX
模块有一些功能可以帮助我们识别路由上下文。举个例子:
request_route {
$rd = "uas";
route(LOG_ROUTE_CONTEXT);
forward();
}
reply_route {
route(LOG_ROUTE_CONTEXT);
}
route[LOG_TO_URI] {
if ( t_is_request_route() ) {
xinfo("REQUEST_ROUTE context.\n");
if ( t_is_reply_route() ) {
xinfo("REPLY_ROUTE context.\n");
}
}
TM Routes(TM 路由)
有几个路由在技术上是由 Kamailio 核心提供的,但只有在事务中才能使用,这充分证明了 TM 模块的实用性。让我们来看看这些路由:
branch_route(分支路由)
分支路由会在事务分叉时针对创建的每个分支执行。这里可以编写每个分支的路由逻辑。
onreply_route
onreply_route
虽然与reply_route
类似,都是针对 SIP 事务的回复执行的,但并不能取代reply_route
. 事实上,reply_route
首先运行,因为它是在回复与事务匹配之前执行的。onreply_route
经常用于记录有关收到的回复的信息,以及在将回复中继到 UAC 之前可能应用 NAT 和其他类似的转换。
failure_route
如果事务的所有分支都失败了(即回复 >= 300),就会执行 failure_route
。可以通过从失败路径创建新的分支来实现串行分叉,也可以将回复发回 UAC。
request_route {
xinfo("$rm Call-ID: $ci RURI: $ru\n");
$rd = "uas1";
t_on_branch("BRANCH_RT");
t_relay();
}
branch_route[BRANCH_RT] {
$rd = "uas2";
xinfo("Branch route RURI is [$ru]\n");
}
Event Routes(事件路由)
上面列出的路由均由 Kamailio 核心提供(尽管其中一些路由仅通过模块执行TM
)。许多其他模块提供由特定事件触发的路由。这些被命名为event_route[module_name:event]
,以下是一些常见的:
event_route[sl:local-respose]
当SL
模块发送消息时都会执行此路由。例如如果这条路由存在,那么调用sl_send_reply()
时就会执行。
event_route[tm:branch-failure:id]
可以为每个分支分配在分支失败时执行的路由。
dispatcher:dst-up
dispatcher:dst-down
调度程序模块具有使用 SIP OPTIONS 消息作为远程端点“保持活动”检查的功能。当状态改变时,这些路由就会被执行。
htable:expired:table_name
当 htable 条目过期时,该路由将被执行。
usrloc:contact-expired
Desspire被命名为usrloc
,这个事件路由是由registrar
模块提供的。当注册的联系人过期时执行。
结论
我将尝试写一些关于事务处理如何工作的文章,因为它是 Kamailio 编程时需要理解的最重要的事情之一,但了解这些路由如何工作也很重要,特别是branch_route
、onreply_route
和failure_route
。
作者:kaufmania
原文:https://kaufmania.wordpress.com/2023/11/07/types-of-routes-in-kamailio/
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/37606.html