使用抓包学协议-RTSP实时流协议交互流程

RTSP(Real-Time Streaming Protocol,实时流协议) 采用C/S(客户端/服务器)架构,是一种专为实时媒体流控制设计的,用于控制媒体流的如播放、暂停、定位等,广泛应用于视频监控、直播、视频会议等场景。

RTSP协议的控制方法关键字包括"OPTIONS","DESCRIBE","SETUP","PLAY","PAUSE","TEARDOWN"等,各关键字作用如下:

"OPTIONS"关键字:用于发起建立rtsp服务连接,查询服务器支持的方法
"DESCRIBE"关键字:用于发起查询媒体描述信息(SDP内容)
"SETUP"关键字:用于协商媒体流传输端口,分配session会话ID
"PLAY"关键字:下发播放指令
"PAUSE"关键字:下发暂停播放指令,保留会话
"TEARDOWN"关键字:下发终止播放指令,释放会话
"GET_PARAMETER"关键字:查询服务器参数
"SET_PARAMETER"关键字:设置服务器参数

RTSP协议采用sessionID(会话标识)作为每个会话的唯一标识,在产生会话标识后,后续的请求都携带该标识,正常情况下在接到"TEARDOWN"控制方法后sessionID才会释放,如果设置了超时机制,超时未收到响应报文,服务器端主动结束会话,sessionID会自动释放。

下面跟着抓包了解学习RTSP协议

1、连接建立阶段

在连接建立阶段,客户端主动发起"OPTIONS"方法建立连接,去查询服务器支持的方法指令,包括方法关键字,取流的URL,RTSP协议版本信息,信令序号,客户端情况。发送的信令格式如下:

# 客户端发送OPTIONS方法发起连接建立,查询服务器支持的方法
OPTIONS rtsp://192.168.168.2/1.264 RTSP/1.0     #发送方法
CSeq: 2     #信令序号,防止乱序
User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)      #发起访问的代理

服务器端接到"OPTIONS"方法请求后,回复信息里面回携带响应码(响应码标记响应结果是成功还是失败);回应信令的序号,服务器系统时间,服务器支持的方法,返回信令格式如下:

# 服务器端响应支持的方法
RTSP/1.0 200 OK    #响应代码
CSeq: 2            #序列号
Date: Thu, Apr 17 2025 08:15:06 GMT   #系统时间
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER     #支持方法列表

2、媒体信息获取阶段

在媒体信息获取阶段,客户端发起"DESCRIBE"方法指令,并在方法报文里面指定接收SDP应用,发送信息格式如下:

# 客户端发起"DESCRIBE"方法,获取服务器端媒体信息
DESCRIBE rtsp://192.168.168.2/1.264 RTSP/1.0
CSeq: 3
User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp  #指定接收的应用类型为SDP会话描述协议

服务器端在接到"DESCRIBE"方法指令指令后,会按照SDP协议格式提供服务器端的信息,返回信令格式如下:

# 服务器端响应并提供SDP信息
RTSP/1.0 200 OK
CSeq: 3
Date: Thu, Apr 17 2025 08:15:06 GMT
Content-Base: rtsp://192.168.168.2/1.264/
Content-Type: application/sdp
Content-Length: 515

v=0
o=- 1744872627075332 1 IN IP4 192.168.168.2
s=H.264 Video, streamed by the LIVE555 Media Server
i=1.264
t=0 0
a=tool:LIVE555 Streaming Media v2012.08.20
a=type:broadcast
a=control:*
a=range:npt=0-
a=x-qt-text-nam:H.264 Video, streamed by the LIVE555 Media Server
a=x-qt-text-inf:1.264
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:500
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=64001E;sprop-parameter-sets=Z2QAHqzZQKA9sBEAAAMAAQAAAwA8DxYtlg==,aOvjyyLA
a=control:track1

