当前位置: 首页 > news >正文

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每次都当作全新请求处理

http://www.jsqmd.com/news/120460/

相关文章:

  • Java毕设项目:基于springboot的演唱会购票系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 20、误删oracle数据
  • Linux中级の动静分离
  • 儿童近视防控别踩坑!这样做,轻松帮孩子守住好视力
  • 21、内网安装软件
  • 2025年12月中国童装品牌调研:男生女生童装外套质量与品牌优势分析 - 品牌测评鉴赏家
  • Java毕设项目:基于springboot的养宠物指南服务平台系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 无需训练数据即可控制语言生成模型的技术突破
  • Thinkphp和Laravel基于vue的体育户外运动装备网上商城vue
  • RT_Thread好用吗? RT_Thread成国内最成熟开源RTOS
  • 22、oracle导入数据,sys_user表数据错误
  • 12.9观看蓝桥杯心得
  • [学习资料] 什么是状态机?怎么设计MCU状态机
  • 挖到宝了!这些国产儿童鞋服品牌超绝 - 品牌测评鉴赏家
  • 【课程设计/毕业设计】基于springboot的演唱会购票系统的设计与实现,构建 “演出管理 - 票务销售 - 订单履约” 的全流程平台【附源码、数据库、万字文档】
  • 2025年线下儿童羽绒服选购指南:宝妈实测口碑品牌,这些细节决定质量好坏 - 品牌测评鉴赏家
  • 儿童鞋服选购经验分享:如何为孩子挑选合适的穿着? - 品牌测评鉴赏家
  • 23、他她它的区别
  • Thinkphp和Laravel+vue电子实验报告在线管理lw
  • Java计算机毕设之基于springboot+vue的食品仓库管理系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • Leetcode-3780-Python
  • Gemini-3-Flash-Preview API调用示例:介绍+教程+国内使用大全
  • 24、数据库表,列顺序不一样,这么导入导出数据
  • 8个AI论文工具,助研究生高效完成毕业写作!
  • [G32R] 使用 vscode+cmake 开发 G32R501
  • Cursor编辑器的使用技巧
  • Thinkphp和Laravelpython桂平旅游管理系统vue
  • 2025.12.21总结
  • 升压芯片很简单(一),快速选择升压芯片+利用升压芯片设计LED电源
  • Thinkphp和Laravel冬奥会奥运会管理网站3.3vue