本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
SIP (Session Initiation Protocol)の基本解説 – RFC 3261準拠
背景
Session Initiation Protocol (SIP) は、VoIP(Voice over IP)やマルチメディア通信において、セッションの確立、変更、終了を制御するためのアプリケーション層のシグナリングプロトコルです。インターネット上でのリアルタイム通信の基盤として広く採用されており、HTTPに類似したテキストベースのメッセージングとクライアント-サーバモデルを特徴とします。
SIPは、IETFによって標準化されており、その主要な仕様は2002年6月に発行されたRFC 3261「SIP: Session Initiation Protocol」に定義されています[1]。このプロトコルは、メディアセッション自体を転送するのではなく、参加者のアドレス解決、能力ネゴシエーション、セッション確立、セッション管理(一時停止、転送、終了など)といった「シグナリング」を担当します。実際のメディアデータ(音声やビデオなど)の転送には、通常、Real-time Transport Protocol (RTP) が用いられ、セッションの内容(コーデック、ポート番号など)はSession Description Protocol (SDP) で記述されます[4]。
設計目標
RFC 3261に記載されているSIPの主な設計目標は以下の通りです[1]:
参加者の特定と位置特定: ユーザーを特定し、その現在のネットワークアドレスを解決するメカニズムを提供します。
参加者の能力ネゴシエーション: 通信セッションで利用可能なメディアタイプ、コーデック、その他のパラメータを交換し、合意するための手段を提供します。
セッションの確立と管理: セッションの開始、中断、再開、変更、終了といったライフサイクル全体を管理します。
ユーザーの可用性: 呼び出されたユーザーが通信に応答できる状態にあるかを判断します。
拡張性: 将来の機能追加や新しいサービスへの対応が容易なように、シンプルなコアプロトコルと拡張メカニズムを提供します。
スケーラビリティ: 大規模なネットワークや多くのユーザーに対応できるよう設計されています。
トランスポート非依存性: UDP、TCPなど、様々なトランスポートプロトコル上で動作できます。
詳細
プロトコルスタックにおける位置付け
SIPはTCP/UDPの上で動作するアプリケーション層プロトコルです。OSI参照モデルではL7に位置し、実際のメディア転送を担うRTP/RTCPやセッション記述を行うSDPと連携します。
graph TD
A["アプリケーション"] --> B[SIP/SDP]
B --> C[RTP/RTCP]
C --> D[UDP/TCP]
D --> E[IP]
E --> F["データリンク層"]
F --> G["物理層"]
SIPのアーキテクチャ
SIPは主に以下のコンポーネントで構成されます[1]:
User Agent (UA): SIP通信のエンドポイントであり、ユーザーの代わりにSIPセッションを開始、受信、および終了します。
User Agent Client (UAC): SIPリクエストを開始するエンティティです。
User Agent Server (UAS): SIPリクエストを受信し、応答するエンティティです。
Proxy Server: UACから受信したリクエストを他のSIPサーバまたはUASに転送する中間サーバです。ルーティング、認証、アカウンティングなどの機能を提供できます。ステートフルまたはステートレスに動作します。
Redirect Server: リクエストを処理するUASの連絡先URIをUACに返し、UACが直接UASにリクエストを送信するよう指示します。プロキシサーバとは異なり、リクエストを転送しません。
Registrar Server: ユーザーの現在の場所(連絡先URI)をロケーションデータベースに登録するサーバです。REGISTERメソッドを処理します。
graph TD
UAA["User Agent A (UAC)"] --> Proxy1["Proxy Server 1"]
Proxy1 --> Registrar["Registrar Server"]
Registrar --> DB["(Location Database)"]
Proxy1 --> Redirect["Redirect Server"]
Redirect --> UAB["User Agent B (UAS)"]
Proxy1 --> Proxy2["Proxy Server 2"]
Proxy2 --> UAB
メッセージ構造
SIPメッセージは、HTTPと同様にテキストベースで構成されます。メッセージは以下の要素からなります[1]:
開始行 (Start Line):
リクエストの場合: メソッド名、リクエストURI、SIPバージョン(例:
INVITE sip:bob@example.com SIP/2.0)レスポンスの場合: SIPバージョン、ステータスコード、理由フレーズ(例:
SIP/2.0 200 OK)
ヘッダフィールド (Header Fields): 各行が「ヘッダ名: 値」の形式で、メッセージのメタデータ(ルーティング情報、認証情報、セッション情報など)を含みます。
空行: ヘッダフィールドの終わりを示します。
メッセージボディ (Message Body): 通常、SDPなどのセッション記述を含みます。
以下は、典型的なSIP INVITEリクエストの構造例です。
INVITE sip:bob@example.com SIP/2.0 <-- 開始行 (メソッド、宛先URI、SIPバージョン) Via: SIP/2.0/UDP pc33.example.com;branch=z9hG4bK776asdhds <-- Viaヘッダ: メッセージが経由したパス Max-Forwards: 70 <-- Max-Forwardsヘッダ: 最大転送ホップ数 To: Bob <sip:bob@example.com> <-- Toヘッダ: 呼び出し先の表示名とURI From: Alice <sip:alice@example.com>;tag=1928301774 <-- Fromヘッダ: 呼び出し元の表示名とURI Call-ID: a84b4c76e66710@pc33.example.com <-- Call-IDヘッダ: セッションを一意に識別 CSeq: 314159 INVITE <-- CSeqヘッダ: リクエストの順序を管理 (シーケンス番号とメソッド) Contact: <sip:alice@pc33.example.com> <-- Contactヘッダ: 呼び出し元の現在の連絡先URI Content-Type: application/sdp <-- Content-Typeヘッダ: メッセージボディのMIMEタイプ Content-Length: 142 <-- Content-Lengthヘッダ: メッセージボディの長さ v=0 <-- メッセージボディ (SDP) o=alice 2890844526 2890844526 IN IP4 pc33.example.com s=Session media c=IN IP4 pc33.example.com t=0 0 m=audio 49170 RTP/AVP 0 a=rtpmap:0 PCMU/8000
主要メソッドとセッションフロー
SIPは様々なメソッドを定義していますが、主要なものは以下の通りです[1]:
INVITE: セッション確立のためにユーザーを招待します。
ACK: INVITEに対する最終的な応答(2xx成功応答など)を確認します。
BYE: セッションを終了します。
CANCEL: まだ確立されていないセッションに対する保留中のリクエストをキャンセルします。
REGISTER: ユーザーの現在のロケーション情報をRegistrarに登録します。
OPTIONS: サーバーまたはUAの能力を問い合わせます。
以下は、典型的なSIPセッション確立から終了までのシーケンスです。
sequenceDiagram
participant UAC
participant Proxy
participant UAS
UAC ->> Proxy: INVITE sip:bob@example.com
Note over Proxy: ロケーションサービスでbobを探索
Proxy ->> UAS: INVITE sip:bob@example.com
UAS -->> Proxy: 100 Trying (試行中)
UAS -->> Proxy: 180 Ringing (呼び出し中)
Proxy -->> UAC: 180 Ringing
UAS -->> Proxy: 200 OK (SDP) (呼び出し応答、セッション記述含む)
Proxy -->> UAC: 200 OK (SDP)
UAC ->> UAS: ACK (200 OKの確認)
Note over UAC,UAS: これからメディアセッション (RTP/RTCP) が開始
UAC ->> UAS: BYE (セッション終了要求)
UAS -->> UAC: 200 OK (BYEの確認)
Note over UAC,UAS: メディアセッション終了
トランザクションとダイアログ
トランザクション: 1つのSIPリクエストとその最終的な応答、およびそれらの間に発生するすべての一時的な応答を含む、信頼性メカニズムの単位です。SIPは再送メカニズムやタイマーを用いてトランザクションの信頼性を確保します[1]。
ダイアログ: 2つのUser Agent間のピアツーピアのSIPセッションを指します。Call-ID、Toタグ、Fromタグの組み合わせで一意に識別され、このダイアログ内の後続のメッセージ(BYEなど)は同じCall-IDとタグのペアを使用します。ダイアログはセッションの論理的な状態を維持します[1]。
相互運用性
他のプロトコルとの連携
SIPは、それ単独でエンドツーエンドの通信を提供するわけではありません。リアルタイムマルチメディア通信を実現するためには、以下のプロトコルと緊密に連携します。
Session Description Protocol (SDP) (RFC 3264): セッションのメディアタイプ、コーデック、ポート番号、IPアドレス、帯域幅などの詳細情報を記述するために、SIPメッセージのボディとしてSDPデータが埋め込まれます[4]。
Real-time Transport Protocol (RTP) および RTCP (RFC 3550): SIPによって確立されたセッション上で、実際の音声やビデオなどのリアルタイムメディアデータを転送するために使用されます。RTCPはRTPセッションの品質監視と制御を提供します。
HTTPとの比較
| 特徴 | SIP (RFC 3261) | HTTP/1.1 (RFC 9110, RFC 9112) |
|---|---|---|
| 目的 | リアルタイムマルチメディアセッションの制御 | Webコンテンツの取得、汎用的なデータ転送 |
| メッセージ | リクエスト/レスポンス (テキストベース) | リクエスト/レスポンス (テキストベース) |
| メソッド | INVITE, ACK, BYE, REGISTERなど | GET, POST, PUT, DELETEなど |
| ステート | トランザクションはステートフル、プロキシはステートフル/レスレス両方可。ダイアログはステートフル | 基本的にステートレス、セッション管理はCookieなど |
| URIスキーム | sip: または sips: |
http: または https: |
| トランスポート | UDP/TCP (通常5060番ポート) | TCP (通常80/443番ポート) |
| 永続性 | 接続ごとに複数のメッセージ交換(ダイアログ) | 接続ごとに複数リクエスト(HTTP/1.1 Keep-Alive) |
セキュリティ考慮事項
SIPは、悪意のある攻撃に対して脆弱であるため、RFC 3261のセクション23に詳細なセキュリティ考慮事項が記載されています[1]。
盗聴 (Eavesdropping): ネットワーク上で交換されるSIPメッセージやSDP情報を傍受されるリスクがあります。
- 対策:
sips:URIの使用、TLS (Transport Layer Security) または DTLS (Datagram Transport Layer Security) を使用してシグナリングパスを暗号化します。メディアについてもSRTP (Secure Real-time Transport Protocol) を用いて暗号化します。
- 対策:
改ざん (Tampering): メッセージが転送中に変更され、不正な情報が注入される可能性があります。
- 対策: TLS/DTLSによる完全性保護、S/MIME (Secure/Multipurpose Internet Mail Extensions) を用いたメッセージボディの署名・暗号化。
なりすまし (Impersonation): 攻撃者が正当なユーザーやサーバになりすまして通信を行う可能性があります。
- 対策: ダイジェスト認証 (RFC 2617) やクライアント証明書を用いたTLSによる相互認証。
サービス拒否 (DoS) 攻撃: 大量の不正なメッセージを送信することで、SIPサーバやUAをオーバーロードさせ、サービスを停止させる可能性があります。
- 対策: 適切なアクセス制御、レート制限、不正トラフィックのフィルタリング。
リプレイ攻撃 (Replay Attacks): 以前にキャプチャされた有効なメッセージを再送信することで、不正な動作を引き起こす可能性があります。
- 対策: CSeqヘッダやNonce値を用いたダイジェスト認証。SIPメッセージにタイムスタンプを含めることも有効です。
ダウングレード攻撃 (Downgrade Attacks): より強力なセキュリティメカニズムが利用可能な場合でも、攻撃者が通信をより脆弱なメカニズムにダウングレードさせようとする可能性があります。
- 対策: SIPS URIの使用を強制し、安全なトランスポート(TLS)以外の利用を拒否する設定。
実装メモ
SIPの実装には、ネットワーク環境やアプリケーションの要件に応じて以下の点を考慮する必要があります。
MTU (Maximum Transmission Unit) / Path MTU: UDPを使用する場合、MTUを超えるサイズのSIPメッセージはIPフラグメンテーションを引き起こす可能性があります。これはパケットロスやパフォーマンス低下の原因となるため、メッセージサイズを小さく保つか、TCPを使用することを検討します。Path MTU Discovery (PMTUD) を利用して適切なメッセージサイズを決定することも重要です。
HOL blocking回避 (Head-of-Line Blocking): TCPを使用する場合、1つのストリームでパケットロスが発生すると、その後のパケットがすべて停止するHOL blockingが発生する可能性があります。SIPプロキシが多数のセッションを処理する場合、HOL blockingはパフォーマンスに影響を与えます。複数のTCP接続を利用するか、UDPベースのSCTP (Stream Control Transmission Protocol) のようなマルチストリームプロトコルを検討することが回避策となります。
キュー制御と優先度 (QoS): リアルタイム通信であるSIP/RTPは、パケット遅延やジッターに敏感です。ネットワーク機器やOSレベルでのQoS(DiffServ, IntServなど)を設定し、SIPシグナリングやRTPメディアパケットに高い優先度を与えることで、通信品質を確保します。
NAT/ファイアウォール越え: SIPはIPアドレスとポート番号をメッセージボディ(SDP)に含めるため、NATやファイアウォールを越える際に問題が発生しやすいです。
- 対策: STUN (Session Traversal Utilities for NAT)、TURN (Traversal Using Relays around NAT)、ICE (Interactive Connectivity Establishment) (RFC 8445) などのプロトコルを用いて、NAT越えを可能にします[6]。SIPメッセージのViaヘッダに
rportパラメータを追加することも、NATの背後にあるUACへの応答ルーティングを助けます (RFC 3581)[5]。
- 対策: STUN (Session Traversal Utilities for NAT)、TURN (Traversal Using Relays around NAT)、ICE (Interactive Connectivity Establishment) (RFC 8445) などのプロトコルを用いて、NAT越えを可能にします[6]。SIPメッセージのViaヘッダに
タイマー管理: SIPトランザクションは、様々なタイマー (T1, T2, T4など) に基づいて再送やタイムアウトを処理します[1]。これらのタイマーの適切な設定と正確な管理は、プロトコルの信頼性と効率性を確保するために不可欠です。
まとめ
SIP (Session Initiation Protocol) は、RFC 3261によって定義された、リアルタイムマルチメディアセッションの確立、管理、終了のための基盤プロトコルです。HTTPに似たテキストベースのメッセージングと柔軟なアーキテクチャを持ち、UAC、UAS、Proxy、Registrarなどのコンポーネントが連携して動作します。SDPやRTPといった他のプロトコルと組み合わせることで、VoIPやビデオ会議などの多様な通信サービスを実現します。
実装においては、セキュリティ(盗聴、改ざん、なりすまし、DoS攻撃への対策としてのTLS/SRTP、認証)とネットワーク特性(MTU、NAT越え、QoS)を深く考慮することが不可欠です。これらの側面を適切に設計・実装することで、堅牢で信頼性の高いリアルタイム通信システムを構築できます。
参考文献
J. Rosenberg et al., “SIP: Session Initiation Protocol”, IETF RFC 3261, June 2002. https://datatracker.ietf.org/doc/html/rfc3261 (最終アクセス: 2024年7月26日)
A. B. Roach, “Session Initiation Protocol (SIP) Specific Event Notification”, IETF RFC 3265, June 2002. https://datatracker.ietf.org/doc/html/rfc3265 (最終アクセス: 2024年7月26日)
J. Rosenberg, “The Session Initiation Protocol (SIP) UPDATE Method”, IETF RFC 3311, September 2002. https://datatracker.ietf.org/doc/html/rfc3311 (最終アクセス: 2024年7月26日)
J. Rosenberg, H. Schulzrinne, “An Offer/Answer Model with the Session Description Protocol (SDP)”, IETF RFC 3264, June 2002. https://datatracker.ietf.org/doc/html/rfc3264 (最終アクセス: 2024年7月26日)
J. Rosenberg, J. Peterson, “An Extension to the Session Initiation Protocol (SIP) for Symmetric Response Routing”, IETF RFC 3581, August 2003. https://datatracker.ietf.org/doc/html/rfc3581 (最終アクセス: 2024年7月26日)
T. Vijayan et al., “Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal for Offer/Answer Protocols”, IETF RFC 8445, September 2018. https://datatracker.ietf.org/doc/html/rfc8445 (最終アクセス: 2024年7月26日)

コメント