SETUP请求与响应
SETUP主要用于准备和初始化媒体流的传输,客户端通过SETUP与服务器协商为特定媒体流建立传输会话的详细参数,包括:传输协议(TCP、UDP、TLS等)、传输模式(单播、组播)、端口号、RTP特性(序列号初始值、时间戳基值等)、以及任何所需的会话特性和选项。
一个基本的SETUP请求的格式如下。
SETUP rtsp://example.com/path/to/stream RTSP/1.0
CSeq: <sequence-number>
Transport: <transport-specification>
Other-Header: <value>CRLF
其中,CSeq表示请求的序列号,前面已经介绍过。Transport是SETUP请求的核心部分,详细说明客户端建议的传输参数,其格式如下。
Transport: <protocol>/<profile>/<lower-layer-protocol>;<parameter-key>=<value>[;...]
<protocol>通常是RTP,表示使用实时传输协议。<profile>指的是RTP的特定应用或配置,可取的值为:AVP和SAVP。AVP(Audio Video Profile)定义了RTP负载的特定格式和处理规则;SAVP(Secure Audio Video Profile)使用安全的RTP(SRTP)进行传输,提供了加密和认证功能。lower-layer-protocol为可选字段,指定底层传输协议,比如:TCP、UDP、TLS等。如果未指定,通常默认为UDP。
parameters部分为一系列以分号分隔的键值对,每个键值对表示一个特定的传输参数,常用的参数如下。
unicast或multicast:指定传输方式为单播还是多播。单播是点对点的传输,每个客户端都从服务器接收独立的数据流;多播则是服务器向多个客户端同时发送相同的数据流。若不指定,默认为unicast。
client_port=<start_port>-<end_port>:指定客户端用于接收RTP(和可能的RTCP)数据所预留的端口号范围,服务器将在这个范围内选择一个或多个端口来发送数据。比如:client_port=4588-4589,表示客户端期望在本地端口4588接收RTP媒体数据,在本地4589端口接收RTCP控制数据。对于TCP interleaved模式,这个字段可能不存在。
server_port=<start_port>-<end_port>:服务器用于发送RTP(和可能的RTCP)数据的端口号范围。仅在客户端知道服务器的预期端口时使用,否则由服务器在SETUP响应中指定。
interleaved=<channel-range>:仅适用于TCP模式,指定在TCP连接中RTP和RTCP数据包的交织顺序。比如:interleaved=0-1表示RTP数据使用奇数通道(0),RTCP数据使用偶数通道(1)。
ttl=<time-to-live>:仅适用于组播,设置IP数据包的生存时间(TTL),影响组播数据在网络中的传播范围。
rtcp-mux:可选字段,用于指示RTP和RTCP数据在同一UDP端口上传输,以节省端口资源。
setup=<connection-type>:仅适用于TCP模式,指定TCP连接的建立方式,取值为:active、passive、actpass。
当setup参数设定为active时,客户端表明它将主动发起TCP连接到服务器。这意味着客户端会尝试连接到服务器指定的IP地址和端口上,以建立用于后续RTP和RTCP数据传输的TCP连接。这种模式适用于以下两种情况:一种是客户端位于防火墙或NAT设备之后,且该设备允许客户端发起出站连接;另一种是客户端具备足够的网络权限和能力去直接连接到服务器提供的地址和端口。
当setup参数设定为passive时,客户端请求服务器监听一个TCP端口,等待客户端来建立连接。在这种模式下,客户端不会主动发起连接,而是等待服务器在SETUP响应中提供一个临时的服务器端口供客户端连接。这种模式适用于以下两种情况:一种是服务器位于防火墙或NAT设备之后,且该设备允许外部主机(即客户端)发起入站连接;另一种是由于网络环境或安全策略限制,客户端无法或不适合主动发起到服务器的连接,而服务器具备接受外部连接的条件。
当setup参数设定为actpass时,客户端表示它既愿意主动发起连接,也愿意被动接受连接。这种模式提供了最大的灵活性,允许客户端和服务器根据各自的网络环境和配置动态决定谁来发起TCP连接。在实践中,服务器通常会在SETUP响应中指示客户端应采取何种行为(active或passive)。
ssrc=<ssrc_identifier>:一个32位的数字,客户端建议的同步源标识符,用于唯一标识RTP会话中的媒体流。
下面举几个例子来进行说明。
Transport: RTP/AVP;unicast;client_port=4588-4589
上面的示例表示客户端希望使用RTP/AVP协议通过单播方式接收媒体流,已在本地预留端口4588用于接收RTP数据,端口4589用于接收RTCP控制信息。
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
上面的示例表明客户端希望使用TCP作为底层传输协议,通过TCP连接中的交织通道(interleaved)传输RTP(通道0)数据和RTCP(通道1)数据,且传输模式为单播。
注意:SETUP请求中的Transport字段只是客户端的提议,服务器在响应中可能会接受这些参数、修改部分参数,或者完全拒绝并提供替代方案。客户端需要根据服务器的响应调整其配置,以适应最终确定的传输参数。
服务器接收到SETUP请求后,根据请求中的传输参数建议和自身配置,决定最终的传输参数,并返回响应确认会话的建立情况。
一个基本的SETUP响应的格式如下。
RTSP/1.0 200 OK
CSeq: <sequence-number>
Session: <session-id>
Transport: <final-transport-specification>
Other-Header: <value>CRLF
其中,Session表示会话ID。如果这是一个新的会话,服务器会分配一个唯一的会话ID;如果客户端在请求中提供了会话ID,则服务器会确认使用该会话ID。Transport表示服务器确认的最终传输参数。在下面的示例中,我们指定了服务器选择的传输协议、传输模式、目标地址和端口、源地址和端口,以及TCP数据流的交织范围。
RTP/AVP/TCP;unicast;destination=192.0.2.5:6070;source=203.0.113.2:4567;interleaved=0-1
客户端收到SETUP响应后,解析Transport头部以获取最终确认的传输参数,并使用这些参数来配置RTP/RTCP数据流的接收或发送。
PLAY请求与响应
PLAY主要用于客户端请求服务器开始或恢复发送指定媒体流的实时数据,并可以指定开始播放的起始时间、结束时间、播放速度等,以便实现精确的媒体流控制。
一个基本的PLAY请求的格式如下。
PLAY rtsp://example.com/path/to/stream RTSP/1.0
CSeq: <sequence-number>
Range: <playback-range-specification>
Other-Header: <value>CRLF
其中,Range为可选字段,用于指定播放的时间范围。如果省略,服务器将从媒体的开始处播放。Range头使用NTP(网络时间协议)格式,可以指定开始时间和结束时间。比如:“Range: npt=30-60”,表示从媒体的30秒处开始播放,播放到60秒处。如果只有开始时间,比如:“Range: npt=30-”,则表示从30秒处开始播放到媒体结束。
服务器收到PLAY请求后,应开始或恢复向客户端发送指定媒体流的数据,并返回响应确认播放开始情况、提供相关播放信息或报告可能的错误。
一个基本的PLAY响应的格式如下。
RTSP/1.0 200 OK
CSeq: <sequence-number>
Session: <session-id>
Range: <playback-range-specification>
RTP-Info: <rtp-info-specification>
Other-Header: <value>CRLF
其中,Range是可选字段,表示服务器确认的播放范围,可能与请求中的范围相同或有所调整。RTP-Info也是可选字段,用于提供有关RTP流的信息,比如:URL、初始序列号、时间戳等。这个头部在PLAY响应中不是必需的,但如果提供,它将帮助客户端更好地处理接收到的RTP数据包。RTP-Info的示例如下。
RTP-Info: url=rtsp://example.com/path/to/stream;seq=12345;rtptime=1234567890
PAUSE请求与响应
PAUSE主要用于客户端请求服务器暂停发送指定媒体流的实时数据。通过PAUSE请求,客户端可以暂时停止接收媒体流,而不终止整个会话,以便在需要时通过PLAY请求恢复播放。
一个基本的PAUSE请求的格式如下。
PAUSE rtsp://example.com/path/to/stream RTSP/1.0
CSeq: <sequence-number>
Range: <pause-range-specification>
Other-Header: <value>CRLF
其中,Range为可选字段,用于指定暂停的具体时间点。
服务器收到PAUSE请求后,应暂停向客户端发送指定媒体流的数据,并返回响应确认暂停操作的成功执行或报告可能的错误。
一个基本的PAUSE响应的格式如下。
RTSP/1.0 200 OK
CSeq: <sequence-number>
Session: <session-id>
Range: <pause-range-specification>
RTP-Info: <rtp-info-specification>
Other-Header: <value>CRLF
其中,Range为可选字段,用于指定服务器确认的暂停位置,可能与请求中的时间点相同或有所调整。RTP-Info也为可选字段,提供RTP数据流的当前序列号和时间戳信息,帮助客户端确认暂停的确切位置。
客户端收到PAUSE响应后,根据响应状态码和提供的信息,确认暂停操作的成功执行,并做好相应处理(比如:更新用户界面显示暂停状态、记录暂停位置等)。
TEARDOWN请求与响应
TEARDOWN主要用于客户端请求服务器停止发送指定媒体流的数据,并释放与该会话相关的所有资源。通过TEARDOWN请求,客户端可以彻底结束一个RTSP会话,释放服务器和客户端之间的连接、取消媒体流传输,并清理与会话相关的状态。
一个基本的TEARDOWN请求的格式如下。
TEARDOWN rtsp://example.com/path/to/stream RTSP/1.0
CSeq: <sequence-number>
Session: <session-id>
Other-Header: <value>CRLF
服务器收到TEARDOWN请求后,应停止向客户端发送指定媒体流的数据,释放与会话相关的所有资源,并返回响应确认会话结束或报告可能的错误。
一个基本的TEARDOWN响应的格式如下。
RTSP/1.0 200 OK
CSeq: <sequence-number>
Session: <session-id>
Other-Header: <value>CRLF
其中,Session表示会话ID,与TEARDOWN请求中的Session值相对应,确认这是在同一个会话中的响应。但注意:并非所有服务器都会在TEARDOWN响应中包含Session字段。