SDP信令解释:

  • v=0:SDP 版本号为 0。
  • o=- 1744872627075332 1 IN IP4 192.168.168.2
    会话创建者信息:
    -:用户名(未指定)1744872627075332:会话 ID1:版本号IN IP4 192.168.168.2:服务器 IP 地址(IPv4)。
  • s=H.264 Video, streamed by the LIVE555 Media Server
    会话名称:由 LIVE555 媒体服务器提供的 H.264 视频流。
  • i=1.264:会话描述。
  • t=0 0:时间范围:0 0 表示会话无时间限制(持续推送)。
  • a=tool:LIVE555 Streaming Media v2012.08.20
    使用的流媒体工具:LIVE555 版本`。
  • a=type:broadcast:流类型为广播(单向传输)。
  • a=control:*:控制 URL 为通配符(*),表示使用 Content-Base 作为基准地址。
  • a=range:npt=0-:时间范围:从 0 开始,无结束时间(实时流)。
  • m=video 0 RTP/AVP 96
    媒体类型为视频,端口
    0(动态分配),传输协议为 RTP/AVP(RTP over UDP),负载类型 96(自定义 H.264 格式)。
  • c=IN IP4 0.0.0.0:连接地址(0.0.0.0 表示由客户端决定)。
  • b=AS:500:带宽限制:500 kbps。
  • a=rtpmap:96 H264/90000
    负载类型
    96 对应 H.264 编码,时钟频率 90000 Hz(标准视频 RTP 时钟)。
  • a=fmtp:96 packetization-mode=1;profile-level-id=64001E;sprop-parameter-sets=Z2QAHqzZQKA9sBEAAAMAAQAAAwA8DxYtlg==,aOvjyyLA
    H.264 的详细参数:
    packetization-mode=1:RTP 分片模式为 1(支持分片传输)。profile-level-id=64001E:H.264 的配置参数(Baseline 级别 3.0)。sprop-parameter-sets:SPS(序列参数集)和 PPS(图像参数集),用于解码器初始化(Base64 编码)。
  • a=control:track1 该视频流的控制路径为 track1

3、媒体流建立协商阶段

在该阶段,客户端主动发起"SETUP"方法,发送客户端的收流方式,指定收流端口信息,发送信令格式如下:

# 客户端发起"SETUP"方法,指定本地的收流端口为22024-22025
SETUP rtsp://192.168.168.2/1.264/track1 RTSP/1.0
CSeq: 4
User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP;unicast;client_port=22024-22025

为什么要开放两个收流端口?在前面我们提到过,RTSP用于信令控制,RTP(实时传输协议)/RTCP(传输控制协议)协议用于媒体流传输,开放的两个端口是分别用于RTP协议传输实时流和RTCP协议用于发送同步和控制信息。

服务器端在接收到"SETUP"方法后,会根据客户端发送的收流端口,提供服务器端的发流端口信息,发流方式,服务器信息等,并生成标识唯一会话的session ID,返回信令格式如下:

# 服务器端回复发流信息和会话ID
RTSP/1.0 200 OK
CSeq: 4
Date: Thu, Apr 17 2025 08:15:06 GMT
Transport: RTP/AVP;unicast;destination=192.168.168.1;source=192.168.168.2;client_port=22024-22025;server_port=6970-6971
Session: 507C2BFF   #生成会话ID

4、媒体播放阶段

在媒体播放阶段,客户端下发"PLAY"指令,并在指令中指定媒体播放的起始时间,发送信令格式如下:

# 客户端发送"PLAY"指令,指定从开始开始播放
PLAY rtsp://192.168.168.2/1.264/ RTSP/1.0
CSeq: 5
User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)
Session: 507C2BFF
Range: npt=0.000-

服务器端收到"PLAY"指令后,会给出取流URL信息,RTP流起始序号,RTP时间戳初始值,返回信令格式如下:

# 服务器端回复RTP流起始编号,起始时间戳信息
RTSP/1.0 200 OK
CSeq: 5
Date: Thu, Apr 17 2025 08:15:06 GMT
Range: npt=0.000-
Session: 507C2BFF
RTP-Info: url=rtsp://192.168.168.2/1.264/track1;seq=3490;rtptime=1914835047

服务器端回复信令后,即开始使用RTP协议按照信令里的端口,RTP起始序号,RTP时间戳开始发送媒体流数据。

5、媒体连接释放阶段

在连接释放阶段,客户端会分为两步:1、RTSP协议发送"TEARDOWN"方法通知服务器释放session ID,2、RTCP协议发送控制信令结束RTP实时流传输,发送信令格式如下:

# 客户端发送"TEARDOWN"方法,通知服务器端停止发流,
TEARDOWN rtsp://192.168.168.2/1.264/ RTSP/1.0
CSeq: 6
User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)
Session: 507C2BFF

服务器端收到"TEARDOWN"方法,释放会话session ID,返回信令格式如下:

# 服务器端响应报文释放会话
RTSP/1.0 200 OK
CSeq: 6
Date: Thu, Apr 17 2025 08:15:07 GMT

RTSP协议是应用层协议,默认使用TCP的554端口进行信令交互,信令交互过程协商的UDP端口用于RTP/RTCP协议传输媒体数据,属于多通道协议(信令通道,数据通道分离)。RTSP协议用于信令控制,传输实现依赖于RTP/RTCP和SDP协议,SDP协议用于描述媒体信息,RTP/RTCP用于媒体数据传输和控制。

原文链接:,转发请注明来源!