再评 https://github.com/sipwise/rtpengine/issues/415

先把结论说清楚:RTP 环路(rtp loop)= 同一个 RTP 包被反复转发、在两个或多个节点之间来回兜圈,结果就是:

  • 日志狂刷:More than 30 duplicate packets detected, dropping
  • 延迟变大、抖动高、音质差
  • 严重时把 rtpengine/服务器跑挂

下面按"原理 → 你的场景怎么发生 → 怎么排查"来讲。


一、RTP 环路的本质(简单说)

RTP 是 UDP、无连接、无确认 的,转发设备(rtpengine、Kamailio、NAT、路由器)只看:

  • 目的IP:PORT(把包发过去)
  • 很少校验:来源、是否已转发过、是否自己发出去又回来

只要出现:

A → B → A → B → ...

就形成 Layer-3/Layer-4 环路,RTP 包无限复制、转发、膨胀。


二、在你的架构里,RTP 环路是怎么发生的

你的拓扑(简化):

复制代码
UAC ↔ edge-kamailio/rtpengine ↔ 路由器 ↔ edge-kamailio/rtpengine ↔ UAS
            (172.16.23.23)         (10.141.10.0/24)

SDP 被两次改写:

  1. 第一次过 edge:SDP 写 core 侧 IP(10.141...)
  2. 过路由器:不变
  3. 第二次回 edge:SDP 改写为 access 侧 IP(172.16...)

环路触发点:rtpengine 收到自己发出去的包

典型流程:

  1. rtpengine 从 172.16.23.23:32512 发 RTP 给路由器/核心网

  2. 路由/转发规则又把这个包原路发回 给 rtpengine 的 10.141.10.55:32724

  3. rtpengine 一看:这个端口是我在这个呼叫上的端口 → 又转发出去

  4. 于是:

    复制代码
    rtpengine(172.16) → 路由 → rtpengine(10.141) → 路由 → rtpengine(172.16) → ...

    包不断回来 → duplicate packets → 日志告警、丢包、延迟。

为什么会这样(你环境里的几个原因)

  1. 两次 SDP 改写 + 双网卡路由折返

    • rtpengine 有两个网口:172.16.23.23(access)、10.141.10.55(core)
    • 呼叫走了一个"大三角":UAC → access → core → access → UAS
    • RTP 走同样路径时,从 core 口出去的包被路由回 core 口,形成 hairpin/loop。
  2. rtpengine 端口切换 + 流识别混淆

    日志:

    复制代码
    Switching local interface to 172.16.23.23:32512
    Switching local interface to 10.141.10.55:32724
    • 同一路呼叫,rtpengine 在两个网卡、两个端口之间来回切
    • 内部流表把"自己发的包"当成"新收到的包",再次转发 → 环路。
  3. 内核转发(xt_RTPENGINE)还没完全稳定/识别流

    • 刚接通几秒是用户态转发,容易乱
    • 内核规则还没下发或识别错了入接口 → 包又回用户态 → 反复转发。

三、为什么日志里看到 "duplicate packets"

rtpengine 对每个呼叫的 (SSRC, 端口对, 入接口) 做简单重复检测:

  • 短时间内同一个 SSRC、同样方向收到 >30 个包,判定为 loop
  • 直接丢包并打 WARNING:More than 30 duplicate packets detected

这说明:环路已经发生,rtpengine 在主动止损。


四、和你看到的 "hairpin routing" 有什么区别

  • 正常 hairpin(发夹) :

    UAC → rtpengine → UAS,只过一次 rtpengine

    rtpengine 识别:入和出都是自己 → 直接内核转发,不循环。

  • 你遇到的 loop :

    UAC → rtpengine(access) → 路由 → rtpengine(core) → 路由 → rtpengine(access) → ...
    两次进入 rtpengine、跨网卡折返 → 真正的 RTP 环路。


五、简单总结(一句话)

你的 RTP 环路 = 双网卡 + 两次 SDP 改写 + 路由折返 → rtpengine 收到自己发出的包 → 反复转发 → duplicate 告警 + 延迟。


相关推荐
搞科研的小刘选手4 天前
【广州大学主办 | IEEE出版 | 落地广州】第八届国际科技创新学术交流大会暨通信、信息系统和软件工程学术会议(CISSE 2026)
软件工程·通信·信息系统·学术会议·广州大学·科技创新·会议推荐
so~what11 天前
6G Day 1
信息与通信·通信
littleBird_214 天前
NR 5G-A NTN 小区搜索及NTN相关SIB
5g·通信·nr
搞科研的小刘选手15 天前
【见刊检索快 | 重庆线上线下同步】第五届信号处理、计算机网络与通信国际学术会议(SPCNC 2026)
计算机网络·信号处理·通信·学术会议·会议推荐·重庆
星恒讯工业路由器17 天前
双栈时代的访问断层:当同一个域名走向两条网络路径
网络·物联网·信息与通信·ipv4·通信·ipv6·双栈网络
littleBird_218 天前
NR 5G-A NTN技术概述
5g·通信·nr
一条大祥脚1 个月前
26CCPC网络赛 DFS|数学|解方程|异或哈希|通信|二分|倍增|期望DP|最短路计数
通信·倍增·ccpc网络赛·疑惑哈希·期望dp
小贺儿开发1 个月前
Unity 局域网遥控幻灯片展示工具 3.0
科技·http·unity·工具·ppt·通信·网页
搞科研的小刘选手1 个月前
【中国·海口(线上+线下)】2026年智能感知、通信与海洋应用国际学术会议(ISCMA 2026)
通信·学术会议·会议推荐·智能感知·海洋应用·海口·海南大学
码上有光1 个月前
Linux进程通信——共享内存、消息队列和信号量
android·linux·运维·共享内存·通信