实时流协议---RTSP详解

Posted 贺二公子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实时流协议---RTSP详解相关的知识,希望对你有一定的参考价值。

原文地址:https://blog.csdn.net/Chiang2018/article/details/122731197


文章目录

一、RTSP简介

RTSP(Real Time Streaming Protocol 实时流协议)建立并控制一个或几个时间同步的连续流媒体,对媒体流提供了诸如开始、暂停、快进、停止等控制,RTSP的作用相当于流媒体服务器的远程控制,而它本身并不传输数据。

官方指导文档参考:RFC 2326 - Real Time Streaming Protocol (RTSP)

它的语法和运作跟HTTP 1.1类似,但并不特别强调时间同步,所以比较能容忍网络延迟。

RTSP具有重新导向功能,可视实际负载情况来转换提供服务的服务器,以避免过大的负载集中于同一服务器而造成延迟。

RTSP协议与HTTP协议的语法非常类似,且都是纯文本协议,但它们也有区别:

  1. RTSP是有状态的,它命令总是按照顺序来发送,其中某个命令可能需要总在另外一个命令之前要发送。而http则是无状态,协议在发送一个命令以后,连接就会断开,且命令之间是没有依赖性的。
  2. rtsp协议使用554端口,http使用80端口。
  3. RTSP的请求服务器和客户端都可以发送,而HTTP请求则只能由客户端发送

RTSP的有很多优点:

  • 易扩展:RTSP中很容易加入新的方法及参数,只需要服务器和客户端共同协商即可
  • 易解析:RTSP可以由标准HTTP或MIME解析器进行解析
  • 安全:RTSP使用网页安全机制,所有HTTP授权机制如basic、digest都可以直接使用
  • 传输协议多选:RTSP可以使用TCP或UDP作为其底层传输协议支持
  • 多服务器支持:请求的多股流可以放在不同的服务器上,客户端自动与这几个服务器建立连接,在传输时完成媒体流同步

二、RTSP方法

RTSP常用的方法包括:OPTIONS、DESCRIBE、ANNOUNCE、SETUP、TEARDOWN、PLAY、PAUSE、GET_PARAMETER和SET_PARAMETER等。详细使用介绍如下:

方法方向是否必须含义
OPTIONSC->S获在任意时刻由客户端主动发出,取服务器支持的方法。它不影响服务器的状态
DESCRIBEC->S向服务器获取URL指定的媒体对象的描述,其中Accept字段指定了描述格式
ANNOUNCEC->S
S->C
当客户端向服务器发送时,表示的是将通过请求 URL 识别的表示描述或者媒体对象提交给服务器
当服务器向客户端发送时,表示的是通知客户端更新会话信息
SETUPC->S客户端向服务器请求建立会话并准备传输。请求信息主要包括传输协议和客户端的端口号
PLAYC->S客户端主动通知服务器以SETUP指定的机制开始发送数据。其中Range字段指定了播放的起止时间,当多个PLAY请求到达时,服务器会将PLAY请求排成队列,顺序执行,即必须等待第一个PLAY的时间完成后,才会继续处理第二个PLAY消息。
PAUSEC->S客户端请求服务器的媒体流传输临时暂停。可以通过Range参数在指定时间点暂停,也可以指定某股流暂停,例如如果指定音频流暂停,则播放将是无音状态
RECORDC->SRECORD通知服务器方法客户端将会根据之前的描述开始记录媒体数据。 其中timestamp 字段反映开始和结束时间 (UTC)。如果该字段不存在,则会使用媒体描述中的开始或结束时间。 如果会话已经开始,则立即开始录制。
服务器决定是将记录的数据存储在 request-URI 下还是另一个 URI 下。 如果服务器不使用 request-URI,则响应应该是 201(已创建)并包含描述请求状态并引用新资源的实体和 Location 标头。
REDIRECTS->C重定向请求通知客户端它必须连接到另一个服务器位置。 它包含强制标头 Location,它指示客户端应该发出对该 URL 的请求。 它可能包含参数Range,表示重定向何时生效。 如果客户端想要继续发送或接收此 URI 的媒体,客户端必须为当前会话发出 TEARDOWN 请求,并在指定主机上为新会话发出SETUP。
GET_PARAMETERC->S
S->C
GET_PARAMETER 请求检索 URI 中指定的表示或流的参数值。 回复和响应的内容留给实现。 没有实体主体的 GET_PARAMETER 可用于测试客户端或服务器的活跃度(“ping”)。
SET_PARAMETERC->S
S->C
这个方法请求设置演示或URL指定流的参数值。请求仅应包含单个参数,允许客户端决定某个特殊请求为何失败。如请求包含多个参数,所有参数可成功设置,服务器必须只对该请求起作用。服务器必须允许参数可重复设置成同一值,但不让改变参数值。注意:媒体流传输参数必须用SETUP命令设置。将设置传输参数限制为SETUP有利于防火墙。
TEARDOWNC->STEARDOWN请求停止给定URL流发送,释放相关资源。
       

