要約

  • RFC 3326 は、SIP 要求が送られた理由を付加できるようにした。理由の値は SIP の状態コード、または電話網との相互接続で使う Q.850 の原因値である。
  • このヘッダーは SIP の処理を変えない。CANCEL は引き続き取消を実行し、Reason は別の枝で通話が成立したことなどを伝える。

一つの枝が応答しても、残りは止めなければならない

プロキシが INVITE を複数の枝へ送る。一つの宛先が 200 OK を返しても、ほかの電話はまだ鳴っているかもしれない。そこでプロキシは残りの枝へ CANCEL を送る。呼び出しを止めるのは SIP の CANCEL というメソッドであり、出来事を説明するヘッダーではない。

2002 年 12 月の RFC 3326 は、その説明を添える方法を定めた。たとえば Reason: SIP;cause=200;text="Call completed elsewhere" である。受信側のサービスは、別の枝で応答があった場合と、応答前に呼が放棄された場合を区別できる。未応答着信の記録や画面表示には影響し得るが、直ちに行われるプロトコル操作は同じだ。

この分離こそ設計の要点である。SIP には応答用の状態コードがあったが、同じ要求でも送信理由は異なり、要求には通常そのきっかけとなった応答が含まれない。Reason は、その理由に基づいて動いた要求に原因を添える。これは説明用のメタデータであって、第二の命令経路ではない。

原因値には出所がある

RFC 3326 はプロトコル名で値の意味を区別する。SIP は cause が SIP 状態コードであることを示し、Q.850 は ITU-T の電話信号方式で使う十進の原因値を示す。ゲートウェイは、従来の電話網での切断理由を SIP メッセージに残せる。数値だけでは不十分であり、プロトコル名が番号体系の出所を示す。

text は人には便利だが、処理上の権限を持たない。原因値は指定されたプロトコルの語彙に属し、実際のメソッド、状態、トランザクション文脈はメッセージが定める。cause=200 を応答そのものと見なしたり、Q.850 の値を SIP の状態と見なしたりすれば、異なる制御面を混同する。

すべての実装が値を理解する保証もない。RFC 3326 は、理解できない値を実装が無視してよいとし、Reason はプロトコル処理に影響しないと明記した。端末が説明を捨てても、要求は SIP の規則どおりに進む。サービスの補助にはなるが、基本的な呼状態の隠れた必須条件にはならない。

フォークが隠す最終応答

この仕様は、分岐時の異種エラー応答問題にも Reason を関連づけた。フォークされた INVITE は枝ごとに異なる最終エラーを受け取ることがある。プロキシは通常、枝の結果を待ってから上流へ何を返すか判断するため、別の枝が保留中の間、重要なエラーが見えなくなることがある。RFC 3326 は、最終状態を暫定応答に包んで伝える用途を候補として挙げた。

「候補」という位置づけは大切だ。どのフォークでもすべてのエラーを見せる保証でも、実サービスが問題を解決したという証拠でもない。Reason は原因を入れる器を提供するだけで、失敗を並べ替える一般方針や SIP 応答処理の代替を規定していない。

後続拡張も境界を保った

RFC 8606 は後に Q.850 原因へ ISUP の位置パラメーターを加え、情報が得られる場合に切断発生地点を残せるようにした。RFC 9366 は同一プロトコル値を一つに限る元の規則を緩和したが、登録されたプロトコルが複数値の意味を定義する場合に限る。いずれも出所を精密にしただけで、Reason を操作そのものにはしていない。

この差はプロトコル史を読むうえでも役立つ。RFC 3087 は Request-URI をローカルなサービス選択の文脈として検討した。RFC 3326 は、すでに選ばれた SIP 操作に原因を添えた。前者は要求の行き先を選び、後者は要求が送られた理由を説明する。どちらも認証、認可、通話履歴全体、後続処理の結果を単独で証明しない。

出典

  1. https://www.rfc-editor.org/rfc/rfc3326.html
  2. https://www.rfc-editor.org/info/rfc3326/
  3. https://www.rfc-editor.org/rfc/rfc3261.html
  4. https://www.rfc-editor.org/rfc/rfc9366.html
  5. https://www.rfc-editor.org/rfc/rfc8606.html
  6. https://www.rfc-editor.org/rfc/rfc5411.html
  7. https://www.rfc-editor.org/rfc/rfc4411.html