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的交互流程,我习惯用「五步握手」来记:

  1. OPTIONS:客户端询问服务器支持哪些方法
  2. DESCRIBE:获取媒体描述信息(SDP)
  3. SETUP:建立传输通道,协商端口、传输协议
  4. PLAY:开始播放/推流
  5. TEARDOWN:终止会话

下面这张图,是我每次培训必画的流程:

RTSP五步握手流程 客户端 (Client) 服务器 (Server) ① OPTIONS 询问支持的方法 ② DESCRIBE 获取SDP描述 ③ SETUP 建立传输通道 ④ PLAY 开始推流/播放 RTP/RTCP 媒体数据传输 ⑤ TEARDOWN 终止会话 关键点: 每个请求必须携带递增的CSeq;SETUP成功后获得Session ID;PLAY之后才传输媒体数据

交互中的关键头字段

头字段 作用 必选/可选
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,服务器肯定不认。