news 2026/6/10 14:09:36

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/6/10 15:46:36

如何设计一个eBPF数据库

eBPF数据库设计指南:构建高性能内核态数据处理系统 关键词 eBPF, 内核数据库, 高性能数据处理, 实时分析, 内核编程, 数据平面加速, 低延迟存储 摘要 在当今数据驱动的世界中,实时数据处理和分析的需求日益增长。传统数据库架构在面对高性能、低延迟和高…

作者头像 李华
网站建设 2026/6/10 15:56:06

8个AI论文工具,助研究生高效完成毕业写作!

8个AI论文工具,助研究生高效完成毕业写作! AI 工具,为论文写作打开新天地 在当今学术研究日益激烈的背景下,研究生们面对的不仅是知识的挑战,还有时间与效率的压力。尤其是在论文写作阶段,如何高效完成初稿…

作者头像 李华
网站建设 2026/6/10 11:01:11

20、误删oracle数据

项目场景: 误删oracle数据问题描述 有一天,熊小二 不小心执行了以下SQL delete from sys_user然后他就慌了,请问怎么办原因分析: 使用oracle,特别是使用oracle的客户端工具,在执行【DML (Data Manipulation…

作者头像 李华
网站建设 2026/6/10 15:57:43

【计算机毕业设计案例】基于SpringBoot的校园快递管理系统设计与实现基于springboot的校园智能物流管理系统的设计与实现(程序+文档+讲解+定制)

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

作者头像 李华
网站建设 2026/6/10 15:33:17

达梦数据库安装配置与备份全攻略

为您详细介绍 DM 数据库(达梦数据库)的安装、实例配置以及备份与还原操作。请注意,具体操作细节可能因 DM 数据库版本和操作系统环境略有差异,请以官方文档为准。一、安装 DM 数据库环境准备操作系统:确认操作系统兼容…

作者头像 李华
网站建设 2026/6/9 22:12:11

Java毕设项目推荐-基于springboot的食品仓库管理系统的设计与实现仓库管理的自动化、库存管理、采购和销售管理【附源码+文档,调试定制服务】

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

作者头像 李华