一、协议阐释
在流媒体传输、实时通信等场景中,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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| synchronization source (SSRC) Identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| contributing source (CSRC) List (0 to 15 items) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
RTP 头部最小为 12 字节,可扩展,结构如下(按网络字节序排列):
字段 | 长度(位) | 含义说明 |
---|---|---|
Version(V) | 2 | 版本号,当前为 2(RFC 3550 定义) |
Padding(P) | 1 | 填充位,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 | 同步源标识符,随机生成,唯一标识一个数据源(如麦克风、摄像头),通常为随机生成的 32 位整数,确保在会话中唯一。 |
CSRC List | 32×CC | 贡献源列表,记录对当前数据有贡献的其他源((如混音场景中,多个音频源混合后,记录每个原始源的 SSRC),最多 15 个 |
示例:一个 H.264 视频 RTP 包的 PT=96,M=1 表示该包是一帧的最后一个分片,Timestamp 随帧采集时间递增。
2. 负载封装规则
· 对于小于 MTU(由底层 UDP 的 MTU 限制,通常不超过 1500 字节)的媒体帧(如音频帧):直接封装为一个 RTP 包;
· 对于大于 MTU 的媒体帧(如视频关键帧):需分片封装,通过 RTP 序列号和 M 位标识分片顺序和结束(如 H.264 的 FU-A 分片机制)。
3. 关键机制
· 同步机制:接收端通过 SSRC 区分不同源流(如音频和视频),再通过各自的 Timestamp 计算播放时差,实现音画同步;
-· 时间戳是 RTP 实现实时同步的核心机制。发送端根据数据的采样时间生成时间戳(如音频每 10ms 采样一次,时间戳增量为采样率 ×10ms);
-· 接收端通过时间戳计算数据的播放顺序和间隔,避免因网络延迟波动导致的播放卡顿(如将先采样的数据先播放)。
· 抖动补偿:接收端维护缓冲区,根据 RTP 包到达时间与 Timestamp 的差值(抖动)动态调整播放延迟,避免卡顿。
4. 丢包与重排序(序列号)
· 序列号从 0 开始,每发送一个报文递增 1;
· 接收端通过序列号检测丢包(如收到序列号 5 后直接收到 7,说明 6 丢失)和重排序(如收到 7 后收到 6,需重新调整顺序)。
5. 多源区分(SSRC 与 CSRC)
· SSRC:每个发送端(如麦克风)生成唯一的 32 位 SSRC,接收端通过 SSRC 区分不同来源的数据流(如会议中区分多个发言人);
· CSRC:当数据经过混合(如音频混音器),混合器会将原始发送端的 SSRC 填入 CSRC 列表,接收端可识别 "贡献源"。
6. 载荷类型标识(PT)
PT 字段值与编码格式的映射需预先协商(如通过 SIP/SDP 协议),例如:
· PT=0:PCMU(G.711 μ-law 音频);
· PT=96:H.264 视频(动态分配,非固定)。
接收端根据 PT 值选择对应的解码器,确保数据正确解析。
7. 扩展与变种
· RTP 扩展头部:通过 X 位启用,可添加私有字段(如传输层时间戳、加密信息);
· 安全扩展 SRTP:基于 RTP 的加密扩展(Secure RTP),提供数据机密性、完整性和身份认证,广泛用于需要安全的场景(如 VoIP、视频会议、金融会议、医疗会诊)。
8. RTP 的工作流程
会话初始化 :通过 SIP、RTSP 等协议协商会话参数(如 IP 地址、端口、编码格式、PT 映射关系等)。
数据封装 :发送端将编码后的实时数据(如音频帧)封装为 RTP 报文(添加头部字段:时间戳、序列号、SSRC 等)。
底层传输 :RTP 报文通过 UDP 发送(通常 RTP 用偶数端口,RTCP 用奇数端口,如 RTP=5004,RTCP=5005)。
接收处理 :接收端解析 RTP 头部,通过序列号重排序、检测丢包,通过时间戳同步播放,通过 PT 字段选择解码器。
控制反馈:RTCP 定期发送统计信息(如丢包率、延迟),发送端根据反馈调整传输策略(如降低码率以减少丢包)。
9、RTCP 的作用(与 RTP 的配合)
RTCP 是 RTP 的 "控制伙伴",主要功能包括:
· 状态反馈 :发送端通过 RTCP 的 RR(接收报告)获取接收端的丢包率、延迟等信息,动态调整发送策略;
· 时钟同步 :通过 SR(发送报告)中的 NTP 时间戳,帮助接收端校准本地时钟,确保音视频同步;
· 会话管理 :通过 SDES(源描述)传递参与者信息(如用户名),通过 BYE 报文通知离开会话。
RTCP 报文的发送频率较低(通常每 5~10 秒一次),且流量远小于 RTP(约占会话总流量的 5%)。
10、RTP 的应用场景
RTP 广泛用于需要实时交互的场景:
· VoIP(网络电话) :如 Skype、Zoom 的语音传输;
· 视频会议 :如 Teams、腾讯会议的音视频传输;
· 实时流媒体 :如直播平台的视频推送(配合 RTSP);
· 在线游戏:如实时语音聊天、游戏画面同步。
11、RTP 与相关协议的关系
RTP 的工作依赖于其他协议的配合,形成完整的实时传输体系:
· 底层传输协议 :通常使用 UDP(用户数据报协议),因 UDP 无连接、低延迟的特性更适合实时场景(TCP 的重传机制会导致延迟增加,不适合实时数据)。
· 控制协议 RTCP :与 RTP 配套使用,负责传输控制信息(如网络状态反馈、时钟同步、参与者管理等),帮助发送端调整传输参数(如码率)。
· 会话初始化协议 :如 SIP(会话初始协议)、RTSP(实时流协议),负责建立和管理 RTP 会话(如协商 IP 地址、端口、编码格式等)。
· 编码协议:RTP 仅封装数据,实际的音视频数据需先经过编码(如 H.264、G.711 等),RTP 报文中的 "载荷类型" 字段会标识编码格式。
12、总结
RTP 是实时数据传输的 "基石",通过头部字段提供时序、同步、标识等关键信息,配合 RTCP 实现动态调整,结合 UDP 满足低延迟需求。其核心价值在于为实时应用提供标准化的封装与控制机制,但不保证可靠性,需依赖上层协议(如应用层重传、FEC 前向纠错)和 RTCP 共同保障传输质量。
了解 RTP 的结构与原理,对于开发实时音视频应用、排查传输问题(如卡顿、不同步)具有重要意义。
2.2、RTCP(Real-time Transport Control Protocol)
1. 协议结构(RTCP 包通用头部)
RTCP 所有包共享一个通用头部,其结构如下(按 32 位字对齐,从左到右为高位到低位):
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 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
所有 RTCP 包均以 8 字节固定头部开始:
字段 | 长度(位) | 含义说明 |
---|---|---|
Version(V) | 2 | 同 RTP,固定为 2,与 RTP 数据包中的该值相同。 |
Padding(P) | 1 | 同 RTP,填充位,若为 1,表示包尾有填充字节,填充的最后八位用于计算应该忽略多少填充字节。 |
Reception Report Count(RC) | 5 | 接收报告块数量(仅 SR/RR 包有效),包含在该数据包中的接收方报告块的数量,有效值为 0 - 31 |
Packet Type(PT) | 8 | 包类型(如 SR=200,RR=201,SDES=202,BYE=203,APP=204) |
Length | 16 | 包长度(以 32 位字为单位,值 = 实际字节数 / 4 - 1),(以 32 位字为单位)减 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)。
4. RTCP 协议详细讲解
功能 :
· 提供数据分发质量反馈 :RTCP 为应用程序提供会话质量或广播性能质量的信息,每个 RTCP 信息包封装发送端和 / 或接收端的统计报表,如发送的包数目、丢失的包数目和包的抖动等,发送端可根据这些反馈调整传输速率。
· 确定 RTP 用户源 :RTCP 为每个 RTP 用户提供一个全局唯一的规范名称(Canonical Name,CNAME)。当 RTP 中的同步源标识符(SSRC)因冲突或程序重启发生改变时,接收者可利用 CNAME 来跟踪参与者,还可用于在相关 RTP 连接中的几个数据流之间建立联系,实现音视频同步。
· 控制 RTCP 传输间隔 :每个对话成员定期发送 RTCP 信息包,随着参与者增加,为防止 RTCP 信息包占用过多网络资源导致拥塞,需限制其流量,一般控制信息所占带宽不超过可用带宽的 5%。应用程序根据参与者总数调整 RTCP 包的发送速率。
· 传输最小进程控制信息 :该功能对于参与者可任意进入和离开的松散会话进程十分有用,可用于传送最少会话控制信息,如在用户界面显示参与者标识。
分组类型:
· 发送端报告(Sender Report,SR) :由发送 RTP 数据报的应用程序或终端发出,用于周期性地向所有接收端报告发送端的信息,包括该 RTP 流的 SSRC、最新产生的 RTP 分组的时间戳和绝对时钟时间、发送的分组数和字节数等。
· 接收端报告(Receiver Report,RR) :由接收但不发送 RTP 数据报的应用程序或终端发出,接收端每收到一个 RTP 流就产生一个 RR 分组,内容包括所收到的 RTP 流的 SSRC、分组丢失率、最后一个 RTP 分组的序号、分组到达时间间隔的抖动等。
· 源点描述(Source Description,SDES) :给出会话中参加者的描述,包含参加者的规范名 CNAME,还可能包括用户名、邮件地址、电话等信息。
· 结束(BYE) :用于通知会话中的其他成员将退出会话。
· 特定应用(APP):使应用程序能够定义新的分组类型,以满足特定的应用需求。
2.3、RTSP(Real Time Streaming Protocol)
1. 协议格式(基于 HTTP/1.1 语法)
RTSP 消息分为请求消息(客户端→服务器)和响应消息(服务器→客户端),格式类似 HTTP,但指令和状态码不同。
· 请求格式:方法 URL RTSP/版本\r\n头部字段\r\n\r\n[消息体]
· 响应格式:RTSP/版本 状态码 原因\r\n头部字段\r\n\r\n[消息体]
请求消息结构:
请求行(Request-Line)
消息头(Headers)
空行(CRLF)
消息体(可选,如SDP数据)
例如:例如:PLAY rtsp://example.com/stream RTSP/1.0
响应消息结构:
状态行(Status-Line)
消息头(Headers)
空行(CRLF)
消息体(可选,如SDP数据或错误信息)
· 状态行格式 :RTSP版本 状态码 原因短语
例如:RTSP/1.0 200 OK
· 常用状态码 :
· 2xx(成功):200 OK(成功)、201 Created(会话建立)。
· 4xx(客户端错误):404 Not Found(流不存在)、405 Method Not Allowed(方法不支持)。
· 5xx(服务器错误):500 Internal Server Error(服务器内部错误)。
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参数,实现一对多传输(适合直播)。
与 RTP/RTCP 的配合
RTSP 负责 "控制"(如启动 / 停止流),RTP 负责 "传输" 媒体数据,RTCP 负责反馈传输质量。
5. RTSP 的主要功能
· 会话建立与终止:通过SETUP指令建立媒体流传输通道,TEARDOWN终止会话。
· 媒体控制:PLAY(播放)、PAUSE(暂停)、STOP(停止)、SEEK(定位播放位置)等。
· 参数协商:协商传输协议(如 RTP/UDP、RTP/TCP)、编码格式(如 H.264、AAC)、端口等。
· 媒体描述获取:通过DESCRIBE指令获取媒体流的元数据(如 SDP 格式的描述)。
6. RTSP 头部结构(通用消息头示例)
RTSP 消息头由多个键值对(Header-Name: value)组成,分为通用头、请求头、响应头和实体头。以下是常见头部字段及结构示例:
头部类型 | 字段示例 | 说明 |
---|---|---|
通用头 | CSeq: 3 | 序列号,匹配请求与响应(递增,确保有序)。 |
Session: 12345678 | 会话标识,SETUP后由服务器分配,用于标识当前会话。 | |
请求头 | Range: npt=0- | 播放范围(如从 0 秒开始播放,npt表示正常播放时间)。 |
Transport: RTP/AVP; unicast; client_port=5004-5005 | 传输协议(RTP/AVP)、模式(单播)、客户端端口(RTP/RTCP 端口)。 | |
响应头 | Content-Type: application/sdp | 消息体格式(如 SDP 描述媒体信息)。 |
Server: Wowza Streaming Engine | 服务器标识。 |
7. RTSP 通信流程示例(简化)
· 客户端发送OPTIONS→服务器返回支持的方法(如PLAY、SETUP)。
· 客户端发送DESCRIBE→服务器返回 SDP(包含媒体编码、流地址等)。
· 客户端发送SETUP→服务器确认传输通道(分配会话 ID、协商端口)。
· 客户端发送PLAY→服务器通过 RTP 开始传输媒体流。
· 客户端发送PAUSE→服务器暂停传输。
· 客户端发送TEARDOWN→服务器终止会话。
RTSP 头部结构图(请求消息示例)
以下是一个PLAY请求的头部结构示意图,展示了请求行、通用头、请求头的组织方式:
// 请求行
PLAY rtsp://example.com/live/stream RTSP/1.0\r\n
// 消息头(键值对)
CSeq: 4\r\n // 序列号(匹配响应)
Session: 789abcdef\r\n // 会话ID(SETUP时分配)
Range: npt=30-\r\n // 从30秒开始播放
User-Agent: VLC/3.0.18\r\n // 客户端标识
// 空行(结束头部)
\r\n
// 消息体(可选,此处无内容)
其中,\r\n是换行符,用于分隔字段和结束头部。响应消息结构类似,仅将请求行替换为状态行(如RTSP/1.0 200 OK\r\n)。
RTSP 通过上述结构和流程,实现了对实时媒体流的灵活控制,广泛应用于 IP 摄像头、视频监控、流媒体播放等场景。
2.4、RTMP(Real-Time Messaging Protocol)
RTMP 是由 Adobe 公司开发的一套用于实时数据传输的协议,最初用于 Flash 播放器与服务器的音视频交互,后被广泛应用于直播、视频点播等场景。它支持低延迟的媒体流传输,可直接传输音频、视频及元数据(如字幕、时间戳),并包含一套完整的握手、消息封装和流控制机制。
协议结构
1. RTMP 的核心特点
基于 TCP 的可靠传输
· 依赖 TCP 协议(默认端口 1935),确保数据有序、无丢失(通过重传机制),适合对稳定性要求高的场景(如直播)。
多数据流复用
· 支持在单一 TCP 连接中传输多个流(如视频流、音频流、控制流),通过Chunk(分块)机制复用,提高传输效率。
低延迟优化
· 相比 HTTP 流(如 HLS),RTMP 延迟通常可控制在 1-3 秒,适合互动直播(如弹幕、连麦)。
支持多种数据类型
· 媒体数据(视频:H.264/H.265;音频:AAC/MP3)、控制指令(如播放、暂停)、元数据(如编码信息、时长)。
客户端 - 服务器架构
· 包含 "客户端→服务器"(发布流)和 "服务器→客户端"(拉取流)两种模式,支持推流(如主播推流到服务器)和拉流(如观众从服务器拉取)。
2. RTMP 的核心组成
RTMP 协议栈可分为握手层、消息层和分块层(Chunk Layer),各层功能如下:
握手层(Handshake)
· 建立 TCP 连接后,客户端与服务器需完成三次握手(C0/C1、S0/S1、C2、S2),交换协议版本、时间戳、随机数据等信息,确认双方兼容性。
消息层(Message Layer)
定义数据的逻辑结构,每个消息包含消息类型(如视频、音频、命令)、时间戳、流 ID(标识不同流)和 ** payload**(实际数据)。
· 命令消息(Command Message):控制指令(如连接、发布、播放);
· 数据消息(Data Message):元数据(如视频宽高、码率);
· 音频消息(Audio Message):音频帧数据;
· 视频消息(Video Message):视频帧数据;
· 共享对象消息(Shared Object Message):同步客户端与服务器的对象状态(如聊天消息)。
分块层(Chunk Layer)
· 为适应 TCP 传输,将消息拆分为更小的Chunk(分块,默认最大 128 字节),减少头部开销。通过 Chunk Header 标识分块所属的消息,实现数据复用和流量控制。
基本头(1~3字节):包含Chunk Stream ID(CSID,标识分块流,区分不同消息流,用于复用)和Chunk Type(分块类型,决定消息头部的长度)
消息头(0~11字节):根据块类型Chunk Type决定长度,包含消息时间戳、长度、类型ID、消息流ID,用于还原原始消息。
扩展时间戳(0~4字节):时间戳超过3字节时使用,当时间戳超过0xFFFFFF(约 4.29 秒)时,额外存储的完整时间戳。
块数据( payload ):消息内容分片,长度不超过Chunk Size(默认 128 字节,可通过协议控制消息修改)。
RTMP 头部结构图(分块头部示例)
RTMP 的核心头部是Chunk Header,其结构因Chunk Type不同而变化(共 4 种类型)。以下以最完整的Type 0(首次传输消息的分块)为例,展示头部结构:
// 基本头部(Basic Header,2字节示例,CSID=3)
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+---------------+---------------+
| 0 0 0 0 0 0 1 1 | CSID=3 | // 前2位为00(Type 0),后6位+第2字节共14位表示CSID
+---------------+---------------+
// 消息头部(Message Header,11字节)
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+---------------+---------------+---------------+---------------+
| Timestamp (3字节) | // 消息时间戳(如0x00012345)
+---------------+---------------+---------------+---------------+
| Payload Length (3字节) | // 消息总长度(如0x000A0000,655360字节)
+---------------+---------------+
| Message Type ID (1字节) | // 消息类型(如0x09表示视频)
+---------------+---------------+---------------+---------------+
| Message Stream ID (4字节,小端序) | // 消息流ID(如0x00000001)
+---------------+---------------+---------------+---------------+
// 扩展时间戳(4字节,可选)
0 1 2 3 4 5 6 7 ...(共4字节)
+---------------+...
| Extended Timestamp (完整4字节) | // 当Timestamp字段为0xFFFFFF时,此处存储实际时间戳
+---------------+...
// Chunk Data(数据部分,长度≤Chunk Size)
+---------------+...
| Chunk Data (消息片段) | // 拆分后的音视频数据或命令数据
+---------------+...
分块头部类型说明
· Type 0 :完整头部(11 字节消息头部),用于首次传输一个新消息的分块。
· Type 1 :省略Message Stream ID(7 字节消息头部),用于同一消息的后续分块(时间戳为相对值)。
· Type 2 :仅包含时间戳增量(3 字节),用于同一消息且payload长度和消息类型不变的分块。
· Type 3:无消息头部,仅依赖基本头部,用于同一消息且所有参数不变的分块(最高效)。
3. RTMP 的消息类型与结构
RTMP 消息是数据传输的基本单元,结构如下:
字段 | 长度(字节) | 说明 |
---|---|---|
消息类型 ID | 1 | 标识消息类型:1-7:协议控制消息(如设置_chunk_size);- 8-9:音频 / 视频数据;- 15-20:命令消息(如connect、play)。 |
payload 长度 | 3 | 消息体(payload)的字节数(大端序)。 |
时间戳 | 4 | 消息生成的时间戳(毫秒),用于音视频同步。 |
消息流 ID | 3 | 标识消息所属的流(如不同的直播流),大端序,可自定义。 |
payload | 可变 | 实际数据(如视频帧、音频帧、命令 JSON)。 |
4. 握手过程(RTMP 握手需交换 3 个包)
· C0/S0:1 字节,版本号(如 3 表示 RTMP 1.0);
· C1/S1:1536 字节,包含时间戳(4 字节)、随机数(1528 字节)、零填充(4 字节);
· C2/S2:1536 字节,复制对端 C1/S1 的时间戳和随机数,附加本地处理时间。
握手成功后建立持久 TCP 连接,开始传输块数据。
5. RTMP 的典型通信流程
① TCP 连接建立 :客户端与服务器建立 TCP 连接(默认端口 1935)。
② 握手 :交换 C0/C1、S0/S1、C2/S2 数据包,确认协议版本(如 RTMP 1.0)。
③ 连接与流初始化:
· 客户端发送connect命令→服务器返回连接成功_result(含服务器信息)。
· 客户端发送createStream命令→服务器分配流 ID。
④ 推流 / 拉流:
· 推流:客户端通过publish命令发布流(指定流名),服务器确认后进入推流状态,开始发送音视频 Chunk。
· 拉流:客户端通过play命令请求拉流,服务器开始发送音视频 Chunk。
⑤ 流控制 :通过setChunkSize(修改分块大小)、acknowledgement(确认接收)等协议控制消息调整传输参数。
⑥ 断开连接:客户端发送closeStream和disconnect命令,终止会话。
6. 变种协议
· 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 用于直播推流)。