RTP、RTCP 与 SRTP 协议详解
本文介绍 RTP(Real-time Transport Protocol) 、RTCP(Real-time Transport Control Protocol) 及 SRTP(Secure RTP) 的定位、RTP 头部与常见载荷类型、RTCP SR/RR 与分组类型、RTP/RTCP 端口对、与 SDP/SIP 的衔接、SRTP 算法与密钥、以及抓包排错要点,内容以 IETF RFC 3550、RFC 3711 为主。适合需要理解实时音视频传输或做 VoIP/流媒体开发的读者;读完可掌握 RTP 头字段、PT 与 Profile、RTCP 反馈含义、SRTP 加密认证及与 SDP 的对应关系。
目录
- [RTP 概述](#RTP 概述)
- [RTP 头部格式](#RTP 头部格式)
- [常见载荷类型与 Profile](#常见载荷类型与 Profile)
- [RTCP 概述与分组类型](#RTCP 概述与分组类型)
- [RTCP SR/RR 字段简表](#RTCP SR/RR 字段简表)
- [RTP/RTCP 端口与会话](#RTP/RTCP 端口与会话)
- [与 SDP/SIP 的衔接](#与 SDP/SIP 的衔接)
- [RTCP 功能与局限](#RTCP 功能与局限)
- [SRTP 协议](#SRTP 协议)
- 常见问题与抓包
- [术语与 RFC 速查](#术语与 RFC 速查)
一、RTP 概述
RTP(Real-time Transport Protocol,实时传输协议) 由 IETF 定义,用于在 IP 网络上承载实时数据 (语音、视频等)。RFC 3550 同时定义了配套的 RTCP;RFC 1889 为其早期版本,已被 RFC 3550 取代。
- RTP 提供序列号、时间戳、载荷类型、SSRC/CSRC 等,便于接收端检测丢包、去抖动、多路同步 ;RTP 不保证 可靠传输或带宽,通常基于 UDP。
- RTP 多与 SDP 、SIP 等配合使用:SDP 描述 RTP 端口与编解码,SIP 建立会话后双方按 SDP 建立 RTP 流。
应用 VoIP/WebRTC/流媒体
RTP/RTCP
UDP
IP
| 项目 | 说明 |
|---|---|
| 标准 | RFC 3550(RTP + RTCP),取代 RFC 1889 |
| 传输 | 通常 UDP,RTP 与 RTCP 各占一个端口 |
| 特点 | 序列号、时间戳、SSRC、载荷类型;不提供可靠性与拥塞控制 |
二、RTP 头部格式
(据 RFC 3550 与《网络协议本质论》第 17 章。)
固定头部(12 字节,必选):
| 位域 | 长度 | 含义 |
|---|---|---|
| V | 2 bit | 版本,当前为 2 |
| P | 1 bit | 填充位:置 1 表示包尾有填充字节 |
| X | 1 bit | 扩展位:置 1 表示固定头后跟扩展头 |
| CC | 4 bit | CSRC 计数,表示其后 CSRC 标识符个数(0~15) |
| M | 1 bit | 标记位,含义由 Profile 定义(如 H.264 中表示帧边界) |
| PT | 7 bit | 载荷类型(Payload Type),标识编码(如 PCMU、H.264) |
| 序列号(SN) | 16 bit | 每发一个 RTP 包加 1,接收端用于检丢包、排序;初值随机 |
| 时间戳 | 32 bit | 该包中第一个字节的采样时刻;会话内单调递增,用于去抖动与音视频同步 |
| SSRC | 32 bit | 同步源标识符,标识该 RTP 流的来源;同一 RTP 会话内唯一,通常随机选取 |
| CSRC 列表 | 0~15 × 32 bit | 贡献源列表,由混合器(Mixer) 插入,标识对该包有贡献的源 SSRC |
可选
固定头12字节
V P X CC
M PT
序列号
时间戳
SSRC
CSRC 列表
扩展头
三、常见载荷类型与 Profile
Payload Type(PT) 在 RTP 头中占 7 bit,用于标识编码格式。RFC 3551 定义了 RTP/AVP (Audio-Video Profile)中的静态映射;动态 PT 由 SDP 的 a=rtpmap 在会话中指定。
| PT(静态示例) | 编解码 | 说明 |
|---|---|---|
| 0 | PCMU (G.711 μ-law) | 8 kHz 语音 |
| 8 | PCMA (G.711 A-law) | 8 kHz 语音 |
| 18 | G.729 | 语音 |
| 31 | H.261 | 视频 |
| 96 等 | 动态 | 由 SDP a=rtpmap 指定(如 H.264、VP8、OPUS) |
Profile :如 AVP (RTP/AVP)、SAVP(RTP/SAVP,安全扩展),定义 PT 语义与可选参数;具体编解码与时钟频率以 SDP 为准。
四、RTCP 概述与分组类型
RTCP 与 RTP 配套使用,在同一会话中通过另一 UDP 端口传输,主要功能包括(RFC 3550):
- 服务质量监视与反馈:丢包率、抖动、往返时延等,供发送端与接收端调整或诊断。
- 媒体间同步:通过时间戳与 NTP 信息实现音视频同步。
- 会话成员标识:携带 SDES 等,标识 RTP 用户源与 CNAME。
RTCP 五种分组类型(RFC 3550):
| 类型 | 名称 | 用途 |
|---|---|---|
| SR | Sender Report | 发送端报告:已发 RTP 包数/字节、NTP/ RTP 时间戳,用于同步与统计 |
| RR | Receiver Report | 接收端报告:丢包、抖动等,向发送端反馈 |
| SDES | Source Description | 源描述:CNAME、NAME、EMAIL 等 |
| BYE | Goodbye | 离开会话 |
| APP | Application-defined | 应用自定义 |
上述分组封装格式类似,均含公共前缀(版本、填充、长度、分组类型、子类型等)及类型相关数据;细节见 RFC 3550。
五、RTCP SR/RR 字段简表
便于对照抓包或实现(RFC 3550)。
SR(Sender Report):发送端报告
| 内容 | 含义 |
|---|---|
| NTP 时间戳 | 墙钟时间,用于与 RR 的 LSR/DLSR 计算 RTT 与同步 |
| RTP 时间戳 | 与 NTP 对应,便于接收端做音视频同步 |
| 发送包数 / 发送字节数 | 该 SSRC 已发送的 RTP 包数与字节数 |
| 可选多个 RR 块 | 对每个接收到的源的接收统计(见下) |
RR(Receiver Report):接收端报告(可单独发 RR 包,也可附在 SR 后)
| 内容 | 含义 |
|---|---|
| SSRC of source | 被统计的发送源 SSRC |
| 丢包率(fraction lost) | 自上次 RR 以来的丢包比例 |
| 累计丢包数 | 该源总丢包数 |
| 最高接收序列号 | 收到的最大 RTP 序列号(可推断丢包) |
| 抖动(jitter) | 到达时间抖动估计值 |
| LSR / DLSR | 上次收到该源 SR 的时间戳 / 自该 SR 以来的延迟,用于发送端算 RTT |
六、RTP/RTCP 端口与会话
(据《网络协议本质论》第 17 章及 RFC 3550。)
- 一个 RTP 会话 由一对目的传输地址(网络地址 + 一对端口)定义。
- RTP 使用偶数 UDP 端口,RTCP 使用相邻奇数 端口(RTP 端口 + 1),构成 RTP/RTCP 端口对。例如 RTP 端口 5004,则 RTCP 端口 5005。
- 这样便于防火墙与 NAT 规则统一放行「一对端口」,也便于实现根据 RTP 端口推导 RTCP 端口。
同一会话
RTP 数据 · 偶数端口
RTCP 控制 · 偶数+1
应用
多流与多会话 :一个 RTP 会话由一对(地址, RTP 端口, RTCP 端口)定义。音视频多路时,可为每种媒体使用不同端口对(SDP 中多个 m=),或同一端口对下用不同 SSRC 区分流;同一会话内 SSRC 唯一。
七、与 SDP/SIP 的衔接
- SDP :
m=audio/m=video给出 RTP 端口(及协议,如 RTP/AVP);a=rtpmap:<pt> <codec>/<clock>定义 PT 与编解码;a=sendrecv等描述方向;可选a=ssrc关联 SSRC。 - SIP:通过 INVITE/200 OK 携带 SDP(offer/answer),双方根据 SDP 确定对端 RTP/RTCP 地址与端口、选定的编解码,然后建立 RTP/RTCP 流;媒体流与信令(SIP)路径可不同。
SIP INVITE/200 OK
SDP m= / a=rtpmap
RTP/RTCP 建链
八、RTCP 功能与局限
功能小结(RFC 3550):
- 向应用提供会话质量或广播质量信息(丢包、抖动等)。
- 标识 RTP 源(SSRC、CNAME 等)。
- 控制 RTCP 发送间隔(带宽占比约 5%,随成员数调整,避免控制流量过大)。
- 传输最小会话控制信息(如 BYE 离开)。
局限 (《网络协议本质论》17.2.8):当大量用户 加入同一会话(如大型组播)时,每个参与者都周期发送 RTCP 包,若设计不当会导致 RTCP 流量泛滥(flooding)。RFC 3550 通过限制 RTCP 带宽占比与随成员数调整发送间隔来缓解,但在极大规模会话中仍需要额外策略(如层级、聚合)。
九、SRTP 协议
SRTP(Secure Real-time Transport Protocol,安全实时传输协议) 在 RTP/RTCP 基础上增加加密、消息认证、完整性保护与重放保护 ,适用于单播与多播实时应用。由 IETF 于 2004 年 3 月发布为 RFC 3711(作者包括思科、爱立信等)。
| 项目 | 说明 |
|---|---|
| 标准 | RFC 3711 |
| 功能 | 对 RTP/RTCP 载荷加密、认证(如 HMAC)、抗重放(序号/滑动窗口) |
| 密钥管理 | RFC 3711 不规定密钥交换,常与 DTLS、SDES、MIKEY 等配合 |
SRTP 不改变 RTP 的头部语义与端口使用方式,主要是在载荷与可选头部上做加密与认证,因此与现有 RTP 会话、SDP 描述可兼容使用。
算法与密钥(RFC 3711):
| 项目 | 说明 |
|---|---|
| 加密 | 默认 AES-128-CM(Counter Mode),可配置其他 |
| 认证 | 默认 HMAC-SHA1(80 bit 标签),用于完整性与会话认证 |
| 抗重放 | 使用 RTP 序列号与滑动窗口拒绝重放包 |
| 密钥派生 | 主密钥 + 盐(salt)派生会话密钥;RFC 3711 不规定密钥交换,DTLS-SRTP(如 WebRTC)常用 DTLS 协商密钥后派生 SRTP 密钥 |
十、常见问题与抓包
- 抓包 :Wireshark 过滤
rtp或rtcp;按 SSRC 过滤可跟踪单路流;查看序列号是否连续(丢包)、时间戳是否单调;RTCP RR 中的丢包率与抖动可辅助诊断。 - 无声音 / 花屏 :确认双方 SDP 中
m=与a=rtpmap是否一致、PT 是否匹配;确认 RTP/RTCP 端口是否被防火墙/NAT 放行;查看 RR 丢包与抖动是否过大;若用 SRTP,确认密钥与算法一致(如 DTLS-SRTP 握手是否成功)。
小结
RTP 在 UDP 上承载实时数据,提供序列号、时间戳、SSRC/CSRC 与载荷类型,用于丢包检测、去抖动与同步;不提供可靠传输与拥塞控制。RTCP 配套传输质量反馈(SR/RR)、源描述(SDES)、BYE 等,RTP 与 RTCP 使用偶数/奇数端口对。与 SDP/SIP 配合时,SDP 描述端口与 PT,SIP 建立会话后按 SDP 建 RTP/RTCP。SRTP 在 RTP/RTCP 上增加加密、认证与抗重放,常与 DTLS 等密钥交换配合。
术语与 RFC 速查
| 术语 | 英文 | 含义 |
|---|---|---|
| RTP | Real-time Transport Protocol | 实时传输协议,RFC 3550 |
| RTCP | Real-time Transport Control Protocol | 实时传输控制协议,与 RTP 配套 |
| SSRC | Synchronization Source | 同步源标识符 |
| CSRC | Contributing Source | 贡献源,由混合器插入 |
| SRTP | Secure RTP | 安全 RTP,RFC 3711 |
| Profile | RTP Profile | 如 AVP/SAVP,定义 PT 语义(RFC 3551) |
| CNAME | Canonical Name | SDES 中源规范名,用于同一用户多流关联 |
| Mixer | RTP Mixer | 混合多路 RTP 为一路,并写入 CSRC 列表 |
| Jitter | 抖动 | 包到达时间变化,RR 中上报 |
RFC 与规范
| 文档 | 内容 |
|---|---|
| RFC 3550 | RTP: A Transport Protocol for Real-Time Applications(含 RTCP) |
| RFC 3551 | RTP Profile for Audio and Video Conferences(AVP 等) |
| RFC 3711 | The Secure Real-time Transport Protocol (SRTP) |
| RFC 5764 | DTLS-SRTP(密钥交换与 SRTP 结合) |
本文内容依据 IETF RFC 3550、RFC 3711 及《网络协议本质论》第 17 章整理。