この記事は筆者オンリーのAdvent Calendar 20252日目の記事です。 SIPのプロトコルであるRFC3261についざっくり書いてみます。
1. はじめに:SIPとRFC3261とは
SIP(Session Initiation Protocol)は、IPネットワーク上で音声・映像などのリアルタイムセッションを開始・変更・終了するためのシグナリングプロトコルです。
VoIP、ビデオ会議、IMS/VoLTE など幅広く利用されています。
RFC 3261 は、この SIP のコア仕様を定めた文書で、
どんなメソッドがあるか
どんなヘッダがあるか
どんな順番でやり取りされるか(コールフロー)
といった内容がまとめられています。
この記事では RFC3261 の中でも特に「最小限で通話ができる部分」だけに絞って解説します:
INVITE → 200 OK → ACK で通話確立
BYE → 200 OK で通話終了
おまけ:REGISTER で端末の位置登録
2. SIPの登場人物(UA / Proxy / Registrar)
User Agent (UA)
エンドポイントとなる電話機・ソフトフォン・PBX など。
リクエストを出すとき → UAC (User Agent Client)
リクエストを受けるとき → UAS (User Agent Server)
Proxy Server
リクエストを転送する中継ノード。
ルーティングやポリシー適用などを担当。
Registrar / Location Server
REGISTER を受けて、
「このSIP URI が今どのIP/ポートにいるか」
を保存する役割。
3. SIPメッセージのざっくり構造
SIPはHTTPライクなテキストプロトコルです。
INVITE リクエスト例
INVITE sip:bob@example.com SIP/2.0
Via: SIP/2.0/UDP pc33.example.com;branch=z9hG4bK776asdhds
From: "Alice" <sip:alice@example.com>;tag=1928301774
To: <sip:bob@example.com>
Call-ID: a84b4c76e66710@pc33.example.com
CSeq: 314159 INVITE
Contact: <sip:alice@pc33.example.com>
Content-Type: application/sdp
Content-Length: 142
v=0
o=alice 2890844526 2890844526 IN IP4 pc33.example.com
s=-
c=IN IP4 192.0.2.1
t=0 0
m=audio 49172 RTP/AVP 0
a=rtpmap:0 PCMU/8000
ポイント:
1行目:メソッド Request-URI SIP/2.0
続くのがヘッダ(Via, From, To, Call-ID, CSeq…)
空行の後に SDP(メディア情報)が入る
4. よく出てくるメソッド(INVITE / ACK / BYE / REGISTER)
INVITE
通話開始(セッション開始)の要求。SDP を同梱するのが一般的。
ACK
INVITE の**最終応答(200〜6xx)**に対する確認用メッセージ。
※ INVITE 専用メッセージである点が重要。
BYE
既に確立した通話の終了。呼の発信/着信どちらからでも送れる。
REGISTER
端末の現在位置を Registrar に登録する。
5. 基本コールフロー
INVITE → 180 Ringing → 200 OK → ACK
最小構成の2者間通話の流れは次のとおり:
Alice (UA) Bob (UA)
| |
|---------- INVITE ------------------>|
|<--------- 100 Trying ---------------|
|<--------- 180 Ringing -------------|
|<--------- 200 OK ------------------|
|---------- ACK -------------------->|
|===== RTP (音声/メディア) ========>
各ステップの意味
INVITE
通話要求。通常SDPを含む。
100 Trying(任意)
「処理中」を示す暫定応答。
180 Ringing
相手端末が鳴動中であることを通知。
200 OK
通話受諾。SDP返答でメディア条件が決まる。
ACK
200 OK を受領したことを通知。
→ これでセッション(ダイアログ)成立。
RTP(メディア)
SIPはシグナリングのみ。音声はRTPで流す。
6. セッション終了フロー:BYE → 200 OK
通話の切断は非常にシンプル:
Alice (UA) Bob (UA)
|===== RTP (会話中) ==========>|
| |
|----------- BYE -------------->|
|<---------- 200 OK-------------|
| |
ポイント:
BYE はどちら側からでも送れる
BYE → 200 OK では ACK は不要(INVITE のときだけ)
7. おまけ:REGISTER で端末の位置登録
SIP URI と実際の IP/ポートの紐付けを行うために使われます。
REGISTER の典型フロー
UA (Alice) Registrar
| |
|------ REGISTER ---------->|
|<----- 401 Unauthorized ---| (認証要求)
|------ REGISTER (+Auth) -->|
|<----- 200 OK -------------|
この登録情報をもとに、Proxy/Registrar は
INVITE sip:bob@example.com を正しい場所へ転送できます。
8. まとめ
SIPはセッション開始/終了を行うテキストプロトコル
基本コールフロー
INVITE → 200 OK → ACK
メディアはRTP
終了フロー
BYE → 200 OK(ACKなし)
REGISTER は端末の位置登録