三、RTSP报文解析

RTSP有两类报文:请求报文响应报文。请求报文是指从客户向服务器发送请求报文,响应报文是指从服务器到客户的应答。RTSP报文由三部分组成,即开始行、首部行和实体主体。

1、请求报文

在请求报文中,开始行就是请求行,RTSP请求报文的结构如下图所示:

下面是SETUP请求消息的一个Wireshark抓包,我们以此为例进行报文解析:

从上图的抓包可以明显看出,RTSP的第一行(请求行)的内容包括:

方法名称(SETUP) + 空格 + URL地址 + 空格 + RTSP版本 + 回车符(CR)和换行符(LF)

第二、第三、第四行表示的是该消息的各字段名称及其对应的值:

字段名 + 空格 + 字段值 + 回车符(CR)和换行符(LF)


最后一行则直接为回车符(CR)和换行符(LF),表示本次请求报文结束

2、响应报文

响应报文的开始行是状态行,RTSP响应报文的结构如下图所示:

下面是SETUP响应消息的一个Wireshark抓包,我们以此为例进行报文解析:

从上面的抓包可以看出,RTSP的第一行(状态行)的内容包括:

RTSP版本 + 空格 + 状态码 + 空格 + 状态语 + 回车符(CR)和换行符(LF)

第二、第三、第四、第五行表示的是该消息的各字段名称及其对应的值:

字段名(CSeq:) + 空格 + 字段值 + 回车符(CR)和换行符(LF)


最后一行则也直接为回车符(CR)和换行符(LF),表示报文结束

