测试 rtpengine 的 sip-source 参数

修改 /etc/rtpengine/rtpengine.conf 文件,增加一行配置:

sip-source = true # 一般不需要这样配置,本文仅为说明问题

offfer 部分的日志如下:

[1713246486.390578] DEBUG: [1-5025@192.168.43.126]: [control] Dump for 'offer' from 127.0.0.1:34943: { "supports": [ "load limit" ], "sdp": "v=0
o=XRMG 1704250570 3 IN IP4 10.143.1.14
s=XRMG V2.0
c=IN IP4 10.143.1.14
t=0 0
m=audio 30608 RTP/AVP 8 101
c=IN IP4 10.143.1.14
b=AS:82
b=RS:600
b=RR:2000
a=rtpmap:8 PCMA/8000
a=ptime:20
a=sendrecv
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
", "replace": [ "origin", "session-connection" ], "call-id": "1-5025@192.168.43.126", "via-branch": "z9hG4bK-5025-1-00", "received-from": [ "IP4", "192.168.43.126" ], "from-tag": "5025SIPpTag001", "command": "offer" }

这里 sip-source 的地址(来自 received-from)为 192.168.43.126,端口来自 sdp 里面的 30608

接下来的日志为:

 [core] set FILLED flag for stream, local 192.168.43.126:36912 remote 192.168.43.126:30608

远端地址不是 sdp 的 c 地址,而是 sip-source

源码里面 trust_address 如果为 true 代表采用 sdp 的 c 地址,跟 sip-source 的意思正好是反过来的

// call_interfaces.c// ...static void call_ng_flags_flags(struct sdp_ng_flags *out, str *s, void *dummy) {str_hyphenate(s);switch (__csh_lookup(s)) {case CSH_LOOKUP("trust-address"):out->trust_address = 1;   // sdp c addressbreak;case CSH_LOOKUP("SIP-source-address"):case CSH_LOOKUP("sip-source-address"):out->trust_address = 0;  // sip-sourcebreak;
// sdp.c
// ...
static int fill_endpoint(struct endpoint *ep, const struct sdp_media *media, struct sdp_ng_flags *flags,struct network_address *address, long int port)
{struct sdp_session *session = media->session;if (!flags->trust_address) {if (is_addr_unspecified(&flags->parsed_received_from)) {if (__parse_address(&flags->parsed_received_from, NULL, &flags->received_from_family,&flags->received_from_address))return -1;}ep->address = flags->parsed_received_from; // sip-source}

目前版本的 rtpengine 默认的配置就是 trust-address,不再是 sip-source

熟悉 kamailio 的都知道,havfo 的脚本牛的很,现在可以解读一下了:

request_route {
    # per request initial checks
    route(REQINIT);


    if (nat_uac_test(64)) {
        # Do NAT traversal stuff for requests from a WebSocket
        # connection - even if it is not behind a NAT!
        # This won't be needed in the future if Kamailio and the
        # WebSocket client support Outbound and Path.
        force_rport();
        if (is_method("REGISTER")) {
            fix_nated_register();
        } else if (!add_contact_alias()) {
            xlog("L_ERR", "Error aliasing contact <$ct>\n");
            sl_send_reply("400", "Bad Request");
            exit;
        }
    }
 

# nat_uac_test(64) 就是测试信令是不是 WebSocket

# 如果是 WebSocket,那么需要 force_rport, 因为 Via 地址根本不可达

route[NATMANAGE] {

        # ...

        if (!nat_uac_test("8")) {
            $xavp(r=>$T_branch_idx) = $xavp(r=>$T_branch_idx) + " trust-address";
         }

# nat_uac_test("8") 测试sdp里面的地址是不是 rfc1918

# 如果不是 rfc1918,那么 trust-address,当时写这个脚本的时候,rtpengine 的版本应该比较旧

onreply_route {
    if ((($Rp == MY_WS_PORT || $Rp == MY_WSS_PORT)
        && !(proto == WS || proto == WSS))) {
        xlog("L_WARN", "SIP response received on $Rp\n");
        drop;
    }

    if (nat_uac_test(64)) {
        # Do NAT traversal stuff for replies to a WebSocket connection
        # - even if it is not behind a NAT!
        # This won't be needed in the future if Kamailio and the
        # WebSocket client support Outbound and Path.
        add_contact_alias();
    }
}
 

# reply 路由块的处理

# 先检查接收端口

# 再做 nat_uac_test(64) 检查,也就是终端是不是 WebSocket

# 如果是,那么需要 rewrite contact, 因为 WebSocket 的 contact 地址根本不可达

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HZNUCTF第五届校赛实践赛初赛 Web方向 WriteUp

ezssti 很简单的ssti 源码给了&#xff0c;调用Eval即可执行命令 package mainimport ("fmt""net/http""os/exec""strings""text/template" )type User struct {Id intName stringPasswd string }func (u User) Ev…

Python学习从0开始——项目一day01爬虫

Python学习从0开始——项目一day01爬虫 一、导入代码二、使用的核心库三、功能测试3.1初始代码3.2新建文件3.3代码调试 四、页面元素解析4.1网页4.2修改代码4.3子页面4.4修改代码 一、导入代码 在Inscode新建一个python类型的项目&#xff0c;然后打开终端&#xff0c;粘贴以下…

WINFORM画笔实现画板(如何实现橡皮擦和清空画板功能)

C#内部并没有提供橡皮擦功能所以&#xff0c;只能使用画笔和颜色填充来实现橡皮擦和清空画板功能。 此次小编写了一个简易的画板功能其中包含橡皮擦&#xff0c;清空面板&#xff0c;在窗体运行中修改画笔颜色和像素等功能。 代码如下: using Sunny.UI; using Sunny.UI.Win32…

二叉搜索树(BST)

二叉搜索树是一种特殊的二叉树&#xff0c;它具有以下性质&#xff1a; 任意一个节点的左子树上的所有节点的值都小于该节点的值。任意一个节点的右子树上的所有节点的值都大于该节点的值。任意一个节点的左右子树也都是二叉搜索树。二叉搜索树中不存在重复的值。 二叉搜索树…

《七》布局QLayout类

QLayout简介 QLayout是由具体类 QBoxLayout、QGridLayout、QFormLayout 和 QStackedLayout继承的抽象基类。 对于 QLayout子类或 QMainWindow的用户&#xff0c;很少需要使用 QLayout 提供的基本功能&#xff0c;例如 setSizeConstraint() 或 setMenuBar()。Qt 布局系统提供了…

程序员购车指南

哈喽大家好&#xff0c;我是咸鱼。 爱车可以说是大部分男人的天性&#xff0c;而我对汽车的热情却远不及对手表的钟爱&#xff08;痴迷劳力士&#xff09;。以至于我的朋友掏出车钥匙指着上面的苹果树标志跟我介绍奔驰 AMG 系列的强劲性能和马力时&#xff0c;我只能尽量假装自…

【三维Dvhop定位】基于麻雀搜索算法的多通信半径和跳距加权的三维Dvhop定位算法【Matlab代码#81】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. Dvhop定位算法2. 麻雀搜索算法3. 多通信半径和跳距加权策略3.1 多通信半径策略3.2 跳距加权策略 4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文…

Oracle-TDE数据加密功能

1 Oracle TDE 1.1 TDE介绍 Oracle TDE是数据库层对存储的用户敏感数据进行的静态加密&#xff0c;加密数据满足主流的安全法规&#xff08;如 PCI DSS&#xff09;相关的加密要求&#xff0c;可以防止数据文件被其他非数据库读取方式访问的情况下(如通过工具直接打开读取数据文…

Java程序生成可执行的exe文件 详细图文教程

1.Java编辑器&#xff0c;如&#xff1a;idea、eclipse等&#xff0c;下载地址&#xff1a;IntelliJ IDEA: The Capable & Ergonomic Java IDE by JetBrainshttps://www.jetbrains.com/idea/2.exe4j&#xff0c;下载地址&#xff1a;ej-technologies - Java APM, Java Prof…

ansible-tower连接git实现简单执行playbook

前提&#xff1a;安装好ansible-tower和git&#xff0c;其中git存放ansible得剧本 其中git中得内容为&#xff1a; --- - name: yjxtesthosts: yinremote_user: rootgather_facts: noroles:- testroles/test/tasks/main.yml #文件内容 --- #- name: Perform Test Task # tas…

算法和数据结构简介

文章目录 算法的分类硬计算类算法软计算类算法 数据结构分类(宏观)连续结构跳转结构 链表按值传递&#xff0c;按引用传递单链表和双链表链表反转需求实现代码 合并两个有序链表需求 实现代码 算法的分类 硬计算类算法 精确求解&#xff0c;但是某些问题都是使用硬计算类的算法…

ant-design-vue Table+Form表单实现表格内置表单验证,可自定义验证规则,触发必填项

代码示例如下&#xff1a; <!-- --> <template><a-button type"primary" style"padding-left: 10px; padding-right: 10px" click"handleAddRow"><template #icon><plus-outlined /></template>新增</…

2024年大唐杯官网模拟题

单选(出题角度很奇怪&#xff0c;不用太纠结&#xff09; 5G NR系统中&#xff0c;基于SSB的NR同频测量在measconfig里最多可以配置&#xff08; &#xff09;个SMTC窗口。 A、3 B、4 C、1 D、2 答案&#xff1a;D 2个 只在官网找到了这张PPT 5G 中从BBU到AAU需要保证&#x…

Python分析之3 种空间插值方法

插值是一个非常常见的数学概念,不仅数据科学家使用它,而且各个领域的人们也使用它。然而,在处理地理空间数据时,插值变得更加复杂,因为您需要基于几个通常稀疏的观测值创建代表性网格。 在深入研究地理空间部分之前,让我们简要回顾一下线性插值。 为了演示的目的,我将使…

Spring Security详细学习第一篇

Spring Security 前言Spring Security入门编辑Spring Security底层原理UserDetailsService接口PasswordEncoder接口 认证登录校验密码加密存储退出登录 前言 本文是作者学习三更老师的Spring Security课程所记录的学习心得和笔记知识&#xff0c;希望能帮助到大家 Spring Sec…

使用Java调用音乐开放API,并进行播放

使用Java调用音乐开放API&#xff0c;并进行播放 背景描述 电脑没有下载音乐软件&#xff0c;使用网页播放又不太方便&#xff0c;所有就想着使用Java语言直接调用音乐开放API&#xff0c;然后进行播放音乐。 具体代码如下&#xff0c;包含了注释 package com.lowkey.comple…

吴恩达<用于LLM应用程序开发的LangChain> L1-Model_prompt_parser

问题预览/关键词 课程地址如何获取openAI的API Key如何根据日期设置不同模型?如何调用OpenAI的API?如何使用OpenAI的API&#xff1f;langchain如何抽象OpenAI的API接口&#xff1f;langchain如何创建提示词模板并查看模板内容&#xff1f;langchain如何使用提示词模板生成提…

Redis中的BigKey

Redis中的BigKey 文章目录 Redis中的BigKey什么是BigKey&#xff1f;BigKey的危害找到Bigkey删除BigKey优化BigKeyBigKey对持久化的影响对AOF日志的影响对AOF重写和RDB的影响 什么是BigKey&#xff1f; 大 key 并不是指 key 的值很大&#xff0c;而是 key 对应的 value 很大。…

【0281】 Postgres内核级事务系统架构(重点)

文章目录 1. 事务系统架构1. 1 示例演示2. 事务终止2.1 低级别事务终止2.2 子事务处理3. 事务和子事务编号4. 联锁事务开始、事务结束和快照5. pg_xact 和 pg_subtrans6. 预写式日志(Write Ahead Log)1. 事务系统架构 PostgreSQL的事务系统是一个三层系统。底层实现了低级事务…

2024华中杯A题完整1-3问py代码+完整思路16页+后续参考论文

A题太阳能路灯光伏板朝向问题 &#xff08;完整版资料文末获取&#xff09; 第1小问&#xff1a;计算每月15日的太阳直射强度和总能量 1. 理解太阳直射辐射和光伏板的关系**&#xff1a;光伏板接收太阳辐射并转化为电能&#xff0c;直射辐射对光伏板的效率影响最大。 2. 收集…