4. RTSP协议详解

RTSP(Real Time Streaming Protocol,实时流协议)是一个应用层控制协议,用于控制流媒体服务器上的音视频数据。它本身不传输媒体数据,而是像“遥控器”一样,负责建立、播放、暂停和关闭媒体会话。理解 RTSP 的关键,在于掌握它的一组标准请求方法及其响应交互过程。本节将围绕 OPTIONS、DESCRIBE、SETUP、PLAY、PAUSE、TEARDOWN 六个核心方法,结合真实抓包场景,讲清它们的作用、报文格式和典型响应。

一、核心原理:RTSP 是“带外控制”协议

RTSP 的交互模型类似 HTTP:客户端发送请求,服务器返回响应,默认端口为 554。但 RTSP 与 HTTP 有一个本质区别:RTSP 是有状态的。一次完整的推流或拉流会话,会经历从建立到销毁的多个状态,每个请求方法都在推动状态迁移。RTSP 只负责“控制”,真正的音视频数据通常由 RTP/RTCP 承载,通过 SETUP 阶段协商好的传输通道发送。

RTSP 请求报文由请求行、首部字段和消息体组成,请求行格式为:方法 URI RTSP/1.0。响应报文由状态行、首部字段和消息体组成,状态行格式为:RTSP/1.0 状态码 原因短语。所有请求和响应都必须携带 CSeq(命令序列号),用于请求与响应的配对。

RTSP 的六个核心方法可以按会话生命周期排列:OPTIONS(探测能力)→ DESCRIBE(获取媒体描述)→ SETUP(建立传输)→ PLAY(开始播放)→ PAUSE(暂停)→ TEARDOWN(结束会话)。它们不是每次都必须全部出现,但顺序和依赖关系决定了会话能否正确建立。
RTSP 会话生命周期与请求方法交互 RTSP 客户端 RTSP 服务器 OPTIONS rtsp://... RTSP/1.0 200 OK Public: OPTIONS, DESCRIBE, SETUP, PLAY, PAUSE, TEARDOWN DESCRIBE rtsp://... RTSP/1.0 200 OK Content-Type: application/sdp + SDP 描述 SETUP rtsp://.../track1 RTSP/1.0 Transport: RTP/AVP/UDP 200 OK Session: 12345678 Transport: ...client_port=8000-8001 PLAY rtsp://... RTSP/1.0 Session: 12345678 200 OK RTP-Info: url=...;seq=...;rtptime=... PAUSE / TEARDOWN Session: 12345678 200 OK 会话暂停或关闭 探测 描述 建立 播放 控制

二、方法流程:六个请求的职责与报文要点

OPTIONS 是能力探测请求,客户端用它询问服务器支持哪些方法。服务器在响应首部 Public 中列出所有可用方法。这一步不是必须的,但在调试和兼容性验证时非常有用。

DESCRIBE 用于获取媒体描述信息,服务器返回 SDP(Session Description Protocol)文本。SDP 中包含了媒体类型、编码格式、时钟频率、轨道数量等关键参数。客户端只有拿到 SDP,才知道后续 SETUP 要建立几条轨道。

SETUP 是建立传输通道的关键步骤。客户端在请求中通过 Transport 首部指定传输方式(如 RTP/AVP/UDP 或 RTP/AVP/TCP)以及客户端接收端口。服务器在响应中返回 Session 标识符,后续所有请求都必须携带这个 Session ID。每条媒体轨道都需要单独 SETUP 一次。

PLAY 通知服务器开始发送媒体数据。请求中可携带 Range 首部指定播放时间范围。服务器响应中的 RTP-Info 提供了 RTP 序列号和时间戳的起始信息,帮助客户端同步。

PAUSE 暂停媒体流,但保持会话和传输参数不变,之后可以再次 PLAY 恢复。它适合需要临时停止但不想重新协商的场景。

TEARDOWN 终止会话,释放服务器资源。请求中携带 Session ID,服务器响应 200 OK 后,整个 RTSP 会话结束。

OPTIONS rtsp://192.168.1.100:554/live RTSP/1.0
CSeq: 1
User-Agent: LibVLC/3.0.20

RTSP/1.0 200 OK
CSeq: 1
Public: OPTIONS, DESCRIBE, SETUP, PLAY, PAUSE, TEARDOWN

DESCRIBE rtsp://192.168.1.100:554/live RTSP/1.0
CSeq: 2
Accept: application/sdp

RTSP/1.0 200 OK
CSeq: 2
Content-Type: application/sdp
Content-Length: 312

v=0
o=- 0 0 IN IP4 192.168.1.100
s=Live Stream
t=0 0
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000

三、案例场景:一次完整的 RTSP 拉流交互

假设客户端要从 rtsp://192.168.1.100:554/live 拉取一路 H.264 视频流。典型交互如下:

  1. 客户端发送 OPTIONS,确认服务器支持的方法集合。
  2. 客户端发送 DESCRIBE,获取 SDP,得知只有一条视频轨道,编码为 H264,负载类型 96。
  3. 客户端发送 SETUP,指定 Transport: RTP/AVP/UDP;unicast;client_port=8000-8001,服务器返回 Session: 12345678 和服务器端口。
  4. 客户端发送 PLAY,携带 Session ID,服务器开始通过 RTP 向客户端 8000 端口发送视频数据。
  5. 用户点击暂停,客户端发送 PAUSE,服务器停止发送 RTP 包,但保留会话。
  6. 用户关闭播放器,客户端发送 TEARDOWN,服务器释放资源,会话结束。
在实际抓包中,如果 SETUP 之后没有收到 PLAY 响应,但 RTP 数据已经开始发送,说明服务器可能采用了“SETUP 后自动播放”的非标准行为。标准流程仍应以 PLAY 为播放起点。

四、误区与复盘:常见问题与排查思路

常见误区 现象 正确做法
忽略 Session ID PLAY 返回 454 Session Not Found SETUP 响应中的 Session 必须保存,后续请求全部携带
只 SETUP 一条轨道 只有视频没有音频,或播放失败 SDP 中每条 m= 行都要单独 SETUP
DESCRIBE 后直接 PLAY 服务器返回 455 Method Not Valid 必须先 SETUP 建立传输,再 PLAY
PAUSE 后重新 DESCRIBE 会话混乱,资源重复占用 PAUSE 后直接 PLAY 恢复,无需重新协商
不发送 TEARDOWN 服务器会话泄漏,端口长期占用 播放结束主动 TEARDOWN,释放 Session

复盘时,建议用 Wireshark 过滤 rtsp 协议,逐条检查 CSeq 是否连续、Session 是否一致、Transport 端口是否匹配。RTSP 的状态性决定了任何一个环节的缺失都会导致后续请求失败。掌握这六个方法的职责边界和依赖顺序,是排查 RTSP 推拉流问题的基本功。

注意:RTSP 的默认端口是 554,但很多服务器会改用 8554 或其他端口。如果连接被拒绝,先确认端口是否正确,再检查防火墙是否放行 UDP 端口范围(RTP 通常使用偶数端口,RTCP 使用相邻的奇数端口)。