この記事は筆者オンリーのAdvent Calendar 20252日目の記事です。 ここでは、音声通話で使用される RTP / RTCP について、できるだけざっくり・シンプルに解説します。
1. はじめに:RTPとは
RTP(Real-time Transport Protocol)は、
音声・映像などリアルタイム性が必要なメディアを IP ネットワークで運ぶためのプロトコルです。
代表的な用途:
音声通話(VoIP)
ビデオ会議(WebRTC/Zoom など)
SIP 通話の音声・映像
ライブ配信
RTP は単体では動作せず、多くの場合 RTCP(制御用) とセットで使われます。
2. RTPの特徴と設計思想
RTP は TCP のような完全な到達保証は行わず、
リアルタイム性を優先して UDP を使うのが基本です。
特徴:
低遅延
メディア時刻を管理する timestamp
メディア順序を管理する sequence number
端末識別のための SSRC
コーデック非依存(音声/映像を自由に運べる)
「音が多少欠けても遅延しない方が重要」というリアルタイム用途向けの設計。
3. RTPパケットの基本構造
RTPヘッダは 12 バイト(固定)+ 拡張/ペイロード で構成されます。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X| CC |M| PT | sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| synchronization source (SSRC) identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| contributing source (CSRC) identifiers |
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Data |
| .... |
4. 各フィールドの意味
Version (V)
常に 2。RTP のバージョン。
Padding (P)
末尾に不要データ(padding)があるかどうか。
Extension (X)
拡張ヘッダの有無。
CC (CSRC Count)
ミキシング時の音声ソース数(最大 15)。
Marker (M)
コーデック固有用途。
例:音声のフレーム境界、映像のキーフレーム開始など。
Payload Type (PT)
コーデック種別(PCMU=0, PCMA=8, H264=96 など)。
動的ペイロード(96〜127)は SDP で定義される。
Sequence Number
パケット順序管理。
1 ずつ増加するため、欠損(loss)や順序入れ替わりを検知できる。
Timestamp
メディアの時刻基準。
例:音声(8kHz)なら 1ms刻みで 8 増加。
SSRC
送信者識別ID(ランダム)。
同じセッション内でユニークである必要がある。
5. RTPが実際に動くとこうなる(音声例)
音声の例(PCMU / 20ms パケット):
項目 値
コーデック G.711 PCMU
サンプリング周波数 8000 Hz
1パケットあたりの時間 20ms
timestamp の増加量 160 (8kHz × 0.02s)
つまり、RTPの timestamp はこんな感じに増える👇
1パケット目: timestamp=1000
2パケット目: timestamp=1160
3パケット目: timestamp=1320
...
遅延・ジッタの吸収はプレイヤ側(ジッタバッファ)が担当。
6. RTCP(制御プロトコル)も必須
RTPはメディアを運びますが、制御は RTCP が担当。
代表的なRTCPパケット:
SR(Sender Report)
送信者が送出状況を通知
RR(Receiver Report)
受信者が受信状況(loss/jitter)を通知
SDES(Source Description)
名前、CNAMEなどの識別情報
RTPとRTCPはペアで動くことが前提です。
7. SIP/SDPと組み合わせるとどう動く?
SIP(RFC3261)で INVITE → 200 OK → ACK が完了すると、
SDP で交換した情報を元に RTP が開始されます。
SDP例(最小):
m=audio 49172 RTP/AVP 0
a=rtpmap:0 PCMU/8000
意味:
RTPポート : 49172
コーデック : PCMU
サンプリング : 8kHz
SIP はあくまで「線を引く」だけで、
実際の音は RTP/UDP で流れる のがポイント。
8. RTP の注意ポイント(実践的)
① NAT 越えはそのままでは難しい
RTPはUDPなので NAT でポート変換されやすい。
→ STUN/TURN/ICE が必須(WebRTCが採用)。
② パケットロス前提の設計
TCPと違って再送しない。
→ PLC(Packet Loss Concealment)で穴埋めする。
③ 映像はさらに複雑(H.264, VP8, AV1 など)
RTP パケット分割や FU-A などの仕様がある。
④ 暗号化は SRTP を利用
RTPは平文なので、実際の VoIP/WebRTC は
SRTP + SRTCP が標準。
9. 最小コード例(RTPヘッダの生データ)
80 e0 12 34 00 00 04 d2 12 34 56 78
└V2│M│ PT=0 (PCMU)
└──── sequence=0x1234
timestamp=0x000004d2
SSRC=0x12345678
10. まとめ
RTP はリアルタイムメディアを運ぶためのプロトコル
UDP を前提とした低遅延設計
順序番号(seq)と timestamp が重要
SIP/SDP と組み合わせることで音声通話が成立
制御には RTCP が必須
実運用では SRTP や ICE が不可欠