INVITE 要求に対する SIP 応答は、最終または暫定となります。最終応答は常に確実に送信されますが、暫定応答は確実に送信されているとは限りません。信頼性のある暫定応答を送信する必要がある場合には、
PRACK (Provisional response
acknowledgement) メソッドを使用します。
始める前に
PRACK をサポートするアプリケーションを開発できるようにするには、
以下の基準を満たしている必要があります。
- INVITE 要求を送信するクライアントは、PRACK をサポートしていることを示すために、Supported または Require ヘッダーに 100rel タグを書き込む必要があります。
- SIP サーブレットは、応答を送信する場合、send() メソッドではなく sendReliably メソッドを起動して応答する必要があります。
このタスクについて
PRACK は以下の規格で説明されています。
- RFC 3262 (「Session Initiation Protocol (SIP) における暫定応答の信頼性」)
で、PRACK およびオプション・タグ 100rel を追加して、RFC 3261 (「SIP:
Session Initiation Protocol」) を拡張しています。
- JSR 116 (「SIP サーブレット API バージョン 1.0」)
のセクション 6.7.1 (「信頼性のある暫定応答」)。
手順
- プロキシーとして機能するアプリケーションの場合は、以下の手順を行います。
- アプリケーションを使用して、「To」フィールド内にタグを持たない各 INVITE 要求に対し、信頼性のある暫定応答を生成および送信します。
- ユーザー・エージェント・クライアント (UAC) として機能するアプリケーションの場合は、以下の手順を行います。
- アプリケーションを使用して、発信 INVITE 要求に対して 100rel タグを追加します。
このオプション・タグは、Supported ヘッダーまたは Require ヘッダー内のいずれかに表示される必要があります。
- アプリケーションの doProvisionalResponse(...) メソッド内で、
着信する信頼性のある暫定応答に対し、PRACK 要求を作成および送信するようにアプリケーションを準備します。アプリケーションを使用して、応答のダイアログで SipSession.createRequest(...) メソッドを介し、PRACK 要求を作成する必要があります。また、RFC 3262 セクション 7.2 (「RAck」) に従って、RAck ヘッダーを設定する必要があります。
- UAC として機能するアプリケーションは、doPrack( ) メソッドを受信しません。
UAC は INVITE を送信し、信頼性のある応答を受信します。UAC が
信頼性のある応答を受信する場合、UAC は PRACK に UAS に対する要求を送信し、
PRACK 上で 200 OK を受信します。次に、UAC はこの受信のために doResponse( ) を実装する必要があります。
- ユーザー・エージェント・サーバー (UAS) として機能するアプリケーションの場合は、以下の手順を行います。
- 着信 INVITE 要求に 100rel タグが必要な場合、
send() メソッドを使用して 101-199 応答を不確実に送信しようと試みると、例外が発生します。
- 信頼性のある暫定応答が 64*T1 秒内 (T1 が SIP タイマーの場合) に確認されない場合、アプリケーションを使用して、SipErrorListener が noPrackReceived() イベントを受信することを宣言します。noPrackReceived() イベントを処理中に、
アプリケーションを使用して、JSR 116 セクション 6.7.1 ごとに関連する INVITE 要求に対して、5xx エラー応答
を生成および送信する必要があります。
- アプリケーションには、未解決で未確認の信頼性のある暫定応答は、多くても 1 つしか存在しないようにします。最初の暫定応答の確認通知が例外という結果になる前に、別の暫定応答の送信を試行します。
- RFC 3262 によって、セッション記述を含む PRACK 要求の前後のセマンティクスが提供および回答されるように、アプリケーションで設定されていることを確認してください。
具体的には、未確認の暫定応答のいずれかにセッション記述が含まれる場合には、
サーブレットから 2xx 最終応答を送信することはできません。