Sip.js: reInvite後にACKにRouteヘッダーがありません。

作成日 2018年01月17日  ·  7コメント  ·  ソース: onsip/SIP.js

SIP.jsライブラリを0.7.5から0.9.1に更新しようとしています。

通話中にビデオを追加するためにReinviteを作成するときに問題が発生します。 問題は、KamailioサーバーがreINVITE呼び出しでRecord-Routeヘッダーを送信しないことです。 SIP RFCによると、このKamailioの動作は正常です。

https://tools.ietf.org/html/rfc3261#section -12.1.2

ルートセットは、応答からのRecord-RouteヘッダーフィールドのURIのリストに設定する必要があり、逆の順序で取得され、すべてのURIパラメーターが保持されます。 Record-Routeヘッダーフィールドが応答に存在しない場合、ルートセットは空のセットに設定する必要があります。 このルートセットは、空の場合でも、このダイアログでの今後のリクエストのために既存のルートセットを上書きします。 リモートターゲットは、応答のContactヘッダーフィールドからURIに設定する必要があります

https://tools.ietf.org/html/rfc3261#section -12.2

ダイアログ内のリクエストには、Record-RouteヘッダーフィールドとContactヘッダーフィールドが含まれる場合があります。 ただし、これらの要求によってダイアログのルートセットが変更されることはありませんが、リモートターゲットURIが変更される可能性があります。

sip.jsバージョン0.7.5でわかるように、ルートヘッダーは常にrequest(this.request)から取得されましたが、sip.jsバージョン0.9.1では、最後の応答(this.response)から取得されます。 Record-routeヘッダーがあります。

バージョン間の違いは次のとおりです。
0.7.5)https://www.dropbox.com/s/jo055zsn9286q17/Screenshot%202018-01-17%2013.40.41.png?dl=0
0.9.1) https://www.dropbox.com/s/u41kh91h3kzvt27/Screenshot%202018-01-17%2013.42.13.png?dl=0

だから私がしたことはあなたの0.9.1コードを少し変更したことです。 応答にRecord-Routeヘッダーが含まれている場合は、それらをACKに追加しますが、以前の要求から取得しようとはしません。 ルートがない場合は、空のままにします。

https://www.dropbox.com/s/1rrhyfnxe9sa88a/Screenshot%202018-01-17%2013.50.11.png?dl=0

なぜあなたが行動を変えたのか知りたいだけです。 私またはあなたの間違いはありますか?

bug

最も参考になるコメント

ねえデニス、私はこれを調べて、ジェームズと話しました。

これはバグですが、ダイアログ内でルートセットを更新できるという点で、元の動作も正しくなかったようです。

https://tools.ietf.org/html/rfc3261#section -12.1.1で説明されているダイアログ形成要求に応答するときのUASの動作は、レコードルートヘッダーをコピーし、それらを逆にして、ダイアログに保存することです。ルートセットとしてのスコープ変数。

ダイアログ内の要求に応答する場合、 https: //tools.ietf.org/html/rfc3261#section -12.2で説明されているように、UASの動作は、ダイアログ内でスコープされた既存のルートセットを再利用する必要があります。

ルートセットを再作成するためのダイアログ内のリクエストのレコードルートヘッダーの存在に依存する現在の動作は正しくありません。

これは次のリリースで修正される予定ですが、それまでの間、初期および順次のすべてのリクエストに対してrecord_route()を呼び出すことで回避できるため、record-routeヘッダーはhttps://tools.ietfのように順次リクエストに含まれ

全てのコメント7件

あなたが探しているセクションは実際にはセクション14です:

https://tools.ietf.org/html/rfc3261#section -14

この場合、セクション12は適用されないため、そのセクションに対してコードの機能を確認してください。 一般的に言って、reINVITEのサポートは0.7.xで十分に安定しておらず、サポートされていると見なすことさえできませんでしたが、サポートは0.8.xで仕様に具体化されました。

セクション14を徹底的にチェックしましたが、「ルーティングセット」の使用法/変更については何も書かれていません。

ただし、セクション12(「ルートセット」)に戻るには、最初のINVITE処理中に形成し、ダイアログ内メッセージの処理中に変更せずに再利用する必要があります。
RFCの適切な部分の引用は上に示されています。

今のところ問題は、「ルートセット」がダイアログ内で変更される理由です(sip.jsバージョン0.9.1は最後の応答this.responseから取得します)-これはRFCに準拠していないためです。

ねえデニス、私はこれを調べて、ジェームズと話しました。

これはバグですが、ダイアログ内でルートセットを更新できるという点で、元の動作も正しくなかったようです。

https://tools.ietf.org/html/rfc3261#section -12.1.1で説明されているダイアログ形成要求に応答するときのUASの動作は、レコードルートヘッダーをコピーし、それらを逆にして、ダイアログに保存することです。ルートセットとしてのスコープ変数。

ダイアログ内の要求に応答する場合、 https: //tools.ietf.org/html/rfc3261#section -12.2で説明されているように、UASの動作は、ダイアログ内でスコープされた既存のルートセットを再利用する必要があります。

ルートセットを再作成するためのダイアログ内のリクエストのレコードルートヘッダーの存在に依存する現在の動作は正しくありません。

これは次のリリースで修正される予定ですが、それまでの間、初期および順次のすべてのリクエストに対してrecord_route()を呼び出すことで回避できるため、record-routeヘッダーはhttps://tools.ietfのように順次リクエストに含まれ

同じ問題が発生していますが、実際には修正されていないのに、なぜこの問題が解決されるのですか?
ダイアログを見つけてそこからコピーすることで、なんとかヘッダーを取得できました。

diff --git a/src/SIPMessage.ts b/src/SIPMessage.ts
index a95e8ee..3226160 100644
--- a/src/SIPMessage.ts
+++ b/src/SIPMessage.ts
@@ -755,6 +755,9 @@ export class IncomingResponse extends IncomingMessage implements IncomingRespons
     if (!contact || !contact.uri) {
       throw new Error("Failed to parse contact header.");
     }
+
+    const dialog = this.ua.dialogs[this.callId + this.fromTag + this.toTag];
+
     const ruri = contact.uri;
     const request = new OutgoingRequest(
       C.ACK,
@@ -767,7 +770,7 @@ export class IncomingResponse extends IncomingMessage implements IncomingRespons
         fromTag: this.fromTag,
         toUri: this.to.uri,
         toTag: this.toTag,
-        routeSet: this.getHeaders("record-route").reverse()
+        routeSet: (dialog ? dialog.routeSet : this.getHeaders("record-route").reverse())
       },
       options ? options.extraHeaders : undefined,
       options ? options.body : undefined

私が思うスタイルは0ポイントですが、解決策はこれに似ていると思います。

元のレポーターが問題を解決したようです。 私はそれを再開しました、そして私たちはこのコードを積極的に見ています。

@egreenmachineありがとうございます。 これは、保留/保留解除(再招待)にも影響します。

保留の再招待後にBYEパケットに正しいルートがない場合がありました。

このページは役に立ちましたか?
0 / 5 - 0 評価