OpenSIPS 通话中 UPDATE 请求导致没有声音问题

本文围绕 SIP 应用开发中硬话机注册到 OpenSIPS 拨打外部用户无声问题展开。通过抓包排查,发现 FreeSWITCH 在接通坐席和用户时发出 UPDATE 请求。分析得知 OpenSIPS 脚本未对 UPDATE 请求做媒体代理处理,导致 rtp 直连网络不通,修改脚本后问题解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 问题现象

在 SIP 应用的开发中,通话一端听不到声音是比较常见的问题。一般来说,没有声音意味着 RTP 传输存在障碍,追根究底就是网络不通或者端口未开放等原因。但在实践中,真正造成 RTP 传输故障的原因各式各样,以下是笔者遇到的一个案例:

  1. 坐席使用软电话注册到 OpenSIPS,常驻拉起后拨打外部用户,媒体流传输正常
  2. 坐席使用硬话机注册到 OpenSIPS,常驻拉起后拨打外部用户,没有声音

2. 抓包排查

问题的切入点显而易见,硬话机的行为肯定和软电话存在不一致,从而导致问题的发生。通常遇到这种情况 SIP 抓包是不二的法门,以下是笔者使用 sngrep 抓到的 SIP 交互包,对比可以发现一个明显的差异:

使用硬话机时,在 SDP 协商完成 SIP 会话已经建立的情况下,使用 FreeSWITCH 的 bridge 命令接通坐席和用户时 FreeSWITCH 发出了一个 UPDATE 请求给到 OpenSIPS

在这里插入图片描述

3. 问题分析及解决方案

在进行问题分析前首先要确定以下两点:

  1. SIP 协议中的 UPDATE 请求
    UPDATE 请求用于不改变会话状态的前提下修改会话的参数,可用于 SDP 的重新协商
  2. OpenSIPS 的媒体代理
    笔者的应用架构中 OpenSIPS 不仅仅具有注册代理的功能,在其核心脚本中也会使用 rtpengine 作为媒体代理服务器。OpenSIPS 进行媒体代理的原理并不复杂,关键逻辑只有两个:
    1. 替换 INVITE 请求中 SDP 的 IP 和端口为媒体代理服务器 IP 端口,再将其转发给 SIP 终端;
    2. 当 SIP 终端响应 200 时,替换响应中 SDP 的 IP 端口为媒体代理服务器 IP 端口,再将其转发给 INVITE 请求的发起端

综合以上信息,再来分析 sngrep 抓到的 SIP 交互就可以发现问题所在:

  1. 经过 OpenSIPS 处理后,由 INVITE 请求响应建立起的会话已经形成了 FreeSWITCH <--> rtpenginertpengine <--> 硬话机 之间的 rtp 传输连接,此时 rtp 传输正常
  2. 在 bridge 接通外部用户和使用硬话机的坐席时,FreeeSWITCH 不知道出于什么原因发起了 UPDATE 请求重新进行 SDP 协商。从 SIP 交互报文看,此次协商的结果是 FreeSWITCH 和 硬话机 绕过了 rtpengine 进行 rtp 直连,而二者之间网络并未打通
  3. 检查 OpenSIPS 脚本,发现脚本中对 INVITE 请求进行了媒体代理,但是未对 UPDATE 请求做任何处理

至此问题原因已经清晰,一个简单快速的解决方案是在 OpenSIPS 脚本中对 UPDATE 请求也进行媒体代理的处理,经修改后问题不复现

### 设置和管理 OpenSIPS 和 FreeSWITCH 集群 #### 安装与基本配置 对于初次部署,确保所有服务器的操作系统是最新的,并已安装必要的依赖项。OpenSIPSSIP 协议代理服务器,而 FreeSWITCH 则作为媒体处理引擎工作。两者协同可以创建强大的 VoIP 解决方案。 为了简化说明,假设已经有一个运行中的 Linux 发行版环境。按照官方文档指南完成软件包的下载与编译安装过程[^1]。 ```bash sudo apt-get update && sudo apt-get install -y opensips freeswitch ``` #### 创建高可用集群 构建一个高效的 OpenSIPS 和 FreeSWITCH 集群涉及几个关键步骤: - **节点间同步**:确保各个节点之间的时间和服务状态保持一致。 - **负载均衡策略**:定义如何分配传入请求给不同的成员。这可以通过修改 `opensips.cfg` 文件内的路由逻辑实现[^2]。 - **心跳检测机制**:用于监控其他成员的状态并自动切换主备角色。 以下是部分核心命令片段展示如何停止防火墙服务以及启动相关组件[^3]: ```bash systemctl stop firewalld.service opensipsctl start freeswitch -nc -nonat ``` #### 性能优化技巧 针对特定应用场景调整参数能够显著改善整体表现。例如,在面对大量并发连接时适当增加内存池大小;或是当网络延迟较高情况下延长重试间隔时间等措施均有助于提高稳定性[^4]。 #### 故障排查指导 遇到 UAC 报错 "All GW Are Down." 或者通话无音等问题时,应检查如下方面: - 确认 fs_ip_addr:fs_port 已正确定义为 FreeSWITCH 实例所在主机的公网 IP 地址; - 测试各网关之间的连通状况; - 查看日志文件寻找更多线索。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值