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

张开发
2026/6/14 7:40:42 15 分钟阅读

分享文章

评 https://github.com/sipwise/rtpengine/issues/415
这个工单里的RTP loop 不是传统意义上的 IP 网络路由环路更像是SIP/SDP 层把 rtpengine 自己的地址/端口又喂回给了 rtpengine导致 rtpengine 把 RTP 包转发到“自己”。结论先说主要是 Kamailio/rtpengine 调用逻辑或 SDP 处理逻辑导致的媒体面自环不是底层网络路由出了环路。这个 loop 是怎么发生的rtpengine 正常工作时会在两端之间中继 RTPA --- rtpengine --- B A --- rtpengine --- Brtpengine 会给 A 和 B 分别分配本地 relay 地址/端口例如A 看到的对端媒体地址: rtpengine_ip:30000 B 看到的对端媒体地址: rtpengine_ip:30002这样 A 的 RTP 发到 rtpengine 的一个端口rtpengine 再转发给 B反方向同理。但在那个 issue 里rtpengine 最终发现某一侧的“对端 RTP 地址”竟然也是 rtpengine 自己的地址/端口于是变成rtpengine 收到 RTP ↓ rtpengine 按会话表转发 ↓ 目标还是 rtpengine 自己的某个端口 ↓ rtpengine 又收到这个包 ↓ 继续转发 ↓ loop也就是应用层媒体转发自环。为什么说不是网络路由问题如果是 IP 层网络路由环路一般是这种情况Host A → Router 1 → Router 2 → Router 1 → Router 2 ...那会表现为TTL 不断减少可能出现 ICMP TTL exceeded不仅 RTP其他发往同一目的的 IP 包也可能受影响问题发生在三层路由转发路径上。但 rtpengine issue 里的 loop 是rtpengine 按照自己会话里的 peer 地址转发 RTP 结果 peer 地址就是自己。这是rtpengine 会话状态 / SDP 地址 / Kamailio 调用逻辑造成的不是路由器把包转来转去。更准确地说是 Kamailio 路由“写错”了吗可以这么理解但要说得更精确一点不是 Kamailio 的 IP 路由错了而是 Kamailio 对 rtpengine 的 offer/answer 调用、方向参数、或 SDP 重写流程有问题导致已经被 rtpengine 改写过的 SDP 又被当成普通 SDP 再处理。常见触发方式包括INVITE offer 被 rtpengine 改写了一次 然后 reply / re-INVITE / branch / dialog 路由里又以错误方式再改写或者internal/external direction 参数用错或者同一个 SIP 消息经过同一个 rtpengine 逻辑两次结果是 rtpengine 看到 SDP 里的媒体地址已经是自己的地址却又把它当成远端媒体地址于是建立了一个“自己连自己”的媒体路径。简化理解可以把它想成正常 A 的 SDP → Kamailio → rtpengine 改成 rtpengine 地址 → B 异常 已经被 rtpengine 改过的 SDP 又回到 rtpengine rtpengine 以为这个地址是远端地址 于是远端 自己所以 RTP 开始自环。结论这个工单里的 RTP loop本质上是SDP / rtpengine 控制面状态错误 ↓ rtpengine 把自己的 RTP 地址当成远端地址 ↓ 媒体包被转发回 rtpengine 自己 ↓ 形成 RTP loop因此如果二选一Kamailio 路由/rtpengine 调用逻辑问题 ✅ 网络路由问题 ❌更准确地说是SIP 信令层导致的媒体路径自环不是三层网络路由环路。

更多文章