Kamailio 中的路由类型

在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_routeonreply_routefailure_route

作者:kaufmania
原文:https://kaufmania.wordpress.com/2023/11/07/types-of-routes-in-kamailio/

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/37606.html

(0)

相关推荐

发表回复

登录后才能评论