我有一个运行注册商和 tm 的 Kamailio 4.0.4 代理 (K)。一些 AOR 有多个客户端,它们都自动接受某些导致竞争条件的 INVITE,并且来自多个分支的 200 个 OK 被发送到被调用者。
场景:- A 向 B 发送邀请
- K 在 uloc 中为 B 找到 2 个联系人,我们称他们为 B1 和 B2
INVITE 被分支发送到 B1 和 B2 注意:B1 的链路延迟为 100ms,B2 延迟为 150ms
B1 和 B2 收到后立即自动接受 200 OK
分支 INVITE 后 200ms,K 从 B1 获得 200 OK 并将其中继给 A
- K 也取消了对 B2 的邀请
A 实际上是一个本地 AS,它立即将 200 OK ACK 回 B1
现在的问题是 B2 已经在 50 毫秒前发送了 200 OK 并且在另外 150 毫秒内不会收到 CANCEL
因此,来自 B2 的 200 OK 来到 K,但呼叫已经在 A 和 B1 之间建立
- 发生的情况是 200 OK 被转发给 A,此时 A 变得完全混乱,因为老实说它不是一个很好的 AS。
现在到实际的问题,我如何阻止额外的 200 OK 转到 A?
我可以看到它应该如何工作的一些选项:
- 放下200 OK,扔掉它。B2 不应该重新发送它,因为 CANCEL 很快就会击中它
- ACK + BYE 来自 Kamailio 内部的 200 OK,但这将导致媒体会话被 B2 立即启动和拆除
我什至找不到涵盖这种竞争条件的 RFC。