RTCP
基本概念
RTCP 是 RTP 的控制協議,用于監控媒體傳輸質量和參與者狀態,并與 RTP 一起工作。RTP 用于傳輸媒體數據(如音視頻),RTCP 則用于傳輸控制信息。
RTCP 通常和 RTP 同時使用,并通過 不同端口(通常 RTP 使用偶數端口,RTCP 使用其下一個奇數端口)。
主要用于:
- 傳輸質量反饋:丟包率、時延、抖動等統計信息。
- 媒體源身份識別:包括 CNAME(Canonical Name)標識每個參與者。
- 帶寬控制:用于避免 RTCP 消息對帶寬占用過大(典型限制為 5%)。
- 多方會話控制:尤其適用于多點會議。
基本結構
每個 RTCP 包由一個公共頭部 + 特定類型的負載數據組成。基本的 RTCP 報文格式如下:
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| RC | PT=SR=200 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- V:版本,通常為2
- P:填充位(padding)
- RC:Reception Report Count,表示包含多少個 reception report block(在 SR/RR 包中)
- PT:Payload Type,表明 RTCP 包類型
- length:包長度(以 32 位字為單位,不包括頭部)
RTCP包類型(Payload Type)
類型 | 名稱 | PT 值 | 用途 |
---|---|---|---|
SR | Sender Report | 200 | 發送端統計信息 |
RR | Receiver Report | 201 | 接收端反饋信息 |
SDES | Source Description | 202 | 源描述(包括 CNAME) |
BYE | Goodbye | 203 | 終止會話 |
APP | Application-defined | 204 | 自定義擴展 |
Sender Report (SR) — PT=200
結構
一個完整的 RTCP SR 包結構如下:
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| RC | PT=SR=200 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of sender |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NTP timestamp, most significant word |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NTP timestamp, least significant word |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| sender's packet count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| sender's octet count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Report block 1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Report block 2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段解釋
字段 | 說明 |
---|---|
V (2 bits) | RTP 版本,固定為 2 |
P (1 bit) | 填充位,最后是否有填充字節 |
RC (5 bits) | 下面附帶的 Reception Report 數量(最多 31 個) |
PT = 200 | Payload Type,200 表示 SR |
Length | 整個 RTCP 包長度(以 32 位字為單位,減1) |
SSRC of sender | 當前發送者的同步源標識 |
NTP timestamp | NTP 格式的時間戳(64 位),用于同步 |
RTP timestamp | 與 NTP 時間同步的 RTP 時間戳(32 位) |
Sender’s packet count | 發送的 RTP 包總數 |
Sender’s octet count | 發送的 RTP 字節總數 |
Report blocks | 針對接收端的報告,最多 31 個,每個包含丟包率、抖動、延遲等統計信息 |
Report Block 格式(每個 24 字節)
包含如下字段:
- SSRC of source
- Fraction lost
- Cumulative number of packets lost
- Extended highest sequence number received
- Interarrival jitter
- Last SR timestamp (LSR)
- Delay since last SR (DLSR)
Receiver Report (RR) — PT=201
結構
RR 包結構和 SR 類似,但沒有發送者統計字段,僅包含一組或多組接收統計報告:
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| RC | PT=RR=201 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of packet sender |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Report block 1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Report block 2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段解釋
字段 | 說明 |
---|---|
V (2 bits) | RTP 版本號,固定為 2 |
P (1 bit) | 填充標志 |
RC (5 bits) | Report Count,表示下面有幾個 report block(最多 31 個) |
PT = 201 | Payload Type,201 表示 RR |
Length | RTCP 包長度(32bit 字為單位,減去1) |
SSRC of sender | 當前報告者(接收端)的 SSRC |
Report blocks | 一個或多個 24 字節的 report block,描述對應源的接收質量 |
Report Block 格式(每個 24 字節)
每個 Report Block 針對一個 RTP 源(發送者)統計信息:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC_1 (源 SSRC) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| fraction lost | cumulative number of packets lost |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| extended highest sequence number received |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| interarrival jitter |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| last SR (LSR) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| delay since last SR (DLSR) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段 | 說明 |
---|---|
SSRC_n | 被監視的發送者(源) SSRC |
fraction lost | 自上次報告后丟失的 RTP 包比例(0-255) |
cumulative number of packets lost | 接收到當前為止丟失的總包數 |
extended highest seq no received | 接收的最大序列號(擴展 32 位) |
interarrival jitter | 包到達間隔抖動 |
last SR (LSR) | 上次收到的 SR 報告的 NTP 時間戳中間 32 位(即 SR 的發送時間) |
delay since last SR (DLSR) | 自從收到上一個 SR 以來的時間(單位為 1/65536 秒) |
SDES
結構
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| SC | PT=SDES=202 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC/CSRC_1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SDES items (可變長) |
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC/CSRC_n |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SDES items |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段解釋
字段 | 說明 |
---|---|
V (2 bits) | RTP 版本號,固定為 2 |
P (1 bit) | 填充位 |
SC (5 bits) | Source Count,本包中包含多少個源(SSRC/CSRC) |
PT = 202 | Payload Type,202 表示 SDES |
length | RTCP 包長度(單位是 32bit 字,減 1) |
SSRC/CSRC | 與該描述項相關的源的 ID |
SDES items | 描述此源的項 |
SDES Item
每個 SDES item 的格式如下:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| item type | length | user data (variable length) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
常見 item types(1 字節):
Type | 名稱 | 說明 |
---|---|---|
1 | CNAME | 參與者唯一標識(必選) |
2 | NAME | 用戶名/顯示名 |
3 | 電子郵件地址 | |
4 | PHONE | 電話號碼 |
5 | LOC | 地理位置 |
6 | TOOL | 使用的工具名(如 FFmpeg) |
7 | NOTE | 備注 |
8 | PRIV | 私有擴展項 |
0 | END | 結束標記,標志該 SDES 項結束 |
示例:
| 1 (CNAME) | 9 | "user@host" |
| 2 (NAME) | 4 | "John" |
| 0 (END) | | |
BYE
結構
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| SC | PT=BYE=203 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC/CSRC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: ... :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| length | optional reason for leaving... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段解釋
字段 | 說明 |
---|---|
V (2 bits) | RTP 協議版本,固定為 2 |
P (1 bit) | 填充標志 |
SC (5 bits) | Source Count,本包中包含多少個 SSRC/CSRC |
PT = 203 | Payload Type,203 表示 BYE |
length | 包長度,以 32bit 字為單位(不含 header 自身) |
SSRC/CSRC | 要離開的同步源(可以多個) |
可選 Reason 字段 | 一個字符串,表示離開原因(可選) 格式為:1字節長度 + UTF-8 字符串 |
示例
一個 BYE 包可能如下:
- SSRC:
0x87654321
- Reason:
"stream ended"
在 Wireshark 中可看到:
RTCP: Goodbye (BYE)SSRC: 0x87654321Reason: stream ended
APP
結構
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| Subtype | PT=APP=204 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC/CSRC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| name (ASCII) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| application-dependent data |
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段解釋
字段 | 含義 |
---|---|
V (2 bits) | RTP 版本號,固定為 2 |
P (1 bit) | Padding 標志位 |
Subtype (5 bits) | 應用自定義子類型(0~31) |
PT (8 bits) | Payload Type,204 表示 APP 包 |
Length (16 bits) | 包長度(以 32bit 字為單位,減 1) |
SSRC | 應用定義者的 SSRC |
Name (32 bits) | ASCII 字母組成的 4 字節標識符(如 "TEST" ) |
Application-dependent data | 由應用定義的任意內容(可變長) |
SRTCP(Secure RTCP)
基本概念
SRTCP 是 RTCP 的 安全擴展協議,用于 加密、消息認證(MAC)以及重放保護,與 SRTP(Secure RTP) 相對,主要用于保障 RTCP 報文的保密性和完整性。
功能 | 描述 |
---|---|
加密(可選) | 加密 RTCP payload(如 Sender Report) |
完整性驗證 | 使用 HMAC(通常為 HMAC-SHA1) |
防重放攻擊 | 使用 SRTCP Index(31 bit 計數器) |
基本結構
原始的RTCP報文:
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| RC | PT=SR=200 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of sender |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
... (RTCP payload)
SRTCP 的格式是在 RTCP 基礎上加入加密、認證和重放保護:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|E| SRTCP index |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication tag (可選,MAC) |
~ ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段說明:
字段 | 長度 | 描述 |
---|---|---|
E(Encryption Flag) | 1 bit | 表示 RTCP payload 是否被加密(1 為加密) |
SRTCP index | 31 bits | 單調遞增的計數器(防重放攻擊、同步) |
Authentication tag | 可選,通常 10/20 字節 | 用于認證的 HMAC,防止篡改 |
示例:SRTCP 報文結構圖(含加密)
+-------------------------------+
| RTCP 原始報文(明文/密文) |
+-------------------------------+
| E | SRTCP index |
+-------------------------------+
| Authentication tag |
+-------------------------------+
-
如果 E=0:RTCP payload 是明文;
-
如果 E=1:RTCP payload 是密文;
-
Authentication tag 總是對前面部分進行 HMAC 計算,用于完整性校驗與認證。
標準文檔
https://datatracker.ietf.org/doc/html/rfc3711
WebRTC中的RTCP和SRTCP
WebRTC中的RTCP
- 默認開啟 RTCP 復用(RTCP-MUX,RFC 5761):音視頻和控制數據共用同一個 UDP 端口
- 使用 RTCP 擴展報文(如 RTP Feedback)實現自適應碼率與擁塞控制
- 可以攜帶統計反饋,供算法調整使用(如 Google Congestion Control)
WebRTC中的SRTCP
- 防止中間人查看控制信令(如 SSRC、網絡狀態)
- 防止偽造控制指令(如虛假 NACK、PLI、BYE)
- 防止重放攻擊干擾會話狀態
DTLS-SRTP
WebRTC 使用如下流程保護媒體:
[RTP/RTCP] -> SRTP/SRTCP 加密 -> 通過 UDP 發送↑DTLS 協議協商密鑰
-
DTLS 協議運行在媒體端口上(UDP),協商密鑰;
-
協商結果用于派生 SRTP/SRTCP 的加密密鑰;
-
然后媒體通過 SRTP 和 SRTCP 加密發送;
-
不會單獨發送明文 RTP/RTCP。