1. 课程导入
我记得刚入行那会儿,接手一个监控项目。摄像头推流到服务器,画面总是卡顿、断连。我查了三天,最后发现是RTSP的交互流程没走对——客户端没等服务器回200 OK就开始发数据。嗯,从那以后,我对RTSP协议就再也不敢马虎了。
RTSP(Real Time Streaming Protocol),说白了就是流媒体世界的遥控器。它不负责传视频数据本身,而是负责「播放、暂停、快进、后退」这些控制动作。你想想看,我们看视频时点一下播放按钮,背后就是RTSP在干活。
1.1 RTSP协议概述
RTSP由IETF在1998年标准化(RFC 2326),后来更新到RFC 7826。它是个应用层协议,默认端口554。我习惯把它理解成「流媒体的HTTP」——但千万别真当HTTP用,后面我会讲区别。
核心定位:RTSP是一个带外协议。控制信令走RTSP,媒体数据走RTP/RTCP。两者分离,各司其职。
RTSP支持三种传输模式:
- 单播(Unicast):客户端与服务器一对一,最常见
- 组播(Multicast):一对多,节省带宽,但网络要支持IGMP
- 隧道模式(Tunneled):RTSP over HTTP,用于穿越防火墙
我在项目中遇到过最坑的情况:客户内网禁用了554端口,但RTSP over HTTP就能跑。所以做方案时,端口兼容性一定要提前确认。
1.2 RTSP与HTTP的区别
很多人刚接触RTSP,觉得它跟HTTP长得像——都是文本协议,都有请求/响应,都有类似的状态码。但本质完全不同。
| 对比维度 | RTSP | HTTP |
|---|---|---|
| 协议状态 | 有状态协议(维护会话) | 无状态协议 |
| 核心动词 | SETUP, PLAY, PAUSE, TEARDOWN | GET, POST, PUT, DELETE |
| 数据方向 | 双向(控制+媒体分离) | 请求-响应单向 |
| 连接方式 | 长连接,维持会话 | 短连接为主 |
| 媒体传输 | 通过RTP/RTCP带外传输 | HTTP body内嵌(如HLS) |
| 端口 | 554(默认) | 80/443 |
我的经验:RTSP的「有状态」意味着服务器要记住每个会话的CSeq、Session ID、传输参数。如果服务器重启,所有会话都失效。我曾经因为没做会话持久化,导致推流中断后无法恢复——血的教训。
1.3 RTSP消息格式与交互流程
RTSP消息分两种:请求和响应。格式跟HTTP很像,但多了几个关键字段。
请求消息格式
方法 URI RTSP版本
头字段1: 值1
头字段2: 值2
...
空行
消息体(可选)
举个例子,一个典型的PLAY请求:
PLAY rtsp://example.com/video RTSP/1.0
CSeq: 4
Session: 12345678
Range: npt=10-15
响应消息格式
RTSP版本 状态码 原因短语
头字段1: 值1
头字段2: 值2
...
空行
消息体(可选)
对应的响应:
RTSP/1.0 200 OK
CSeq: 4
Session: 12345678
RTP-Info: url=rtsp://example.com/video/track1;seq=9810;rtptime=3450012
注意:CSeq(序列号)必须严格递增。服务器靠它匹配请求和响应。我见过有人忘了递增CSeq,结果服务器一直返回454(Session Not Found)——其实会话还在,只是序列号乱了。
核心交互流程
RTSP的交互流程,我习惯用「五步握手」来记:
- OPTIONS:客户端询问服务器支持哪些方法
- DESCRIBE:获取媒体描述信息(SDP)
- SETUP:建立传输通道,协商端口、传输协议
- PLAY:开始播放/推流
- TEARDOWN:终止会话
下面这张图,是我每次培训必画的流程:
交互中的关键头字段
| 头字段 | 作用 | 必选/可选 |
|---|---|---|
| CSeq | 请求序列号,请求与响应配对 | 必选 |
| Session | 会话标识,SETUP后获得 | 必选(除SETUP外) |
| Transport | 传输参数(协议、端口、组播地址) | SETUP必选 |
| Range | 播放时间范围(npt=开始-结束) | PLAY可选 |
| User-Agent | 客户端标识 | 可选 |
避坑指南:我曾经在SETUP阶段忘了带Transport头,服务器直接返回461(Unsupported Transport)。Transport头里要明确指定客户端期望的传输方式,比如:Transport: RTP/AVP;unicast;client_port=8000-8001。端口号要成对给——RTP和RTCP各一个。
状态码速查
RTSP状态码跟HTTP类似,但有些是RTSP特有的:
- 200 OK:请求成功
- 301 Moved Permanently:资源地址变了,客户端要重新DESCRIBE
- 454 Session Not Found:会话ID无效或过期
- 455 Method Not Valid in This State:状态不对,比如还没SETUP就PLAY
- 461 Unsupported Transport:传输参数不被支持
- 500 Internal Server Error:服务器内部错误
嗯,454和455这两个状态码,我在调试时遇到最多。454通常是因为Session ID写错了或者会话超时;455则多半是流程顺序搞反了——先PLAY后SETUP,服务器肯定不认。