レジストラと tm を実行している Kamailio 4.0.4 プロキシ (K) があります。一部の AOR には複数のクライアントがあり、すべてのクライアントが特定の INVITE を自動的に受け入れるため、競合状態が発生し、複数のブランチから 200 個の OK が呼び出し先に送信されます。
シナリオ: - A が B に招待を送信
- K は、B の uloc で 2 つの連絡先を見つけました。それらを B1 と B2 と呼びましょう。
INVITE は分岐され、B1 と B2 に送信されます 注: B1 のリンク遅延は 100 ミリ秒、B2 の遅延は 150 ミリ秒です
B1 と B2 の両方が、200 OK を受け取るとすぐに自動承認します。
INVITE 分岐から 200ms 後、K は B1 から 200 OK を取得し、それを A に中継します。
- K も B2 への INVITE をキャンセルします。
A は実際には 200 OK を即座に B1 に返すローカル AS です。
ここでの問題は、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 カマイリオ内部からの 200 OK ですが、これにより、メディア セッションが開始され、B2 によってすぐに破棄されます。
この競合状態をカバーする RFC を見つけることさえできません..