news 2026/8/21 10:11:04

Kamailio转发机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kamailio转发机制

目录

一.Kamailio转发机制

1.有状态的请求转发

2.无状态的请求转发

3.有状态的响应转发

4.无状态的响应转发

二.示例

1.有状态的请求转发

2.无状态的请求转发

一.Kamailio转发机制

基于路由规则和SIP消息头(可以是Request-URI、To 头、自定义逻辑)将SIP请求从一个端点转发到另一个端点,提供了以下函数:

1.有状态的请求转发

它们是带事务层的可靠转发。如果使用下面两个,在转发过程中,kamailio会维护请求的状态,避免重复转发或响应丢失。

①t_relay()

t_relay()目标来源是$du获取

比如:$du=”sip:192.168.1.100:3000”;

t_relay();

②t_relay_to()

t_relay_to()目标来源是从参数指定

比如:t_relay_to(“udp”,”192.168.1.100:3000”)

也可以使用变量:$var(target)=”192.168.1.100:3000”

t_relay_to(“udp”,$var(target))

2.无状态的请求转发

forward()

forwrad()目标来源可以从$du获取

比如:$du = "sip:192.168.1.100:5060";

forward();

或者直接指定目标:forward("udp", "192.168.1.100:5060");

接着是这个过程的相关流程图,首先需要了解事务存储的内容:

事务存储:

总结一下:

如果是有状态的请求转发,在t_newtran这里创建事务的时候就会设置好响应的dst(用函数update_sock_struct_from_via),也就是从via头域里面更新。进行转发的时候会通过遍历branch列表来添加uac的信息,uac里面有request这个字段,request包含需要发送的内容,包括dst,buffer,buffer_len。如果自己在配置文件还设置了onsend_route,那么run_onsend会修改当前uac->request的dst信息。

如果是无状态的请求转发,配置文件中的$du就是dst,在dst已经存在的情况下,会用build_req_buf_from_sip_req函数构建需要发送的消息,也就是需要发送的内容是从sip消息中构建的。

3.有状态的响应转发

当使用有状态方式处理请求时(如使用t_relay()),响应会自动通过事务层找到对应uac,调用relay_reply执行转发。

4.无状态的响应转发

有响应之后会先判断是否满足tm模块的条件,如果mod_response_reply为0,说明没有匹配,就进行无状态转发处理,会通过Via来设置dst,最后发送响应。

以下是相关流程图

总结一下

如果是有状态的响应转发,dst在请求转发创建事务的时候已经设置好了。接着初始化模块会设置一个response_f回调函数,对于tm模块来说就是reply_received。脚本的onreply_route完毕之后就会调用do_forward_reply,通过判断mod_response_cbks[r](msg)看是否能走tm模块的函数,如果满足条件,就到reply_received,依赖事务层,在t_reply_matching函数里面,取出via1的branch值来设置事务,有了branch就可以找到对应的uac,通过sip消息构建buf之后,就有了需要发送的内容,可以进行响应转发。

如果在上述判断mod_response_cbks[r](msg)的时候为0,说明没有匹配,进行无状态的响应转发处理,会用via2设置dst,通过sip消息用build函数构建new_buf从而进行转发。

二.示例

1.有状态的请求转发

转发的时候依赖事务

现在有主叫方(sip:100000@192.168.131.47:6060)和被叫方

(sip:regnumber@333001.a.myucm.cloud:5060也就是原始的请求目标),以及kamailio代理服务器(监听在 10.0.2.15:5060/tcp)。

如果有一个INVITE请求在路由脚本里设置它为有状态的请求转发,那他的流程就是

基于上面的脚本进行了一个呼叫请求,对日志进行分析

Request-URI 原本是 sip:12345@10.0.2.15:5060,但脚本中被 $du 覆盖为自定义地址。通过 $du = "sip:10.0.2.15:3000;transport=tcp" 强制指定转发目标,忽略原 Request-URI。

后续的响应事务层会直接去查找匹配,不需要手动调用

2.无状态的请求转发

用forward转发的时候依赖 $du

这里使用了forward进行了无状态的请求转发,10.0.2.15:3000收到注册请求后,返回未授权响应,此时kamailio靠Via头将响应传给客户端。接着发起第二次注册请求,两次的callid是一样的,但是kamailio每次都当作全新请求处理

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 13:49:42

视觉SLAM十四讲(v2)-(4.4.2)例子:详细解释评估轨迹的误差公式

视觉SLAM十四讲(v2)-(4.4.2)例子:详细解释评估轨迹的误差公式在视觉SLAM等实际工程中,评估算法估计轨迹与真实轨迹的差异至关重要,以下将详细解释绝对轨迹误差(ATE)和相对位姿误差(RPE)这两种评估轨迹误差的…

作者头像 李华
网站建设 2026/8/21 13:53:50

医疗问答漏关键文献后来补RAG检索才稳住准确率

📝 博客主页:jaxzheng的CSDN主页 目录医疗数据科学:当“看病”遇上“算命”? 一、从“看病”到“算病”:数据科学的逆袭 二、真实小错误:我的“2023年诺贝尔奖”提名 三、冷笑话时间 四、数据存储的“薛定谔…

作者头像 李华
网站建设 2026/8/21 22:53:40

Java毕设项目:基于springboot的校园智能物流管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/8/21 14:06:04

Java毕设项目推荐-基于SpringBoot+Vue的智能驿站系统设计与实现基于springboot的校园智能物流管理系统的设计与实现【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/8/21 16:45:31

报表服务器无法验证数据库中加密数据的完整性

U9C服务器突然一下所有的查询功能都不正常运行。没有想多,大概率又是SQL REPORT SERVICE出问题了吧。果然,运行一下【Web 用户 Url】,报错了!官网上有不少案例存在了,逐一试过也是无效。最后只能是删除SQL的报表服务,重…

作者头像 李华
网站建设 2026/8/21 7:27:20

Thinkphp和Laravel冬奥会奥运会管理网站3.3vue

目录具体实现截图项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理具体实现截图 本系统(程序源码数据库调试部署讲解)带文档1万字以上 同行可拿货,招校园代理 Thinkphp和Laravel冬奥会奥运会管理网站3.3vue 项目开发…

作者头像 李华