四、RTSP常用字段含义

  • Accept: 用于指定客户端通知服务器自己可以接受的实体数据结构类型。例如: Accept: application/sdp,之后服务器通过Content-Type字段返回其实体数据结构类型
  • Accept-Encoding:用于客户端通知服务器自己可以接受的数据压缩格式,例如:Accept-Encoding: gzip, compress, br,之后服务器将通过Content-Encoding字段通知客户端它的选择。
  • Accept-Language: 用于客户端通知服务器自己可以理解的语言及其接受度,例如:Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5 ,之后服务器将通过Content-Language字段通知客户端它的选择
  • Authorization:客户端请求消息头含有服务器用于验证用户代理身份的凭证
  • Bandwidth: 用于描述客户端可用的带宽值。例如: Bandwidth: 4000
  • Blocksize:此字段由客户端发送到媒体服务器,要求服务器提供特定的媒体包大小,服务器可以自由使用小于请求的块大小。 此数据包大小不包括 IP、UDP 或 RTP 等低层标头
  • CSeq: 指定了RTSP请求响应对的序列号,对每个包含一个给定序列号的请求消息,都会有一个相同序列号的回应消息,且每个请求或回应中都必须包括这个头字段。
  • Cache-Control:通过指定指令来实现缓存机制。缓存指令是单向的,这意味着在请求中设置的指令,不一定被包含在响应中
  • Conference:通知服务器不得更改同一 RTSP 会话的会议 ID
  • Connection:该字段决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成或者Connection: close。
  • Content-Length:该字段指明在RTSP协议最后一个标头之后的双 CRLF 之后的内容长度。例如在服务器响应DESCRIBE中,指明sdp信息长度
  • Content-Type:告诉客户端实际返回的内容的内容类型
  • User-Agent: 该字段用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。
  • Expires:指明过期的时间
  • Rang: 用于指定一个时间范围,可以使用SMPTE、NTP或clock时间单元。
  • Session: Session头字段标识了一个RTSP会话。Session ID 是由服务器在SETUP的回应中选择的,客户端一当得到Session ID后,在以后的对Session 的操作请求消息中都要包含Session ID.例如:Session: 411B4161;timeout=65
  • Transport: Transport头字段包含客户端可以接受的传输选项列表,包括传输协议,地址端口,TTL等。服务器端也通过这个头字段返回实际选择的具体选项。如: Transport: RTP/AVP/TCP;unicast;destination=192.168.31.222;source=192.168.31.222;interleaved=0-1

五、简单的RTSP交互过程

下面是一个简单的RTSP交互过程,具有一定的代表性:



六、RTSP错误码

RTSP的响应内容通常包含3位整数响应码以及一个原因短语,短语的目的是给出状态代码的简短文本描述, 客户端不需要检查或显示原因短语。 按照响应码的首位数字区别,可以分为以下五个类别:

  • 1xx: 提示- 请求已经收到,正在处理中
  • 2xx: 成功- 请求已经被成功处理
  • 3xx: 重定向- 必须采取进一步行动才能完成请求
  • 4xx: 客户端错误 - 请求中包含错误的参数或语法导致请求无法被满足
  • 5xx: 服务器错误 - 服务器无法满足客户端正确的请求

当然,RTSP的错误码和RTSP方法是强相关的,某些错误可能只会在特定方法中才会触发,详细错误码信息如下:

错误码原因短语方法
100ContinueAll
200SuccessAll
201CreatedRECORD
250Low on Storage SpaceRECORD
300Multiple ChoicesAll
301Moved PermanentlyAll
302Moved TemporarilyAll
303See OtherAll
305Use ProxyAll
400Bad RequestAll
401UnauthorizedAll
402Payment RequiredAll
403ForbiddenAll
404Not FoundAll
405Method Not AllowedAll
406Not AcceptableAll
407Proxy Authentication RequiredAll
408Request TimeoutAll
410GoneAll
411Length RequiredAll
412Precondition FailedDESCRIBE, SETUP
413Request Entity Too LargAll
414Request-URI Too LongAll
415Unsupported Media TypeAll
451Invalid parameterSETUP
452Illegal Conference IdentifierSETUP
453Not Enough BandwidthSETUP
454Session Not FoundAll
455Method Not Valid In This StateAll
456Header Field Not ValidAll
457Invalid RangePLAY
458Parameter Is Read-OnlySET_PARAMETER
459Aggregate Operation Not AllowedAll
460Only Aggregate Operation AllowedAll
461Unsupported TransportAll
462Destination UnreachableAll
500Internal Server ErrorAll
501Not ImplementedAll
502Bad GatewayAll
503Service UnavailableAll
504Gateway TimeoutAll
505RTSP Version Not SupportedAll
551Option not supportAll

以上是关于实时流协议---RTSP详解的主要内容,如果未能解决你的问题,请参考以下文章

RTSP 媒体协议流的录制方案及其覆盖策略详解

rtsp实时流通过rtmp推送到服务端

RTSP协议详解

RTSP协议详解

RTSP协议详解

流媒体专家RTSP协议详解I