RTSP使用TCP来发送控制命令(OPTIONS DESCRIBE SETUP PLAY),因为TCP提供可靠有序的数据传输,而且TCP还提供错误检测和纠正。
RTSP的报文格式可以参考HTTP的。

RTSP及相关的协议

  • RTSP(Real Time Streaming Protocol–实时流协议,rfc2326)
  • RTP(A Transport Protocol for Real-Time Applications–实时传输协议,rfc3550)
  • RTCP(RTP Control Protocol–RTP控制协议,rfc3550)
  • SDP(Session Description Protocol–会话描述协议,rfc2327)

RTSP,RTP和RTCP的关系

RTSP负责控制命令的交互,发起和终止音视频数据的传输
RTP负责传输音视频数据
RTCP负责RTP的服务质量反馈

控制命令(方法)

OPTIONS

获取服务器支持的命令。例如:

  • OPTIONS
  • DESCRIBE
  • PLAY
  • PAUSE
  • SETUP
  • TEARDOWN
  • SET_PARAMETER
  • GET_PARAMETER

DESCRIBE

获取服务器的媒体描述,通常是SDP格式。
SDP是请求URL对应的媒体资源描述,包括媒体类型,编码,传输协议,IP地址等。
client第一次发送DESCRIBE请求后,server需要对client进行访问认证,通过认证才能继续下一步操作。

访问认证

基本访问认证(Basic access authentication)

对用户名和密码使用可逆的Base64,不安全。
Base64(username:password)

摘要访问认证(Digest access authentication)

client第一次发送DESCRIBE请求时不带授权信息,server返回401并且头部中包括WWW-Authenticate字段
WWW-Authenticate: Digest realm="IP Camera(E9464)", nonce="52e7c86b5394bff687d442b4ae508bd1", stale="FALSE"\r\n
realm是领域,通常是服务器名称或者域名。
nonce是一个随机的字符串,在每个身份验证请求中都会不同。

后续client发送的请求都要带上Authorization字段
Authorization: Digest username="admin", realm="IP Camera(E9464)", nonce="52e7c86b5394bff687d442b4ae508bd1", uri="rtsp://192.168.2.20:554/Streaming/Channels/101", response="2f0af0d795c3130df66e2804b5d912b6"\r\n
response计算方法如下:

HA1 = MD5(username:realm:password) HA2 = MD5(method:digestURI)response = MD5(HA1:nonce:HA2)

MD5使用32位小写值
MD5在线计算
当用不同的命令请求时需要重新计算response。server也需要用同样的方法计算response,然后校验client发送的response是否正确,正确则认证通过。
response计算demo:

HA1=MD5(admin:IP Camera(E9464):PASSWORD)=da612de35b7b823e1af2caaf1f676a4e
HA2=MD5(DESCRIBE:rtsp://192.168.2.20:554/Streaming/Channels/101)=58d8c440a4ffade157f7b96412bfa6b0
response=MD5(da612de35b7b823e1af2caaf1f676a4e:52e7c86b5394bff687d442b4ae508bd1:58d8c440a4ffade157f7b96412bfa6b0)=df55944f48e68f550abd63c81f0f3c00

rtsp实现中的聚合控制和非聚合控制的区别

在RTSP(实时流传输协议)中,聚合控制和非聚合控制是两种不同的控制模式。它们的区别在于控制的对象和控制的方式。
非聚合控制是指使用单个RTSP会话控制单个媒体流或资源。也就是说,每个媒体流或资源都有一个唯一的RTSP会话,客户端必须发送独立的RTSP命令控制每个媒体流或资源。这种方式需要使用多个RTSP会话来控制多个媒体流或资源,带来了额外的开销和延迟。这种方式适用于每个媒体流或资源都独立于其他流或资源的情况下。
聚合控制是指使用单个RTSP会话控制多个相关的媒体流或资源。也就是说,多个媒体流或资源共享一个RTSP会话,客户端可以使用一个RTSP会话来控制多个媒体流或资源。这种方式可以减少开销和延迟,并且使多个媒体流或资源之间的同步更加容易。这种方式适用于多个媒体流或资源彼此关联,需要进行同步控制的情况下。
因此,聚合控制和非聚合控制是根据媒体流或资源之间的关联性来选择的不同控制模式,可根据实际情况进行选择。
抓包中视频流和音频流共享一个会话,属于聚合控制。

SETUP

指定某个媒体流要怎么传输。每一个流发送一个SETUP命令,视频流一个SETUP,音频流一个SETUP。


client发送的头部指定了client使用的传输参数:包括传输层协议(UDP或TCP),RTP和RTCP的端口号。
RTP端口是一个偶数,RTCP端口是RTP端口加1。
server会返回server使用的端口号,会话ID,ssrc。
注意第一次SETUP请求后server返回了会话ID,第二次SETUP请求时使用该会话ID,意思是两个媒体流共享同一个会话,除非server不支持聚合操作。

PLAY

client请求:
client发送PLAY请求,告诉server以SETUP中指定的方式开始发送数据。
client必须等到所有的SETUP响应成功才能发送PLAY请求。
其中Range字段指定播放的开始时间和结束时间。
server返回:
RTPInfo字段中,用分号分割媒体流,用逗号分割每个媒体流里的字段

  • url表示媒体流地址
  • seq表示该媒体流第一个RTP包的序号
  • rtptime表示开始位置的rtp时间戳


抓包



可以看到在SETUP命令client分别为视频流和音频流发起RTP和RTCP请求

参考

https://zhuanlan.zhihu.com/p/478736595