路由流程分析

摘机前

image.png|800

image.png|800

1、收到第一个INVITE时,身份验证失败,发起挑战。【407后,终端回复的ACK是一个响应消息】
2、第二次收到INVITE时,终端带上验证信息,验证通过。
3、移除身份验证头信息
4、查找被叫用户地址
5、设置分支路由
6、执行有状态转发 KSR.tm.t_relay()
7、触发分支路由
8、执行退出 KSR.x.exit()
9、响应回调函数(响应路由)收到100、180 状态码

摘机后

image.png|800

image.png|800
1、响应路由收到200状态码
2、主叫发送ACK,收到ACK请求
3、进入会话处理
4、执行有状态转发 KSR.tm.t_relay()。

?【ACK这里未触发分支路由,测试发现,为ACK设置分支路由后,也不会触发】
从Kamailio发出去的ack请求,不会触发任何路由

挂机

image.png|800

image.png|800
1、被叫挂机,收到BYE请求
2、进入会话处理
3、设置分支路由(这里为什么会重新设置分支路由,是因为重启了一个事务)
4、转发
5、触发分支路由
6、退出

并未收到200响应码路由?

因为代码里面没有给BYE请求设置响应路由

1
2
3
4
5
6
7
8
9
10
11
12
13
    if KSR.is_method_in("IBSU") then
        if KSR.tm.t_is_set("branch_route") < 0 then
            KSR.tm.t_on_branch("ksr_branch_manage");
            log("设置分支路由")
        end
    end

    if KSR.is_method_in("ISU") then
        if KSR.tm.t_is_set("onreply_route") < 0 then
            KSR.tm.t_on_reply("ksr_onreply_manage");
            log("设置响应路由")
        end
    end

tips:

KSR.x.exit(); 后面的流程就不会执行。