Network Working Group S. Donovan Request for Comments: 4028 J. Rosenberg Category: Standards Track Cisco Systems April 2005 セッション開始プロトコル(SIP)におけるセッションタイマー Session Timers in the Session Initiation Protocol (SIP) 本文書の位置付け この文書は、インターネットコミュニティのためのインターネット標準化過程 プロトコルを規定するものであり、改善のための議論や提案を依頼するもの である。標準化の段階や、プロトコルの位置付けについては、最新版の "Internet Official Protocol Standards" (STD 1)を参照されたい。この文書 の配信は無制限である。 著作権表記 Copyright (C) The Internet Society (2005). 概要 本文書では、セッション開始プロトコル(Session Initiation Protocol/SIP) の拡張を定義する。この拡張を使用すると、re-INVITEまたはUPDATEリクエス トによってSIPセッションを定期的に更新することができるようになる。ま た、更新によって、ユーザーエージェントとプロキシの双方がSIPセッション がアクティブかどうかを判断できるようになる。この拡張では2つの新規ヘッ ダーフィールドを定義する。セッションの生存時間を伝達するSession- Expires、およびセッションタイマーに許容される最小値を伝達するMin-SEで ある。 Donovan & Rosenberg Standards Track [Page 1] RFC 4028 Session Timer April 2005 目次 1. はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2. 用語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3. 操作の概要 . . . . . . . . . . . . . . . . . . . . . . . . . 4 4. Session-Expiresヘッダーフィールドの定義 . . . . . . . . . . 6 5. Min-SEヘッダーフィールドの定義 . . . . . . . . . . . . . . . 8 6. 422応答コードの定義 . . . . . . . . . . . . . . . . . . . . 8 7. UACの動作 . . . . . . . . . . . . . . . . . . . . . . . . . 9 7.1. 最初のセッション更新リクエストの生成 . . . . . . . . . 9 7.2. 2xx応答の処理 . . . . . . . . . . . . . . . . . . . . 9 7.3. 422応答の処理 . . . . . . . . . . . . . . . . . . . . 11 7.4. 2回目以降のセッション更新リクエストの生成 . . . . . . 11 8. プロキシの動作 . . . . . . . . . . . . . . . . . . . . . . . 12 8.1. リクエストの処理 . . . . . . . . . . . . . . . . . . . 13 8.2. 応答の処理 . . . . . . . . . . . . . . . . . . . . . . 14 8.3. セッション有効期限: . . . . . . . . . . . . . . . . . 15 9. UASの動作 . . . . . . . . . . . . . . . . . . . . . . . . . 15 10. 更新の実行 . . . . . . . . . . . . . . . . . . . . . . . . . 17 11. セキュリティの考慮事項 . . . . . . . . . . . . . . . . . . . 18 11.1. 内部からの攻撃 . . . . . . . . . . . . . . . . . . . . 18 11.2. 外部からの攻撃 . . . . . . . . . . . . . . . . . . . . 19 12. IANA条項 . . . . . . . . . . . . . . . . . . . . . . . . . . 19 12.1. Min-SEとSession-ExpiresヘッダーフィールドのIANA登録 . 19 12.2. 422(Session Interval Too Small)応答コードのIANA登録 . 20 12.3. 「timer」オプションタグのIANA登録 . . . . . . . . . . 20 13. コールフロー例 . . . . . . . . . . . . . . . . . . . . . . . 20 14. 謝辞 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 15. 参考文献 . . . . . . . . . . . . . . . . . . . . . . . . . . 25 15.1. 規範となる参考文献 . . . . . . . . . . . . . . . . . . 25 15.2. 有益な参考文献 . . . . . . . . . . . . . . . . . . . . 26 著者の連絡先 . . . . . . . . . . . . . . . . . . . . . . . . . . 26 完全な著作権表示 . . . . . . . . . . . . . . . . . . . . . . . . 27 1. はじめに セッション開始プロトコル(SIP)[2]では、確立したセッションに対するキープ アライブの仕組みが定義されていない。ユーザーエージェントは、セッション 特有の仕組みを使用してセッションがタイムアウトしたかどうかを判断できる 可能性があるが、プロキシにはできない。そのため、コールステートフルプロ キシは、セッションがまだアクティブかどうかを常に判断できるわけではな い。たとえば、セッション終了時にユーザーエージェントがBYEメッセージ送 信に失敗した場合や、ネットワークの問題でBYEメッセージが失われた場合 に、コールステートフルプロキシは、セッションがいつ終了したかがわからな い。この場合、コールステートフルプロキシはコールステートを保持し続け、 Donovan & Rosenberg Standards Track [Page 2] RFC 4028 Session Timer April 2005 コールステート情報の適用をいつ止めるかを判断する方法がない。 この問題を解決するために、この拡張ではSIPセッションのためのキープアラ イブの仕組みを定義する。UAは、定期的にre-INVITEまたはUPDATE[3]リクエス ト(セッション更新リクエストと呼ばれる)を送信して、セッションをアライブ の状態に保つ。セッション更新リクエストの間隔は、本文書で定義されるネゴ シエーションの仕組みによって決定される。その間隔にセッション更新リクエ ストを受け取らない場合、セッションは終了したとみなされる。両側のUAが BYEを送ると想定されており、また、コールステートフルプロキシは、その呼 の任意ステートを削除できる。 この更新の仕組みには、別の用途もある。ユーザーエージェントは、コールス テートフルプロキシサーバーの場合と同じ理由で、セッションがアクティブか どうかを判断したい場合がある。SIPレベルの仕組みを使用しなくても、ユー ザーエージェントでこの判断が可能である。オーディオセッションの場合、定 期的なRTCPパケットが存続(liveness)を示すものとして機能する[5]。ただ し、SIPセッションが存続する印と、特定セッションの詳細とを分けるのが望 ましい。 また、セッションタイマーの別の用途は、SIP Network Address Translator (NAT)Application Level Gateway (ALG)の構築[6]に記載されている。NATに組 み込まれたALGは、呼の継続期間(duration)中は、ステートを保持する必要が ある。このステートは最終的に削除されなければならない。ステート削除のト リガをBYEに依存すると、信頼性の問題とは別に、DoS攻撃(denial of service attack)の原因になる可能性もある。 本文書では、セッション有効期限(session expiration)の仕組みを定義する SIP拡張を提示する。re-INVITEまたはUPDATEを使用して定期的に更新すること で、セッションがアクティブに保たれる。ダイアログの参加者2人のうち、い ずれかがこの拡張を理解していれば、この拡張はSIPとの下位互換性がある。2 つの新規ヘッダーフィールド(Session-ExpiresとMin-SE)、および1つの新規応 答コード(422)が定義される。Session-Expiresはセッションの継続期間を伝達 し、Min-SEはセッション有効期限として許容される最小値を伝達する。422応 答コードは、セッションタイマーの継続期間が短かすぎることを示す。 2. 用語 本文書では、キーワード「MUST」、「MUST NOT」、「REQUIRED」、 「SHALL」、「SHALL NOT」、「SHOULD」、「SHOULD NOT」、 「RECOMMENDED」、「MAY」、「OPTIONAL」はRFC 2119[1]に記載されるとおり に解釈されるべきであり、準拠のためのSIPの実装レベルを示すものである。 Donovan & Rosenberg Standards Track [Page 3] RFC 4028 Session Timer April 2005 さらに、以下の用語を定義する。 セッション間隔(Session Interval): 1ダイアログで、セッションがタイムア ウトしたとみなされるまでにセッション更新リクエスト間に生じる可能性 のある最大時間。セッション間隔は、本文書で定義されるSession-Expires ヘッダーフィールドで伝達される。UASは、送信するセッション更新リクエ ストに対する2xx応答のSession-Expiresヘッダーフィールドからこの値を 取得する。プロキシとUACは、受け取るセッション更新リクエストに対する 2xx応答のSession-Expiresヘッダーフィールドからこの値を確定する。 ミニマムタイマー(Minimum Timer): ダイアログ中のリクエストの処理負荷を 抑えるために、すべての要素(プロキシ、UAC、UAS)は、セッション間隔に ついて希望の最小値を設定することができる。この値はミニマムタイマー と呼ばれる。 セッション有効期限(Session Expiration): この期限までにセッション更新 トランザクションが成功しない場合、要素はセッションがタイムアウトし たとみなす。 セッション更新リクエスト(Session Refresh Request): 本仕様の規則に従っ て処理されるINVITEまたはUPDATEリクエスト。リクエストによって2xx応答 が生成されると、セッション有効期限は、現在の時間に応答から取得した セッション間隔を足した時間まで延ばされる。セッション更新リクエスト は、[2]のセクション6で定義されているターゲット更新リクエスト(ダイア ログのリモートターゲットを更新できるリクエスト)と混同されるものでは ない。 初回セッション更新リクエスト(Initial Session Refresh Request): 特定の Call-ID値で送信される最初のセッション更新リクエスト。 後続セッション更新リクエスト(Subsequent Session Refresh Request): 初回 セッション更新リクエストの後に、特定のCall-ID値で送信されるセッショ ン更新リクエスト。 更新(Refresh): セッション更新リクエストと同様。 3. 操作の概要 このセクションでは、拡張の操作について概要を説明する。このセクションの 性質はチュートリアルであり、規範と見なすべきではない。 この拡張には、ダイアログ内で1個のUAのみが対応する場合でも動作するとい う特徴がある。処理手順は、4つの場合(UACが対応、UACが対応しない、UASが 対応、UASが対応しない)を操作する方法で異なる。話を単純にするために、 このセクションでは、UACとUASの両側がこの拡張に対応する場合、という基本 Donovan & Rosenberg Standards Track [Page 4] RFC 4028 Session Timer April 2005 的な操作について解説する。 UACはINVITEを送信することで開始される。このINVITEには、この拡張への対 応を示すオプションタグ「timer」付きのSupportedヘッダーフィールドが含ま れる。 このリクエストは複数プロキシを経由する。その個々のプロキシが、セッショ ンタイマーの確立に関連する可能性がある。各プロキシは、Session-Expires ヘッダーフィールドとMin-SEヘッダーフィールドがリクエストにない場合、リ クエストに挿入することができる。また、後述のように、既存のSession- ExpiresとMin-SEのヘッダーフィールド値を変更することができる。 Min-SEヘッダーフィールドによって、セッション更新間隔の下限が決まる。つ まり、このリクエストをサービスするプロキシが要求できる最短の更新頻度が 決定される。このヘッダーフィールドの目的は、悪意のあるプロキシが、隣接 するプロキシを過負荷にする目的で任意の短い更新間隔を設定できないように することである。リクエストを処理する各プロキシは、この下限を上げる(更 新間隔を長くする)ことはできるが、下げることはできない。 Session-Expiresヘッダーフィールドによって、セッション更新間隔の上限が 決まる。つまり、リクエストが処理された後に、セッションステートフルなプ ロキシがこのセッションのステートを保持する必要がある期間が決定される。 このリクエストをサービスするプロキシはいずれも、この値を低くすることは できるが、Min-SEヘッダーフィールドで指定された値よりも低くすることはで きない。 あるプロキシでSession-Expiresの間隔が短すぎる場合(つまり、プロキシで指 定するMin-SEの値よりも低い場合)、プロキシは422応答でそのリクエストを拒 否する。その応答には、Min-SEヘッダーフィールドが含まれ、プロキシの希望 する最小セッション間隔が指定される。次から、UACは、そのMin-SEヘッダー フィールドをリクエストに含めて再試行する。ヘッダーフィールドには、それ までに受け取ったすべての422応答のうち、最大のMin-SEヘッダーフィールド 値が含まれる。このようにして、ミニマムタイマーはパス上のプロキシすべて の制約に合致する。 INVITE/422のやり取りを数度繰り返した後、リクエストは最終的にUASへ到達 する。UASは、プロキシのようにセッション間隔の値を調整でき、調整する場 合は、2xx応答のSession-Expiresヘッダーフィールドに最終のセッション間隔 を含める。また、Session-Expiresヘッダーフィールドには「refresher」パラ メータが含まれる。これは、更新を実行している側のUA(現在UACであるUA、ま たは現在UASであるUA)を示す。2xx応答がプロキシの連鎖を戻って行くとき に、各プロキシは最終のセッション間隔を確認できるが、変更はできない。 Donovan & Rosenberg Standards Track [Page 5] RFC 4028 Session Timer April 2005 応答のSession-Expiresヘッダーフィールドから、両側のUAは、セッションタ イマーについて、アクティブであること、期限切れになるタイミング、更新者 を確認できる。期限切れ前のある時点でアクティブな更新側(refresher)が、 セッション更新リクエスト(re-INVITEまたはUPDATE[3]リクエスト)を生成す る。更新側は、セッション更新リクエストに対する応答を受け取らなかった場 合、BYEを送信してセッションを停止する。同様に、相手側がセッション期限 切れ前にセッション更新リクエストを受け取らなかった場合、相手側がBYEを 送信する。 セッションが確立される度に1度送信される更新リクエストは、上記のよう に、最初のリクエストと同様に処理される。これは、セッション更新リクエス トが成功すると、希望通りにセッションが延長されることを意味する。 この拡張では、一方のUAのみが対応する場合を考慮に入れているため、この基 本フローには収まらない複雑な部分がある。複雑な部分のひとつは、UASが拡 張に対応していない場合に、プロキシが応答にSession-Expiresヘッダー フィールドを挿入する必要が出てくる可能性がある、ということである。更新 側の役割のネゴシエーションは、この能力にも影響される。つまり、どの参加 者が拡張に対応するかが考慮される。 セッションタイマーが更新するのはセッションであり、セッションを確立する ために使用されるダイアログではない、という点は注意すべきである。当然な がら、この2つは関連している。セッションが期限切れになると、BYEが送信さ れる。これによって、セッションと、通常はダイアログも停止される。 4. Session-Expiresヘッダーフィールドの定義 Session-Expiresヘッダーフィールドでは、SIPセッションのセッション間隔が 伝達される。このヘッダーフィールドは、INVITEまたはUPDATEに対する2xx応 答と同様に、INVITEまたはUPDATEリクエストにのみ含まれる。SIPのExpires ヘッダーフィールドと同様に、このヘッダーフィールドには差分時間(delta- time)が含まれる。 Session-Expiresヘッダーフィールドの絶対最小値は、90秒である。この値 は、SIPトランザクションがタイムアウトする場合に取られる継続期間の2倍よ りもやや多い。これによって、UAは、セッション間隔の半ばで、余裕を持って 更新を試行できる。また、このトランザクションは、セッションが期限切れに なる前に正常に完了できる。ただし、Session-Expiresヘッダーフィールドの 値としては、1800 秒(30分)が推奨される[RECOMMENDED]。言い替えると、SIP エンティティは、90 秒より長い継続期間のSession-Expiresヘッダーフィール ド値であれば、処理できるように準備しなければならない[MUST]が、Session- Expiresヘッダーフィールドを挿入するエンティティは、30分未満の値を選択 するべきではない[SHOULD NOT]。 Donovan & Rosenberg Standards Track [Page 6] RFC 4028 Session Timer April 2005 セッション間隔を短くすると、ネットワークに悪影響を与える可能性がある。 メッセージトラフィックが過剰になり、ユーザーエージェントとプロキシサー バーの双方に影響を及ぼす結果となる。両側のユーザーエージェントが同時に re-INVITEまたはUPDATEを送信するときに発生する「にらみ合い(glare)」の可 能性が大きくなる。セッションタイマーの主な目的は、SIP要素にステートを 時間切れにする手段を提示することなので、通常、極度に小さな値は必要とさ れない。30分という値は、通話の95%がこの継続期間よりも短いので選択され た。ただし、30分という最小値は、MUSTではなくSHOULDと記載されている。そ の理由は、この数値は、ネットワーク帯域、ネットワークの待ち時間 (latencies)、演算能力、利用可能メモリ、ネットワークトポロジー、さらに 当然ながらアプリケーションの実装方法など、多くのネットワーク的要因に よって異なるためである。いずれにせよ、SIPは電話の通話だけではなく、 どのようなセッションでもセットアップできる。本文書の発行時点では、30分 が適切と思われる。技術の進歩によっては、5年後には数値が大きすぎること になる可能性もある。 Session-Expiresヘッダーフィールドのデフォルト値は未定義である。つま り、Session-Expiresヘッダーフィールドがない場合、本仕様で定義されるメ カニズムを使用するセッションの有効期限はないということである。本仕様で は、ローカルで構成されるタイマーなど、適用可能な他のメカニズムは定義さ れていない、ということに注意。 Session-Expiresヘッダーフィールドの構文は以下の通り。 The syntax of the Session-Expires header field is as follows: Session-Expires = ("Session-Expires" / "x") HCOLON delta-seconds *(SEMI se-params) se-params = refresher-param / generic-param refresher-param = "refresher" EQUAL ("uas" / "uac") 短縮形の文字「x」はSession-Expiresに予約されているため、注意すること。 delta-secondsとgeneric-paramのBNFはRFC 3261 [2]のセクション25で定義さ れている。 Donovan & Rosenberg Standards Track [Page 7] RFC 4028 Session Timer April 2005 表1は、Session-ExpiresヘッダーとMin-SEヘッダーフィールドのために、[2] の表2と表3を拡張したものである。「PRA」列はPRACKメソッド[7]、「UPD」は UPDATEメソッド [3]、「SUB」はSUBSCRIBEメソッド [8]、「NOT」はNOTIFYメ ソッド [8]を示す。 +---------------+-----+-----+---+---+---+---+---+---+---+---+---+---+ | Header |where|proxy|ACK|BYE|CAN|INV|OPT|REG|PRA|UPD|SUB|NOT| +---------------+-----+-----+---+---+---+---+---+---+---+---+---+---+ |Session-Expires| R | amr | - | - | - | o | - | - | - | o | - | - | | | | | | | | | | | | | | | |Session-Expires| 2xx | ar | - | - | - | o | - | - | - | o | - | - | | | | | | | | | | | | | | | |Min-SE | R | amr | - | - | - | o | - | - | - | o | - | - | | | | | | | | | | | | | | | |Min-SE | 422 | | - | - | - | m | - | - | - | m | - | - | +---------------+-----+-----+---+---+---+---+---+---+---+---+---+---+ 表1: Session-ExpiresとMin-SEヘッダーフィールド 5. Min-SEヘッダーフィールドの定義 Min-SEヘッダーフィールドは、セッション間隔の最小値を差分秒(delta- seconds)単位で示す。INVITEまたはUPDATEリクエストで使用されるときは、そ のセッションで使用できるセッション間隔の最小値を示す。リクエストまたは 応答で提示する場合、その値は90秒未満にしてはならない。 このヘッダーフィールドが存在しない場合、デフォルト値は90秒である。 422応答コードが含まれる応答以外で、Min-SEヘッダーフィールドを使用して はならない[MUST NOT]。これは、サーバーが許容するセッション間隔の最小値 を示す。 Min-SEヘッダーフィールドの構文は以下の通り。 Min-SE = "Min-SE" HCOLON delta-seconds *(SEMI generic-param) 6. 422応答コードの定義 この拡張では、422(Session Interval Too Small/セッション間隔が短すぎる) 応答コードを取り入れる。この応答コードは、サーバーのミニマムタイマーよ りも継続期間が短いSession-Expiresヘッダーフィールドがリクエストに含ま れる場合に、UASまたはプロキシによって生成される。422応答には、そのサー バーのミニマムタイマーを持つMin-SEヘッダーフィールドを含めなければなら ない[MUST]。 Donovan & Rosenberg Standards Track [Page 8] RFC 4028 Session Timer April 2005 7. UACの動作 7.1. 最初のセッション更新リクエストの生成 本文書で定義されるセッションタイマー拡張に対応するUACは、各リクエスト (Ackを除く)にSupportedヘッダーフィールドを含め、オプションタグ 「timer」[2]を列挙しなければならない[MUST]。UACがこのセッションにセッ ションタイマーを使用することを要求していない場合でも、そうしなければな らない[MUST]。 UACは、リクエストに値が「timer」のRequireヘッダーフィールドを含めて、 UASがセッションに参加するにはセッションタイマーに対応しなければならな いことを示してもよい[MAY]。これはUACがUASに更新を実行するように要求し ているのではなく、単にUASがこの拡張に対応することを要求しているだけで ある。さらに、UACは、リクエストに値が「timer」のProxy-Requireヘッダー フィールドを含めて、プロキシがリクエストを正しく処理するには、セッショ ンタイマーに対応しなければならないことを示してもよい[MAY]。ただし、UAC がRequireまたはProxy-Requireを使用することは推奨されない [NOT RECOMMENDED]。必要ないのは、UACのみがこの拡張に対応している場合で も拡張は機能するためである。「timer」が指定されているSupportedヘッダー は、RequireやProxy-Requireヘッダーフィールドに「timer」が指定された場 合でも、そのままにしなければならない[MUST]。 UACは、最初のINVITEリクエストにMin-SEヘッダーフィールドを含めてもよい [MAY]。 UACは、セッションにセッションタイマーが適用されることを望む場合、最初 のセッション更新リクエストにSession-Expiresヘッダーフィールドを含めて もよい[MAY]。このヘッダーフィールドの値は、UACが希望するセッション間隔 を示す。Min-SEヘッダーを最初のセッション更新リクエストに含める場合、 Session-Expiresの値は、Min-SE内の値以上でなければならない[MUST]。 UACは、更新を実行したい場合、値「uac」のrefresherパラメータを含めても よい[MAY]。ただし、下記のネゴシエーションの仕組みで選択できるように、 このパラメータを省略することが推奨される[RECOMMENDED]。 7.2. 2xx応答の処理 セッションタイマーでは、UAがステートを生成および維持できる必要がある。 このステートには、セッション間隔、セッション有効期限、更新側のアイデン ティティが含まれる。このステートは、セッションがネゴシエートしてきたダ イアログと関連づけられる。 Donovan & Rosenberg Standards Track [Page 9] RFC 4028 Session Timer April 2005 セッション更新リクエストに対する2xx応答では、Requireヘッダーフィールド に値「timer」が含まれる場合と、含まれない場合がある。含まれる場合、UAC は、応答を処理するためにSession-Expiresヘッダーフィールドを確認しなけ ればならない[MUST]。 応答のRequireヘッダーフィールドに値「timer」が指定される場合、Session- Expiresヘッダーフィールドは常に存在する。UACは、たとえリクエストに Session-Expiresヘッダーフィールドがなくても、応答で受け取れるように準 備しなければならない[MUST]。「refresher」パラメータはSession-Expires ヘッダーフィールドで指定され、誰が更新を実行するかを示す。UACは、この パラメータの値に更新側のアイデンティティを設定しなければならない [MUST]。パラメータに値「uac」が含まれる場合、UACが更新を実行する。UAC がセッションタイマーを要求した(したがってリクエストにSession-Expires ヘッダーフィールドを含めた)が、2xx応答にRequireもSession-Expiresもな かった、という可能性はある。このようなことは、UASがセッションタイマー 拡張に対応せず、UACのみがセッションタイマーを要求した(プロキシは要求し なかった)場合に起こる。このような場合でも、UACがセッションタイマーを (純粋に自身の利益のために)使用したい場合、UACが実行しなければならな い。実行するには、UACは、Session-Expiresヘッダーが2xx応答にあり、その 値がリクエストのものと同じだがrefresherパラメータは「uac」であるかのよ うに、この仕様で定義される手順に従う。 2xx応答にSession-Expiresヘッダーフィールドが含まれていなかった場合、 セッション有効期限はない。この場合、更新が送信される必要はない。 Session-Expiresが含まれない2xxは、最初のセッション更新リクエストと、後 続セッション更新リクエストのいずれに対しても送信される可能性がある。こ れは、Session-Expiresヘッダーフィールドなしの応答を受け取ることによっ て、セッションタイマーがダイアログ中に「停止(turned-off)」される可能性 がある、ということを意味する。 UACは、セッションのセッション間隔を、ダイアログのセッション更新リクエ ストに対する最新の2xx応答に含まれるSession-Expiresヘッダーフィールドの 差分時間(delta-time)値として記憶している。1個のINVITEの結果として確立 した異なるダイアログ上で異なるセッション間隔がある(あるいはセッション 間隔がまったくない)ことは、明確に許容されている。また、UACは、UAC自身 と相手のどちらがセッションの更新側かについても記憶する。 UACが更新を実行しなければならない場合、UACはそのセッションのセッション 有効期限を計算する。セッション有効期限は、そのダイアログ上のセッション 更新リクエストに対する最後の2xx応答の受信時間に、そのセッションのセッ ション間隔を足した時間である。UAがセッション有効期限の後もセッションを 継続したい場合、セッション有効期限の前に更新を生成しなければならない [MUST]。この更新は、セッション間隔の半分が経過した時点で送信することが Donovan & Rosenberg Standards Track [Page 10] RFC 4028 Session Timer April 2005 推奨される[RECOMMENDED]。更新の別の手順については、セクション10に記載 されている。 同様に、セッションの更新以外の目的でre-INVITEまたはUPDATEリクエストが ダイアログ内で送信された場合も、セッションを更新する効果がある。また、 その処理は、本仕様で定義される手順に従う。 7.3. 422応答の処理 セッション更新リクエストに対する応答が422(Session IntervalTooSmall)応 答メッセージである場合、UACはリクエストを再試行してもよい[MAY]。再試行 の手順はセクション7.4に記載されている。この新規のリクエストによって新 規のトランザクションが構成される。また、この新規のリクエストは、前のリ クエストのCall-ID、To、Fromと同じ値を持つべき[SHOULD]だが、CSeqは、前 のものよりも1大きい新規のシーケンス番号を含めるべきである。 7.4. 2回目以降のセッション更新リクエストの生成 最初のセッション更新リクエストで使用されるSupported、Require、Proxy- Requireの値を使用しなければならない[MUST]。 UACが、同じダイアログで以前のセッション更新リクエストに対して422応答を 受け取ったことがある場合、または、同じダイアログでMin-SEヘッダーフィー ルドを含むセッション更新リクエストを受け取ったことがある場合、UACはそ のダイアログのセッション更新リクエストにMin-SEヘッダーフィールドを挿入 しなければならない[MUST]。同様に、まだダイアログが確立されていない場合 に、UACが同じCall-IDを持つ以前のINVITEリクエストに対して422応答を受け 取ったことがあれば、UACはINVITEリクエストにMin-SEヘッダーフィールドを 挿入しなければならない[MUST]。 セッション更新リクエストで指定されるMin-SEヘッダーフィールドの値は、ダ イアログが確立されている場合は、同じダイアログにおいて、すべての422応 答で返されたMin-SEヘッダーフィールド値、またはセッション更新リクエスト で受け取ったMin-SEヘッダーフィールド値のうち、最大値でなければならない [MUST]。ダイアログが確立されていない場合、Min-SEヘッダーフィールドの値 は、同じCall-IDを持つINVITEリクエストに対するすべての422応答で返された Min-SE値の最大値が設定される。この規則の結果として、ダイアログが確立さ れると、Min-SEの最大値が事実上「クリア」され、その時点から、プロキシパ スにあるプロキシからの値のみが使用されることになる。 UACは、最小セッション間隔について自身の見解を持ってもよい。その際に、 上記の値が小さすぎる場合、UACは値を増やしてもよい[MAY]。 Donovan & Rosenberg Standards Track [Page 11] RFC 4028 Session Timer April 2005 アクティブなセッションタイマーを持つダイアログ内で送信されたセッション 更新リクエストには、Session-Expiresヘッダーフィールドが存在すべきであ る[SHOULD]。提示する場合は、Min-SEヘッダーフィールドの最大値(提示しな い場合の初期値は90)、および現在のセッション間隔と等値にすべきである [SHOULD]。Session-Expiresヘッダーフィールドをこの値にすることで、DoS攻 撃をある程度防ぐことができる(セクション11参照)。そのため、UAは、(例外 的だが)ダイアログ中にセッション間隔を変更するのが不適切な場合にのみ、 このSHOULD指定を無視すべきである。 最初のセッション更新リクエストではない場合、リクエストを送信する要素が 現在更新を実行しているときは、refresherパラメータを「uac」に、そうでは なく、相手が更新を実行しているときは「uas」と設定することが推奨される [RECOMMENDED]。こうすると、更新側の役割は更新ごとには変わらない。ただ し、明示的に役割を変更したい場合は、相手側がセッションタイマーに対応し ていることがわかっていれば、「uas」の値を使用してもよい[MAY]。相手が対 応しているかどうかは、相手からSupportedヘッダーフィールドに値「timer」 が指定されたリクエストを受信することで判断できる。役割を選択し直したい 場合は、パラメータを省略してもよい[MAY]。 セッション更新のために生成されたre-INVITEは通常のre-INVITEであり、セッ ション更新のために生成されたUPDATEも通常のUPDATEである。相手がUPDATEメ ソッドに対応していることをUACがわかっている場合、re-INVITEではなく UPDATEを使用することが推奨される[RECOMMENDED]。UPDATEへに対応している ことは、相手から値「UPDATE」を含むAllowヘッダーフィールドを受け取る か、ダイアログ中のOPTIONSリクエストによってわかる。UPDATEリクエストに はオファー [4]を含めないことが推奨される[RECOMMENDED]が、re-INVITEの場 合は、たとえセッションの詳細に変更がなくても、含めるべきであ る[SHOULD]。その場合、オファーでは、変更されていないことと示さなければ ならない[MUST]。これは、SDPの場合、相手に対する以前のSDPメッセージと同 じ値を最初のフィールドに含めることによって実行される。セッション更新リ クエストの結果として交換される応答にも同様のことが言える。変更がなかっ た場合は、それを示さなければならない[MUST]。 8. プロキシの動作 セッションタイマーは、主にコールステートフルプロキシサーバー(つまり、 確立したコールステートとダイアログステートを維持するサーバー)を対象と している。ただし、ステートフルプロキシサーバー(つまり、トランザクショ ンステートを認識するが、コールステートまたはダイアログステートを保持し ないサーバー)は、本文書に記載される規則にも従ってよい[MAY]。ステートレ スプロキシは、セッションタイマーの要求を試行してはならない[MUST NOT]。 セッションタイマーを要求するプロキシは、record-routeしなければ更新を受 け取ることがないので、record-routeするべきである[SHOULD]。 Donovan & Rosenberg Standards Track [Page 12] RFC 4028 Session Timer April 2005 プロキシ処理規則として、プロキシがリクエストと応答間の情報を記憶 しておく必要があるが、ステートフルプロキシは除外される。 8.1. リクエストの処理 リクエストの処理方法は、すべてのセッション更新リクエストと同様である。 セッションにセッションタイマーを要求するために、プロキシは、セッション に対するセッション更新リクエストにSession-Expiresヘッダーフィールドが 存在することを確認する。プロキシは、転送する(forward)リクエストに Session-Expiresヘッダーフィールドが存在しなければ、転送前に挿入しても よい[MAY]。このSession-Expiresヘッダーフィールドには、プロキシの希望す る任意の有効期限を含めてもよいが、リクエストにMin-SEヘッダーフィールド があれば、その値よりも短い継続期間を指定することはできない。プロキシ は、ヘッダーフィールド値にrefresherパラメータを含めてはならない [MUST NOT]。 リクエストにSession-Expiresヘッダーフィールドが存在していた場合、プロ キシはその値を減少させてもよい[MAY]が、リクエストにMin-SEヘッダー フィールドがあれば、その値よりも短い継続期間に設定してはならない [MUST NOT]。Session-Expiresヘッダーフィールドの値がMin-SEヘッダー フィールドの値以上の場合(Min-SEヘッダーフィールドが提示されないときの 初期値は90秒)、プロキシはSession-Expiresヘッダーフィールドの値を増やし てはならない[MUST NOT]。Session-Expiresヘッダーフィールドの値がMin-SE ヘッダーフィールドの値未満の場合(おそらく、後述のようにプロキシがMin- SEヘッダーフィールドの値を増やしたため)、プロキシは、Session-Expires ヘッダーフィールドの値をMin-SEヘッダーフィールドと同じになるように増や さなければならない[MUST]。プロキシは、Session-Expiresヘッダーフィール ドに「refresher」パラメータの値を挿入したり、パラメータの値を修正して はならない[MUST NOT]。 リクエストのSupportedヘッダーフィールドに値「timer」が指定されている場 合、Session-Expiresヘッダーフィールドのセッション間隔がプロキシのロー カルポリシーで定義されている最小間隔未満であれば、そのINVITEリクエスト を422(Seesion Interval Too Small)応答で拒否してもよい[MAY]。422応答を 送信する場合、プロキシは、自身の最小間隔値を指定したMin-SEヘッダー フィールドを含めなければならない[MUST]。この最小値は、90秒未満にしては ならない[MUST NOT]。 リクエストでセッションタイマーへの対応が示されていないが、リクエストに 含まれるセッション間隔が短すぎる場合、結果として呼が失敗することになる ため、プロキシはそのリクエストを拒否することはできない。そうではなく、 プロキシは、自身の最小間隔を指定したMin-SEヘッダーフィールドを挿入する べきである[SHOULD]。Min-SEヘッダーフィールドがすでに存在する場合、プロ キシは、自身の最小間隔までその値を増やすべきである[SHOULD](ただし、減 らしてはならない[MUST NOT])。その後、前述のように、プロキシはMin-SE ヘッダーフィールドの値と等しくなるようにSession-Expiresヘッダーフィー Donovan & Rosenberg Standards Track [Page 13] RFC 4028 Session Timer April 2005 ルド値を増やさなければならない[MUST]。プロキシされるリクエストの Supportedヘッダーフィールドに、値「timer」が指定されている場合、プロキ シは、そのリクエストにMin-SEヘッダーフィールドを挿入したり、またはその リクエストに含まれる既存のヘッダーフィールド値を修正してはならない [MUST NOT]。これは、ある種のDoS攻撃を防ぐために必要であり、詳しくは セクション11で説明される。 プロキシがセッションタイマーを要求している(したがって、おそらくSession -Expiresヘッダーフィールドを挿入したか、減らした)と仮定すると、プロキ シは、セッションタイマーを使用していることを記憶し、また、プロキシした リクエストのSession-Expiresヘッダーフィールド値も記憶しなければならな い[MUST]。これはトランザクションの継続期間中は記憶されていなければなら ない[MUST]。 プロキシは、トランザクションの継続期間中、リクエストのSupportedヘッ ダーに値「timer」が指定されていたかどうかを記憶していなければならない [MUST]。リクエストのSupportedヘッダーフィールドに値「timer」が指定され ていなかった場合、プロキシは、リクエストに値「timer」が指定された Requireヘッダーフィールドを挿入してもよい[MAY]。ただし、これは推奨され ない[NOT RECOMMENDED]。理由は、プロキシがセッションに対してセッション タイマーを強要できるようになるためである。リクエストにSupportedヘッ ダーフィールドがある場合、Requireヘッダーフィールドは不要である。この 場合、プロキシは、そのセッションにセッションタイマーが使用される可能性 があることを確認する。 8.2. 応答の処理 リクエストに対する最終応答が届くと、プロキシが検査する。 プロキシは、(プロキシするリクエストにSession-Expiresヘッダーフィールド を挿入したり、既存のヘッダーフィールドを修正したり、確認してそのまま受 け入れたことによって)リクエストでセッションにセッションタイマーを要求 したことを記憶しているが、応答にSession-Expiresヘッダーフィールドが含 まれていなかった場合、UASがセッションタイマーに対応しなかったことを示 す。UACもセッションタイマーに対応しなかったことをプロキシが記憶してい る場合、プロキシは、通常通り、応答をアップストリームに転送する。この セッションにはセッション有効期限がない。ただし、UACがセッションタイ マーに対応していたことをプロキシが記憶している場合、別の処理が必要であ る。 応答にSession-ExpiresまたはRequireヘッダーフィールドがないことから、プ ロキシは、応答を受け取るプロキシのうち、自身がセッションタイマーを認識 する最初のプロキシであることが判断できる。このプロキシは、転送したリク エストで記憶しておいた値を応答のSession-Expiresヘッダーフィールドに指 定しなければならない[MUST]。また、「refresher」パラメータの値を「uac」 に設定しなければならない[MUST]。プロキシは、応答のすべてのRequireヘッ Donovan & Rosenberg Standards Track [Page 14] RFC 4028 Session Timer April 2005 ダーフィールドに「timer」オプションタグを追加しなければならない [MUST]。また、Requireヘッダーフィールドが存在しなかった場合、アップス トリームに転送する前にその値でRequireヘッダーフィールドを追加しなけれ ばならない[MUST]。 受け取った応答にSession-Expiresヘッダーフィールドが含まれる場合、応答 の修正は必要ない。 いかなる場合でも、プロキシがアップストリームに転送した2xx応答にSession -Expiresヘッダーが含まれる場合、その値は、その応答に関連付けられるセッ ションのセッション間隔を表す。プロキシは、2xx応答がアップストリームに 転送された時間にセッション間隔を足したものをセッション有効期限として計 算する。このセッション有効期限によって、そのセッションの既存のセッショ ン有効期限は更新されなければならない[MUST]。アップストリームに転送され た2xx応答のSession-Expiresヘッダーフィールドには、refresherパラメータ が存在する。また、refresherには、どちらのUAが更新を実行するかが示され る。1つのINVITEに対して複数の2xx応答が存在し、個々の応答が異なるダイア ログを示す可能性がある。結果として、各ダイアログに関連付けられたセッ ションごとにセッション有効期限が1つずつという、複数のセッション有効期 限が存在することになる。 プロキシは、受け取った応答にSession-Expiresヘッダーフィールドが存在す る場合、その値をアップストリームに転送する前に修正してはならない[MUST NOT]。 8.3. セッション有効期限: 現在の時間がセッションのセッション有効期限と同時か超過している場合、プ ロキシは関連するコールステートを削除してもよく[MAY]、その呼に関連付け られているすべてのリソースを解放してもよい[MAY]。UAとは異なり、プロキ シはBYEを送ってはならない[MUST NOT]。 9. UASの動作 UASは、リクエストのパス上のUACまたはプロキシから送信されたセッションタ イマーの要求に対しては、応答しなければならない。あるいは、セッションタ イマーを使用されるようにUASが要求してもよい。 受信リクエストで、Supportedヘッダーフィールドに値「timer」が指定され、 Session-Expiresヘッダーフィールドが含まれる場合、Session-Expiresヘッ ダーフィールドのセッション間隔がUASのローカルポリシーで定義されている 最小間隔よりも短ければ、UASは422(Session Interval Too Small)応答で INVITEリクエストを拒否しても良い[MAY]。UASは、422応答を送信するとき に、自身の最小間隔値を指定したMin-SEヘッダーフィールドを含めなければな らない[MUST]。この最小間隔は、90秒未満にしてはならない[MUST NOT]。 UASは、リクエストを受け入れたい場合、Session-Expiresヘッダーフィールド の値をリクエストから2xx応答へコピーする。 Donovan & Rosenberg Standards Track [Page 15] RFC 4028 Session Timer April 2005 UASの応答では、この値を減らしてもよい[MAY]が、リクエストにMin-SEヘッダ ーフィールドが存在する場合、その値よりも短い継続期間に設定してはならな い[MUST NOT]。Min-SEヘッダーフィールドがない場合、UASはこの値を減らし てもよい[MAY]が、90秒よりも短い継続期間に設定してはならない[MUST NOT]。 UASは、Session-Expiresヘッダーフィールドの値を増やしてはならない [MUST NOT]。 受信リクエストで、Supportedヘッダーフィールドに値「timer」は指定されて いるが、Session-Expiresヘッダーが含まれない場合、UASは、タイマーには対 応しているが、対応することは要求していないことを示す。UASは、2xx応答に Session-Expiresヘッダーフィールドを含めることでセッションタイマーを要 求することができる。リクエストのMin-SEヘッダーフィールドに値が指定され ている場合、Session-Expiresヘッダーフィールドの値は、Min-SEヘッダー フィールド値よりも短い継続期間に設定してはならない[MUST NOT]。 UASは、2xx応答のSession-Expiresヘッダーフィールドにrefresherパラメータ 値を設定しなければならない[MUST]。この値には、ダイアログの更新を誰が実 行するかを指定する。値は、リクエストで指定されているこのパラメータ値 と、UACがセッションタイマー拡張に対応しているかどうかに基づく。リクエ ストのSupportedヘッダーフィールドに「timer」オプションタグが指定された 場合、UACはこの拡張に対応している。表2で応答中の値がどのように設定され るかを定義する。2列目の「none」という値は、そのリクエストにrefresherパ ラメータがないことを意味する。3列目の「NA」という値は、プロトコルが許 容していないため、その組み合わせを使用すべきではないことを意味する。 UACのサポート リクエストの 応答の refresherパラメータ refresherパラメータ --------------------------------------------------------- N なし uas N uac 適用なし N uas 適用なし Y なし uas または uac Y uac uac Y uas uas 表2: UASの動作 表3の4行目では、UACとUASの双方がセッションタイマー拡張に対応し、また、 UACが更新を実行する側を選択していない場合について記載している]。この場 合、UASとUACのどちらが更新を実行するのかをUASが決定できる。ただし、表 に記載されているように、UAC自身が更新側になることを選択した場合、UASは それを無効にすることはできない。 2xx応答に含まれるSession-Expiresヘッダーフィールドのrefresherパラメー タが値「uac」である場合、UASは値「timer」を指定したRequireヘッダー フィールドを応答に含めなければならない[MUST]。これは、更新を実行するの Donovan & Rosenberg Standards Track [Page 16] RFC 4028 Session Timer April 2005 はUACであり、UACに値を知らせるように応答を処理する必要があるためであ る。2xx応答のrefresherパラメータに値「uas」が指定され、リクエストの Supportedヘッダーフィールドに値「timer」が指定された場合、UASは応答の Requireヘッダーフィールドに値「timer」を指定すべきである[SHOULD]。この 場合、UACは更新を行わないが、更新の受け取りを止める場合、UACはBYEを送 信することになっている。UACがBYEを送信しなくても呼は成功するため、この Requireの挿入は、MUSTというよりもSHOULDである。 UACと同様に、UASはセッションタイマーのステートを格納する。このステート には、セッション間隔、セッション有効期限、更新側のアイデンティティが含 まれる。ステートは、セッションを確立するために使用されるダイアログに結 合される。セッション間隔は、ダイアログ上のセッション更新リクエストに対 する最新の2xx応答に含まれる、Session-Expiresヘッダーフィールドの差分時 間値に設定される。また、自身と相手側のどちらがそのダイアログで更新側か についても記憶する。この情報は、そのダイアログのセッション更新リクエス トに対する最新の2xx応答の、refresherパラメータ値に基づく。最新の2xx応 答にSession-Expiresヘッダーフィールドがない場合、セッション有効期限は なく、更新を実行する必要はない。 UASがセッションを更新しなければならない場合、セッション有効期限を計算 する。セッション有効期限は、そのダイアログ上のセッション更新リクエスト に対する最後の2xx応答の送信時間に、セッション間隔を足した時間である。 UAがセッション有効期限の後もセッションを継続したい場合、セッション有効 期限の前に更新を生成しなければならない[MUST]。この更新は、セッション間 隔の半分が経過した時点で送信することが推奨される[RECOMMENDED]。更新の 別の手順については、セクション10に記載されている。 10. 更新の実行 更新を生成する側は、セクション7で定義されているUACの手順に従って生成す る。セッション有効期限を延長する方法は、セッション更新リクエストに対す る2xx応答のみであることに注意。これは、UAが更新を試みて、現在のセッ ション間隔よりもはるかに大きい値のMin-SEヘッダーフィールドが指定された 422応答を受け取る可能性がある、ということを意味する。セッション更新リ クエストに現在のセッション間隔よりもはるかに大きいSession-Expires値が 指定される場合でも、UAは、セッション有効期限(これは変更されていない)の 前にセッション更新リクエストを送信する必要がある。 セッション更新リクエストのトランザクションがタイムアウトするか、408応 答または481応答が生成される場合、UACは、RFC 3261[2]のセクション12.2.1. 2の規則に従って、BYEを送信する。セッション更新リクエストで2xx応答が生 成されず(結果的にセッションが更新されず)、408または481以外の応答を受信 Donovan & Rosenberg Standards Track [Page 17] RFC 4028 Session Timer April 2005 した場合、UACは、その応答コード固有の規則に従い、また可能であれば再試 行すべきである[SHOULD]。たとえば、応答が401の場合、UACは新しい資格情報 (credentials)でリクエストを再試行する。ただし、サーバーから同じエラー 応答が返ってくる場合、UACはリクエストの再試行を続けるべきではない [SHOULD NOT]。 同様に、更新を実行しない側は、セッション有効期限前にセッション更新リク エストが届かない場合、セッション有効期限の少し前に、BYEを送信してセッ ションを停止するべきである[SHOULD]。32秒とセッション間隔の1/3のうち、 小さい値の方が推奨される[RECOMMENDED]。 ファイアウォールとNAT ALGは、セッションの有効期限後にSIPトラフィックが 通過すること許容しない可能性がある。これが、期限切れ前にBYEを送信する 理由である。 11. セキュリティの考慮事項 セッションタイマーによって、プロキシまたはUA要素は、選択した頻度で更新 を送信するように、準拠UAに対して強制できるようになった。また、大幅な増 幅特性を利用してDoS攻撃が行われる可能性も生じた。こうした攻撃は、「部 外者」(通過時にメッセージを変更しようとする要素)、または「内部者」(正 規にリクエストのパス上にいるが、危害を加えようとしている要素)によって 行われる。幸い、いずれの場合もこの仕様で適切に対応できる。 11.1. 内部的な攻撃 ここでは、不良(rogue)プロキシまたはUAがDoS攻撃を行う可能性について紹介 する。一方で、この仕様の仕組みによって、その発生を防ぐ。 まず最初に、UASに対して高頻度で更新を生成するように強制しようとしてい る不良UACの場合を検討する。この攻撃を実行するために、UACは、INVITEの Session-Expiresヘッダーフィールドに、短い継続期間と、「uas」の refresherパラメータを指定する。また、そのリクエストにはSupportedヘッ ダーフィールドが指定されたと仮定する。この短いタイマーを受け入れない UASまたはプロキシは、リクエストを422応答で拒否することによって、攻撃を 防ぐことができる。Supportedヘッダーフィールドが存在しない場合、プロキ シは転送する前にMin-SEヘッダーフィールドをリクエストに挿入する。最終的 に、UASは、パス上のすべての要素が受け入れ可能な最小値よりも短いセッ ションタイマーを選択しない。これによっても、攻撃が防がれる。 次に、UACに対して高頻度で更新を生成するように強制しようとしている不良 UASの場合を検討する。この場合、UACはセッションタイマーに対応している必 要がある。最初のINVITEが不良UASに到達し、UASは非常に短いセッション間隔 Donovan & Rosenberg Standards Track [Page 18] RFC 4028 Session Timer April 2005 が指定された2xxを返す。UACはこのタイマーを使用して直ちに更新を送信す る。セクション7.4では、UACに対して、現在のセッション間隔をリクエストの Session-Expiresヘッダーフィールドにコピーするように要求している。これ によって、プロキシは現在の値を確認することができる。プロキシはこのリク エストを拒否し、より長い最小値が指定されたMin-SEを提示する。この値は、 UACで使用される。プロキシがそのリクエストを拒否せず、Min-SEヘッダー フィールドを指定したリクエストをプロキシした場合は、攻撃は可能である、 ということに注意。UASは、2xx応答に含まれるこのヘッダーフィールドを破棄 し、UACに高頻度のリクエスト生成し続けるように強制する可能性がある。 同様に、不良プロキシは、シグナリングパス上にとどまって、すべてのリクエ ストと応答を確認できない場合、UACまたはUASに対して更新を生成するように 強制できない。 11.2. 外部からの攻撃 通過中のリクエストと応答を監視および修正可能な要素は、高頻度のセッショ ン更新を強制することができる。これを防ぐには、リクエストと応答をメッ セージの整合性(integrity)で保護する必要がある。セッションタイマーの ヘッダーフィールドはエンドツーエンドではなく、プロキシによって操作され るため、SIPのS/MIME機能はこの用途には適さない。そうではなく、ホップバ イホップの仕組みを使用して、整合性を保護する必要がある。したがって、 Session-Expiresヘッダーフィールド、または値「timer」のSupportedヘッ ダーフィールドが指定されたリクエストを送信する要素が、TLSを使用して保 護することが推奨される[RECOMMENDED]。セキュリティが各ホップに適用され た場合にのみ、適切に保護されるため、この拡張と併せてSIPS URIスキームを 使用することが推奨される[RECOMMENDED]。これは、セッションタイマーを record-routeおよびリクエストするプロキシは、SIPS URIを使用してrecord- routeすべきである[SHOULD]ということを意味する。リクエストまたは応答に Session-Expiresヘッダーフィールドを挿入するUAは、SIPS URIのContact URI を含めるべきである[SHOULD]。 12. IANA条項 この拡張では、2個の新規ヘッダーフィールド、1個の新規応答コード、1個の 新規オプションタグを定義する。SIP [2]には、IANAの登録手順が定義されて いる。 12.1. Min-SEとSession-ExpiresヘッダーフィールドのIANA登録 Min-SEヘッダーフィールドについての登録は以下の通り。 RFC番号: RFC 4028 ヘッダー名: Min-SE 短縮形: なし Donovan & Rosenberg Standards Track [Page 19] RFC 4028 Session Timer April 2005 Session-Expiresヘッダーフィールドについての登録は以下の通り。 RFC番号: RFC 4028 ヘッダー名: Session-Expires 短縮形: x 12.2. 422(Session Interval Too Small)応答コードのIANA登録 422(Session Interval Too Small)応答コードについての登録は以下の通り。 応答コード: 422 デフォルトの理由フレーズ: Session Interval Too Small RFC番号: RFC 4028 12.3. 「timer」オプションタグのIANA登録 「timer」オプションタグについての登録は以下の通り。 名前: timer 説明: このオプションタグは、セッションタイマー拡張に対応するためのもの である。リクエストまたは応答のSupportedヘッダーフィールドに含める と、そのUAがこの仕様に沿って更新を実行可能であることを示す。リクエ ストのRequireヘッダーフィールドに含めると、UASは、リクエストを処理 するには、セッションタイマー拡張を理解する必要がある、ということを 意味する。応答のRequireヘッダーフィールドに含めると、UACは、応答の Session-Expiresヘッダーフィールドを確認し、それに沿って処理しなけれ ばならない、ということを意味する。 13. コールフロー例 セッションタイマーのフロー例 Alice Proxy P1 Proxy P2 Bob |(1) INVITE | | | |SE: 50 | | | |----------->| | | |(2) 422 | | | |MSE: 3600 | | | |<-----------| | | |(3) ACK | | | |----------->| | | |(4) INVITE | | | |SE:3600 | | | |MSE:3600 | | | |----------->| | | Donovan & Rosenberg Standards Track [Page 20] RFC 4028 Session Timer April 2005 | |(5) INVITE | | | |SE:3600 | | | |MSE:3600 | | | |----------->| | | |(6) 422 | | | |MSE:4000 | | | |<-----------| | | |(7) ACK | | | |----------->| | |(8) 422 | | | |MSE:4000 | | | |<-----------| | | |(9) ACK | | | |----------->| | | |(10) INVITE | | | |SE:4000 | | | |MSE:4000 | | | |----------->| | | | |(11) INVITE | | | |SE:4000 | | | |MSE:4000 | | | |----------->| | | | |(12) INVITE | | | |SE:4000 | | | |MSE:4000 | | | |----------->| | | |(13) 200 OK | | | |SE:4000 | | | |<-----------| | |(14) 200 OK | | | |SE:4000 | | | |<-----------| | |(15) 200 OK | | | |SE:4000 | | | |<-----------| | | |(16) ACK | | | |----------->| | | | |(17) ACK | | | |------------------------>| |(18) UPDATE | | | |SE:4000 | | | |----------->| | | | |(19) UPDATE | | | |SE:4000 | | | |------------------------>| | |(20) 200 OK | | | |SE:4000 | | | |<------------------------| Donovan & Rosenberg Standards Track [Page 21] RFC 4028 Session Timer April 2005 |(21) 200 OK | | | |SE:4000 | | | |<-----------| | | | |(22) BYE | | | |<------------------------| |(23) BYE | | | |<-----------| | | | |(24) 408 | | | |------------------------>| 図1: セッションタイマーのフロー例 図1は、セッションタイマーを利用したコールフロー例を示す。この例では、 UACとUASの両方がセッションタイマー拡張に対応している。UACのAliceが生成 する最初のINVITEリクエスト(メッセージ1)は、以下のようになる。 INVITE sips:bob@biloxi.example.com SIP/2.0 Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnashds8 Supported: timer Session-Expires: 50 Max-Forwards: 70 To: Bob <sips:bob@biloxi.example.com> From: Alice <sips:alice@atlanta.example.com>;tag=1928301774 Call-ID: a84b4c76e66710 CSeq: 314159 INVITE Contact: <sips:alice@pc33.atlanta.example.com> Content-Type: application/sdp Content-Length: 142 (AliceのSDPは示されない) このリクエストは、Aliceがセッションタイマーに対応し、50秒ごとにセッ ション更新するように要求していることを示す。これは最初のプロキシ(P1)に 到達する。このセッション間隔は、3600という最小許容値に満たないため、P1 はリクエストを422で拒否する(メッセージ2)。 SIP/2.0 422 Session Interval Too Small Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnashds8 ;received=192.0.2.1 Min-SE: 3600 To: Bob <sips:bob@biloxi.example.com>;tag=9a8kz From: Alice <sips:alice@atlanta.example.com>;tag=1928301774 Call-ID: a84b4c76e66710 CSeq: 314159 INVITE Donovan & Rosenberg Standards Track [Page 22] RFC 4028 Session Timer April 2005 この応答には、3600という値の指定されたMin-SEヘッダーフィールドが含まれ る。それから、Aliceはリクエストを再試行する。今回は、リクエストにMin- SEヘッダーフィールドが含まれている。これは、Aliceは同じCall-IDを持つ別 のINVITEリクエストに対して422を受け取ったためである。新しいリクエスト (メッセージ4)は以下のようになる。 INVITE sips:bob@biloxi.example.com SIP/2.0 Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnashds9 Supported: timer Session-Expires: 3600 Min-SE: 3600 Max-Forwards: 70 To: Bob <sips:bob@biloxi.example.com> From: Alice <sips:alice@atlanta.example.com>;tag=1928301774 Call-ID: a84b4c76e66710 CSeq: 314160 INVITE Contact: <sips:alice@pc33.atlanta.example.com> Content-Type: application/sdp Content-Length: 142 (AliceのSDPは示されない) プロキシP1はrecord-routeする。受け入れ可能なセッション間隔になったの で、リクエストをP2へ転送する(メッセージ5)。だが、セッション間隔は、P2 に設定されている最小値の4000未満である。そのため、P2は422応答コードで リクエストを拒否し(メッセージ6)、さらに4000という値を指定したMin-SE ヘッダーフィールドを含める。もう一度、AliceはINVITEを再試行する。送信 するINVITEのMin-SEヘッダーフィールドは、Aliceがそれまでに受け取ったす べてのMin-SE(3600と4000)の最大値である。メッセージ10は以下のようにな る。 INVITE sips:bob@biloxi.example.com SIP/2.0 Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnashds10 Supported: timer Session-Expires: 4000 Min-SE: 4000 Max-Forwards: 70 To: Bob <sips:bob@biloxi.example.com> From: Alice <sips:alice@atlanta.example.com>;tag=1928301774 Call-ID: a84b4c76e66710 CSeq: 314161 INVITE Contact: <sips:alice@pc33.atlanta.example.com> Content-Type: application/sdp Content-Length: 142 (AliceのSDPは示されない) Donovan & Rosenberg Standards Track [Page 23] RFC 4028 Session Timer April 2005 P1はもう一度record-routeするが、P2は行わない(通常、このようなことは発 生しない。おそらく、セッションタイマーを要求した場合、後続のリクエスト をrecord-routeする)。UASはリクエストを受け取る。UASは、リクエストの Session-Expiresヘッダーフィールドを応答にコピーし、値「uac」の refresherパラメータを追加する。この200 OKは、逆にAliceに対して転送され る。Aliceが受信する応答(メッセージ15)は以下のようになる。 SIP/2.0 200 OK Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnashds10 ;received=192.0.2.1 Require: timer Supported: timer Record-Route: sips:p1.atlanta.example.com;lr Session-Expires: 4000;refresher=uac To: Bob <sips:bob@biloxi.example.com>;tag=9as888nd From: Alice <sips:alice@atlanta.example.com>;tag=1928301774 Call-ID: a84b4c76e66710 CSeq: 314161 INVITE Contact: <sips:bob@192.0.2.4> Content-Type: application/sdp Content-Length: 142 (BobのSDPは示されない) AliceはACKを生成し(メッセージ16)、P1を経由してBobへルートされる。Alice が更新側なので、約2000秒後、AliceはUPDATEリクエストを送信してセッショ ンを更新する。このリクエストは確立したダイアログの一部であり、Aliceは そのダイアログ上で422応答またはリクエストを受信していないため、以下の ように、彼女のリクエスト(メッセージ18)にはMin-SEヘッダーフィールドが存 在しない。 UPDATE sips:bob@192.0.2.4 SIP/2.0 Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnashds12 Route: sips:p1.atlanta.example.com;lr Supported: timer Session-Expires: 4000;refresher=uac Max-Forwards: 70 To: Bob <sips:bob@biloxi.example.com>;tag=9as888nd From: Alice <sips:alice@atlanta.example.com>;tag=1928301774 Call-ID: a84b4c76e66710 CSeq: 314162 UPDATE Contact: <sips:alice@pc33.atlanta.example.com> Donovan & Rosenberg Standards Track [Page 24] RFC 4028 Session Timer April 2005 これはP1経由でBobに転送される。Bobは、200 OKを生成する。この応答には Session-Expiresヘッダーフィールドをコピーしている。これはP1経由でAlice に到達する。Aliceが受信する応答(メッセージ21)は以下のようになる。 SIP/2.0 200 OK Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnashds12 ;received=192.0.2.1 Require: timer Session-Expires: 4000;refresher=uac To: Bob <sips:bob@biloxi.example.com>;tag=9as888nd From: Alice <sips:alice@atlanta.example.com>;tag=1928301774 Call-ID: a84b4c76e66710 CSeq: 314162 UPDATE Contact: <sips:bob@192.0.2.4> その後間もなく、AliceのUAはクラッシュする。結果的に、彼女はいつまでも セッション更新リクエストを送信しない。3968秒後、Bobはタイムアウトにな り、BYEリクエスト(メッセージ22)を送信する。これはP1へ送信される。P1は それを配信しようとするが失敗する(AliceのUAがクラッシュしたため)。その 後、P1はBobへ408(Request Timeout)を返す。 14. 謝辞 この研究へのBrett Tateの貢献に感謝したい。Brian Rosenが本文書の編集を 仕上げた。 15. 参考文献 15.1. 規範となる参考文献 [1] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997. [2] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, A., Peterson, J., Sparks, R., Handley, M., and E. Schooler, "SIP: Session Initiation Protocol", RFC 3261, June 2002. [3] Rosenberg, J., "The Session Initiation Protocol (SIP) UPDATE Method", RFC 3311, October 2002. [4] Rosenberg, J. and H. Schulzrinne, "An Offer/Answer Model with Session Description Protocol (SDP)", RFC 3264, June 2002. Donovan & Rosenberg Standards Track [Page 25] RFC 4028 Session Timer April 2005 15.2. 有益な参考文献 [5] Schulzrinne, H., Casner, S., Frederick, R., and V. Jacobson, "RTP: A Transport Protocol for Real-Time Applications", STD 64, RFC 3550, July 2003. [6] Srisuresh, P. and M. Holdrege, "IP Network Address Translator (NAT) Terminology and Considerations", RFC 2663, August 1999. [7] Rosenberg, J. and H. Schulzrinne, "Reliability of Provisional Responses in Session Initiation Protocol (SIP)", RFC 3262, June 2002. [8] Roach, A., "Session Initiation Protocol (SIP)-Specific Event Notification", RFC 3265, June 2002. 著者の連絡先 Steve Donovan Cisco Systems, Inc. 2200 E. President George Bush Turnpike Richardson, Texas 75082 US EMail: srd@cisco.com Jonathan Rosenberg Cisco Systems, Inc. 600 Lanidex Plaza Parsippany, NJ 07054 US EMail: jdrosen@cisco.com Donovan & Rosenberg Standards Track [Page 26] RFC 4028 Session Timer April 2005 完全な著作権表示 Copyright (C) The Internet Society (2005). 本文書は、BCP 78に含まれる権利、ライセンス、制限の対象となり、BCP 78に 記載されている例外に従い、著者はすべての権利を持つ。 本文書とここに含まれた情報は「無保証(AS IS)」で提供され、寄稿者、寄稿 者が代表となる組織、または寄稿者を後援する組織(存在する場合)、インター ネット協会およびIETFは、この情報がいかなる権利も侵害していないという保 証、商用利用および特定目的への適合性への保証を含め、また、これらだけに 限らずすべての保証について、明示的もしくは暗黙的の保証は行われない。 知的財産権 IETFは、本文書で記述される技術の実装または使用に関して要求される、知的 所有権または他の諸権利の有効性または範囲に関して、またはこのような権利 下の任意のライセンスがどの範囲まで使用可能か不可能かに関して、何ら見解 を持たない。このような権利を確認する独自の取り組みを行ったことも示さな い。RFC文書の権利に関する手続きの情報は、BCP 78およびBCP 79に記載され ている。 IPRの開示のコピーがIETF事務局に対して作成され、利用可能になるライセン スの保証すべて、またはこのような所有権の使用に関して、本仕様の実装者ま たはユーザーが一般的なライセンスまたは許可の取得を試みた結果について は、IETFのオンラインIPR保存所 http://www.ietf.org/ipr で取得可能であ る。 IETFは、この規格を実装するために必要とされる技術の範囲にある可能性があ る、すべての著作権、特許または特許アプリケーション、あるいは他の所有権 について、すべての関連団体に対して配慮するよう依頼している。情報につい ては、IETFの ietf-ipr@ietf.org まで連絡されたい。 謝辞 RFC編集職務のための資金は、現在、インターネット協会によって提供されて いる。 ----------------------------------------------------------------------- 本文書は、RFCの原文を元に、株式会社ソフトフロントが日本語に翻訳したもの です。本翻訳物の著作権は、株式会社ソフトフロントが保持しています。ただ し、この権利の設定は原文から新たな翻訳を作成し公開することを妨げるもの ではありません。本翻訳物は、本著作権表示を含めて改変しないことを条件に 再配布を許可します。翻訳の正確さについては一切保証しません。原文とあわ せてご利用ください。 2005年 ----------------------------------------------------------------------- Donovan & Rosenberg Standards Track [Page 27]