news 2026/5/19 14:50:08

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/5/19 17:14:42

Thinkphp和Laravelpython桂平旅游管理系统vue

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

作者头像 李华
网站建设 2026/5/19 17:14:24

Linux设备树基础

Linux设备树基础笔记学习整理基于野火鲁班猫教程并且添加自己学习后理解的内容然后还有ai的一些总结。如果有说的不好或者不对的地方希望大家指正!!!这是设备树的简略图,设备树的根节点扩张了许多子节点。有关设备树,D…

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

基于Thinkphp和Laravel框架的竞赛管理系统vue

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

作者头像 李华
网站建设 2026/5/7 19:00:50

one-hot编码

我来详细介绍一下 one-hot 编码(独热编码)。什么是 One-Hot 编码?One-Hot 编码是一种将分类变量转换为二进制向量的技术,其中每个类别都表示为一个二进制向量,只有一个元素为1("热")&…

作者头像 李华
网站建设 2026/5/15 10:42:01

Agilent安捷伦8564EC-40g频谱分析仪

射频江湖的“老炮儿”:安捷伦8564EC,为何至今仍是传奇?156/2558//3328在射频工程师的实验室里,如果看到一个笨重但依然锃亮的“大铁盒子”,前面板布满实体按键和旋钮,屏幕或许有些发黄,但显示的…

作者头像 李华
网站建设 2026/5/13 6:20:24

提示工程架构师必读:Agentic AI技术生态标准化与开源社区发展报告

提示工程架构师必读:Agentic AI技术生态标准化与开源社区发展报告 引言:Agentic AI的“野蛮生长”与架构师的痛点 1. 从“工具化AI”到“Agentic AI”:一场范式革命 2023年以来,Agentic AI(智能体AI)成为AI领域最热门的方向之一。与传统“被动执行指令”的AI(如ChatG…

作者头像 李华