一、协议阐释
在流媒体传输、实时通信等场景中,RTP、RTCP、RTSP、RTMP 是四个非常重要的协议,它们分别承担不同的功能,共同支撑音视频等实时数据的传输与控制。以下从定义、核心功能、工作原理、特点及应用场景等方面详细讲解:
1.1、RTP(Real-time Transport Protocol,实时传输协议)
定义
RTP 是一种用于实时传输音视频等实时数据的协议,由 IETF(互联网工程任务组)定义,主要解决实时数据在网络中传输时的时序、同步、标识等问题。它本身不提供传输可靠性保证,通常依赖底层的 UDP 协议(偶尔也用 TCP,但极少)。
- 核心功能
数据标识与封装:
为音视频数据(如 H.264 视频、AAC 音频)添加头部信息,包括:
· 序列号:用于接收端检测丢包和重排序;
· 时间戳:标记数据产生的时间,用于接收端同步播放(如音画同步);
· 负载类型:标识数据类型(如 H.264、PCM 音频),帮助接收端解析;
· SSRC(同步源标识符):区分不同的数据源(如多人视频会议中不同的发言人)。
实时性优先:
基于 UDP 传输(UDP 无连接、无重传机制),牺牲部分可靠性换取低延迟,适合实时场景(如视频通话、直播)。 - 工作原理
· 发送端:将采集的音视频数据按帧分割,添加 RTP 头部后封装为 RTP 包,通过 UDP 发送;
· 接收端:解析 RTP 包头部,利用序列号重排序、时间戳同步数据,再交给解码器播放。 - 特点
· 不保证可靠传输(丢包、乱序需上层或配套协议处理);
· 灵活支持多种编码格式(通过负载类型字段适配);
·通常与 RTCP 配合使用(依赖 RTCP 获取传输质量反馈)。 - 应用场景
· 实时音视频通话(如 Zoom、微信视频);
· 直播(如游戏直播的实时画面传输);
· 视频会议、IP 电话等。
1.2、RTCP(Real-time Transport Control Protocol,实时传输控制协议)
定义
RTCP 是 RTP 的 “配套控制协议”,与 RTP 协同工作,主要负责监控 RTP 传输质量、反馈信息、同步多源流,确保实时传输的稳定性。
- 核心功能
传输质量监控与反馈:
接收端通过 RTCP 向发送端反馈关键指标,包括:
· 丢包率(接收包数 / 发送包数);
· 网络抖动(数据包到达时间的波动);
· 接收缓冲区状态等。发送端根据反馈调整传输策略(如降低码率、调整帧率)。
同步与标识:
· 提供时钟同步信息,辅助 RTP 解决多源流(如音频和视频)的同步问题;
· 通过 “源描述包”(SDES)传递数据源信息(如用户名、设备标识),方便区分不同发送端。
会话管理:
监控参与会话的节点状态(如加入 / 离开),确保会话稳定性。 - 工作原理
· RTCP 与 RTP 共用会话(同一组 IP 和端口),通常 RTP 使用偶数端口(如 5004),RTCP 使用相邻奇数端口(如 5005);
· 发送端和接收端周期性发送 RTCP 包(频率随会话规模动态调整,避免占用过多带宽);
· 发送端通过 RTCP 反馈调整编码参数或传输策略(如丢包率过高时降低码率)。 - 特点
· 依赖 RTP 存在,无法单独使用;
· 带宽占用低(通常不超过会话总带宽的 5%);
· 被动反馈为主(接收端主动向发送端反馈)。 - 应用场景
所有使用 RTP 的场景都需要 RTCP 配合,如视频会议、实时通话、直播等,用于优化传输质量。
1.3、RTSP(Real Time Streaming Protocol,实时流协议)
定义
RTSP 是一种用于控制音视频流传输的 “远程控制协议”,类似 “流媒体的遥控器”,主要负责发起、暂停、快进、后退等会话控制操作。它本身不传输媒体数据,媒体数据通常通过 RTP/RTCP 传输。
- 核心功能
会话控制:
支持客户端向服务器发送控制指令,包括:
· PLAY(播放)、PAUSE(暂停)、STOP(停止);
· SETUP(建立会话,协商传输方式,如 RTP/UDP 或 RTP/TCP);
· TEARDOWN(终止会话);
· DESCRIBE(获取媒体流描述信息,如编码格式、码率)。
媒体协商:
客户端与服务器协商媒体参数(如编码格式、传输协议),确定后通过 RTP 传输实际数据。 - 工作原理
基于 “客户端 - 服务器” 模型,使用 TCP(默认端口 554)传输控制指令;
流程示例:
· 客户端发送DESCRIBE请求,获取媒体流元数据(如 SDP 格式的描述);
· 客户端发送SETUP请求,协商传输方式(如 RTP 端口、协议);
· 客户端发送PLAY请求,服务器通过 RTP 开始传输媒体数据;
· 客户端可发送PAUSE/STOP暂停或终止传输。 - 特点
· 仅负责控制,不传输媒体数据(媒体数据由 RTP/RTCP 承载);
· 支持双向交互(客户端可控制,服务器也可推送状态);
· 适合 “按需实时流” 场景(如随时暂停、快进)。 - 应用场景
· IP 摄像头、监控系统(用户远程控制摄像头的实时画面播放 / 暂停);
· 视频点播(VOD)的实时控制(如在线课程的暂停、快进);
· 安防监控平台(远程调取摄像头实时画面)。
1.4、RTMP(Real-Time Messaging Protocol,实时消息传输协议)
定义
RTMP 是 Adobe 公司开发的用于音视频和数据实时传输的协议,最初用于 Flash 播放器,后成为流媒体领域的常用协议。它既传输控制消息,也直接传输媒体数据,基于 TCP(默认端口 1935)保证可靠性。
- 核心功能
媒体数据传输:
直接封装音视频数据(如 H.264、AAC)和元数据(如视频分辨率、码率),通过 “消息”(Message)格式传输,支持低延迟(通常 1-3 秒)。
会话控制:
支持连接建立、流发布(如主播推流)、流订阅(如观众拉流)等操作,通过 “命令消息”(Command Message)实现。
协议扩展:
衍生出多个变种,如:
· RTMPE:加密传输(增强安全性);
· RTMPT:封装在 HTTP 中传输(穿透防火墙);
· RTMPS:基于 SSL/TLS 加密的 RTMP(类似 HTTPS)。 - 工作原理
· 基于 TCP 建立持久连接,通过 “握手” 过程确认版本和加密方式;
· 数据分为 “消息”(Message)和 “块”(Chunk):消息是逻辑单元(如一段视频、一条控制指令),块是传输单元(将消息拆分后按固定大小传输,减少开销);
· 支持 “推流”(如主播向服务器发送流)和 “拉流”(如观众从服务器获取流)两种模式。 - 特点
· 基于 TCP,保证数据可靠传输(但可能因重传导致延迟略高,需优化);
· 低延迟性能较好(优于 HLS/DASH 等基于 HTTP 的协议);
· 兼容性强(早期广泛支持,目前仍用于直播推流 / 拉流)。 - 应用场景
· 直播平台(如早期的 YouTube Live、国内直播平台的推流环节);
· 互动直播(如游戏直播、电商直播);
· 实时互动应用(如在线教育的师生互动画面)。
1.5、四者对比与关系总结
协议 | 核心功能 | 传输内容 | 底层协议 | 典型场景 | 与其他协议的关系 |
---|---|---|---|---|---|
RTP | 实时媒体数据传输 | 音视频帧 | UDP 为主 | 视频通话、直播数据传输 | 依赖 RTCP 反馈质量 |
RTCP | 监控 RTP 传输质量、反馈信息 | 控制指令、统计 | UDP 为主 | 配合 RTP 使用 | RTP 的 “控制助手” |
RTSP | 媒体流控制(播放 / 暂停等) | 控制指令 | TCP | IP 摄像头、点播控制 | 媒体数据通过 RTP/RTCP 传输 |
RTMP | 音视频 + 控制消息传输 | 媒体数据 + 指令 | TCP | 直播推流 / 拉流 | 独立协议,不依赖 RTP/RTCP |
1.6、总结
· RTP+RTCP:构成实时媒体传输的 “传输 + 控制” 核心,解决 “怎么传” 和 “传得怎么样” 的问题;
· RTSP:解决 “怎么控制传输” 的问题(如播放 / 暂停),需配合 RTP/RTCP 传输数据;
· RTMP:一套独立的 “传输 + 控制” 方案,适合低延迟流媒体场景,无需依赖其他协议。
理解四者的分工,有助于在流媒体系统设计(如直播、视频会议)中选择合适的协议组合。
二、协议的内容
以下从协议结构、核心字段、工作流程、扩展机制等技术细节层面,进一步深入解析 RTP、RTCP、RTSP、RTMP 协议:
2.1、RTP(Real-time Transport Protocol)
1. 协议结构(RTP 头部)
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC Identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| CSRC List (0 to 15 items) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
RTP 头部最小为 12 字节,可扩展,结构如下(按网络字节序排列):
字段 | 长度(位) | 含义说明 |
---|---|---|
Version(V) | 2 | 版本号,当前为 2(RFC 3550 定义) |
Padding(P) | 1 | 填充位,1 表示包尾部有填充字节(用于对齐加密块) |
Extension(X) | 1 | 扩展位,1 表示头部后有扩展字段(如自定义私有信息) |
CSRC Count(CC) | 4 | CSRC 列表长度(0~15,标识贡献源数量) |
Marker(M) | 1 | 标记位,含义由负载类型定义(如视频帧结束、音频静音开始) |
Payload Type(PT) | 7 | 负载类型,标识数据格式(如 PCMU 音频 = 0,H.264 视频 = 96,动态分配需协商) |
Sequence Number | 16 | 序列号,每发送一个包 + 1,接收端用于检测丢包和重排序(初始值随机) |
Timestamp | 32 | 时间戳,单位由负载类型定义(如音频采样率、视频帧率),用于同步和抖动计算 |
SSRC | 32 | 同步源标识符,随机生成,唯一标识一个数据源(如麦克风、摄像头) |
CSRC List | 32×CC | 贡献源列表,记录对当前数据有贡献的其他源(如混音后的音频源) |
示例:一个 H.264 视频 RTP 包的 PT=96,M=1 表示该包是一帧的最后一个分片,Timestamp 随帧采集时间递增。
2. 负载封装规则
· 对于小于 MTU(通常 1500 字节)的媒体帧(如音频帧):直接封装为一个 RTP 包;
· 对于大于 MTU 的媒体帧(如视频关键帧):需分片封装,通过 RTP 序列号和 M 位标识分片顺序和结束(如 H.264 的 FU-A 分片机制)。
3. 关键机制
· 同步机制:接收端通过 SSRC 区分不同源流(如音频和视频),再通过各自的 Timestamp 计算播放时差,实现音画同步;
· 抖动补偿:接收端维护缓冲区,根据 RTP 包到达时间与 Timestamp 的差值(抖动)动态调整播放延迟,避免卡顿。
4. 扩展与变种
· RTP 扩展头部:通过 X 位启用,可添加私有字段(如传输层时间戳、加密信息);
· SRTP:基于 RTP 的加密扩展(Secure RTP),提供数据机密性、完整性和身份认证(常用于 VoIP、视频会议)。
2.2、RTCP(Real-time Transport Control Protocol)
1. 协议结构(RTCP 包通用头部)
所有 RTCP 包均以 8 字节固定头部开始:
字段 | 长度(位) | 含义说明 |
---|---|---|
Version(V) | 2 | 同 RTP,固定为 2 |
Padding(P) | 1 | 同 RTP,填充位 |
Reception Report Count(RC) | 5 | 接收报告块数量(仅 SR/RR 包有效) |
Packet Type(PT) | 8 | 包类型(如 SR=200,RR=201,SDES=202,BYE=203,APP=204) |
Length | 16 | 包长度(以 32 位字为单位,值 = 实际字节数 / 4 - 1) |
2. 核心包类型及结构
SR(Sender Report,发送端报告):发送端(如服务器)周期性发送,包含自身发送统计:
通用头部(8字节) + SSRC(4字节,发送端标识) + NTP时间戳(8字节,绝对时间) +
RTP时间戳(4字节,与RTP包Timestamp对应) + 发送包数(4字节) + 发送字节数(4字节) +
接收报告块(0~31个,每个24字节,记录对其他源的接收统计)
作用:帮助接收端同步本地时钟(通过 NTP 与 RTP 时间戳映射),监控发送端状态。
RR(Receiver Report,接收端报告):接收端(如客户端)发送,反馈接收质量:
通用头部(8字节) + SSRC(4字节,接收端标识) + 接收报告块(0~31个,每个24字节)
每个报告块包含:
· 源 SSRC(4 字节,目标发送端标识);
· 丢包率(8 位,0~100%);
· 累计丢包数(24 位);
· 最高序列号(32 位,用于计算收到的包数);
· 抖动(32 位,网络延迟波动,单位 RTP 时间戳);
· 最后 SR 时间戳(32 位,最近一次收到 SR 的 NTP 时间戳高 32 位);
· SR 到报告的延迟(32 位,收到 SR 到发送 RR 的时间差)。
SDES(Source Description,源描述):附加数据源的文本信息(如用户名、邮箱、设备名),格式为 “类型 - 长度 - 值”(TLV)。
BYE:通知会话成员离开(可选携带离开原因)。
APP:自定义应用消息(如网络状况告警)。
3. 带宽控制机制
· RTCP 总带宽占用不超过会话总带宽的 5%,其中发送端占用 25%,接收端占用 75%;
· 发送间隔动态调整:会话成员越多,间隔越长(公式:T = 500ms × e^(成员数 / 15),最小 500ms,最大 10s)。
2.3、RTSP(Real Time Streaming Protocol)
1. 协议格式(基于 HTTP/1.1 语法)
· 请求格式:方法 URL RTSP/版本\r\n头部字段\r\n\r\n[消息体]
· 响应格式:RTSP/版本 状态码 原因\r\n头部字段\r\n\r\n[消息体]
2. 核心方法(Method)
方法 | 作用说明 |
---|---|
OPTIONS | 客户端查询服务器支持的方法(如 “OPTIONS rtsp://example.com/stream RTSP/1.0”) |
DESCRIBE | 客户端获取媒体流描述(通常为 SDP 格式,包含编码、轨道、传输方式等) |
SETUP | 建立会话,协商传输参数(如 “Transport: RTP/AVP;unicast;client_port=5004-5005” 指定 RTP 用 5004 端口,RTCP 用 5005) |
PLAY | 启动媒体传输(可带 Range 参数指定播放范围,如 “Range: npt=0-” 表示从开始播放) |
PAUSE | 暂停传输(保留会话状态,可通过 PLAY 恢复) |
TEARDOWN | 终止会话,释放资源 |
ANNOUNCE | 客户端向服务器推送流描述(用于 “推流” 场景,如摄像头向服务器发布实时流) |
GET_PARAMETER | 查询媒体参数(如 “GetParamater: rtsp://…/stream RTSP/1.0” 获取当前码率) |
SET_PARAMETER | 设置媒体参数(如调整音量、帧率) |
3. 会话建立流程(以拉流为例)
OPTIONS:客户端→服务器:“支持哪些方法?” 服务器返回支持的方法列表;
DESCRIBE:客户端→服务器:“给我流的详细信息” 服务器返回 SDP(如:
v=0
o=- 123456 1 IN IP4 192.168.1.100
s=LiveStream
m=video 0 RTP/AVP 96 # 视频流,动态负载类型96(H.264)
c=IN IP4 0.0.0.0
a=rtpmap:96 H264/90000 # 90000为时间戳单位(Hz)
m=audio 0 RTP/AVP 97 # 音频流,动态负载类型97(AAC)
a=rtpmap:97 MPEG4-GENERIC/44100/2
SETUP:客户端→服务器(针对每个媒体轨道):“用 RTP/UDP 传输,我的端口 5004(RTP)和 5005(RTCP)” 服务器确认并分配端口,返回 Session ID;
PLAY:客户端→服务器:“开始传输” 服务器通过 RTP 发送媒体数据,客户端通过 RTCP 反馈;
TEARDOWN:客户端→服务器:“结束会话” 释放资源。
4. 关键特性
· 无状态与会话绑定:RTSP 本身无状态,但通过Session头部字段绑定会话(类似 HTTP Cookie);
· 双向控制:支持服务器主动推送流状态(如 “流中断” 通知);
· 多播支持:SETUP 时可指定multicast参数,实现一对多传输(适合直播)。
2.4、RTMP(Real-Time Messaging Protocol)
1. 协议分层
消息层(Message):逻辑单元,分 5 类:
· 命令消息(Command Message):控制指令(如连接、发布、播放);
· 数据消息(Data Message):元数据(如视频宽高、码率);
· 音频消息(Audio Message):音频帧数据;
· 视频消息(Video Message):视频帧数据;
· 共享对象消息(Shared Object Message):同步客户端与服务器的对象状态(如聊天消息)。
块层(Chunk):传输单元,将消息拆分为 128 字节(默认)的块,减少头部开销。块结构:
基本头(1~3字节):块类型、块流ID(Chunk Stream ID,区分不同消息流)
消息头(0~11字节):根据块类型决定长度,包含消息时间戳、长度、类型ID、消息流ID
扩展时间戳(0~4字节):时间戳超过3字节时使用
块数据( payload ):消息内容分片
2. 握手过程(RTMP 握手需交换 3 个包)
· C0/S0:1 字节,版本号(如 3 表示 RTMP 1.0);
· C1/S1:1536 字节,包含时间戳(4 字节)、随机数(1528 字节)、零填充(4 字节);
· C2/S2:1536 字节,复制对端 C1/S1 的时间戳和随机数,附加本地处理时间。
握手成功后建立持久 TCP 连接,开始传输块数据。
3. 核心工作流程(以直播推流为例)
连接阶段:客户端发送connect命令消息,服务器返回_result确认连接;
发布流阶段:客户端发送publish命令(指定流名),服务器确认后进入推流状态;
数据传输:客户端将音视频帧封装为音频 / 视频消息,拆分块后发送;服务器接收后重组消息,转发给订阅该流的客户端;
断开阶段:客户端发送close命令,释放连接。
4. 变种协议
RTMPE:基于 Adobe 私有加密算法(RC4)加密消息,无需 SSL;
RTMPS:在 RTMP 基础上添加 TLS/SSL 加密(类似 HTTPS),端口 443;
RTMPT:将 RTMP 封装在 HTTP POST 请求中,穿透防火墙(端口 80),延迟较高;
RTMFP:基于 UDP 的 P2P 变种,减少服务器负载(用于低延迟互动场景)。
2.5、总结:技术细节对比
协议 | 核心载体 | 关键标识 / 字段 | 延迟特性 | 典型端口 |
---|---|---|---|---|
RTP | 媒体数据帧 | SSRC、Timestamp、序列号 | 低(依赖 UDP) | 动态分配 |
RTCP | 控制 / 统计信息 | SR/RR 报告、丢包率、抖动 | 辅助 RTP 优化 | RTP+1 |
RTSP | 控制指令 | Session ID、SDP 描述 | 控制指令低延迟 | 554 |
RTMP | 消息 + 块 | 块流 ID、消息类型、Session | 中低(1~3 秒) | 1935 |
这些协议从不同层面解决了实时音视频传输的核心问题:RTP 关注 “数据怎么传”,RTCP 关注 “传得好不好”,RTSP 关注 “怎么控制传”,RTMP 则是 “传输 + 控制” 的一体化方案。实际应用中常根据场景组合使用(如 RTSP+RTP/RTCP 用于监控,RTMP 用于直播推流)。