RTSP协议解析

123 阅读14分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、 概述

1.1  RTSP简介

     RTSP(Real Time Streaming Protocol),实时流传输协议, 是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学网景和RealNetworks公司提交的IETF RFC标准,该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据,RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或RTP完成数据传输。

RTSP提供了一个可扩展框架,使实时数据,如音频与视频的受控点播成为可能,数据源包括现场数据与存储在剪辑中数据,该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP,组播UDP与TCP,提供途径,并为选择基于RTP上发送机制提供方法。

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

HTTP与RTSP相比,HTTP传送HTML,HTTP请求由客户机发出,服务器作出响应 ,RTSP传送的是多媒体数据,使用RTSP时,客户机和服务器都可以发出请求,即RTSP可以是双向的。

RTSP是用来控制声音或影像的多媒体串流协议,并允许同时多个串流需求控制,传输时所用的网络通讯协议并不在其定义的范围内,服务器端可以自行选择使用TCP或UDP来传送串流内容。

而前面提到的允许同时多个串流需求控制(Multicast),除了可以降低服务器端的网络用量,更进而支持多方视讯会议(Video Conference),因为与HTTP1.1的运作方式相似,所以代理服务器〈Proxy〉的快取功能〈Cache〉也同样适用于RTSP,并因RTSP具有重新导向功能,可视实际负载情况来转换提供服务的服务器,以避免过大的负载集中于同一服务器而造成延迟。

该协议用于C/S模型,是一个基于文本的协议,用于在客户端和服务器端建立和协商实时流会话。

实时流协议(RTSP)建立并控制一个或几个时间同步的连续流媒体,尽管连续媒体流与控制流交换是可能的,通常它本身并不发送连续流,换言之,RTSP充当多媒体服务器的网络远程控制。RTSP连接没有绑定到传输层连接,如TCP. 在RTSP连接期间,RTSP用户可打开或关闭多个对服务器的可传输连接以发出RTSP请求。此外,可使用无连接传输协议,如UDP。RTSP流控制的流可能用到RTP,但RTSP操作并不依赖用于携带连续媒体的传输机制。

协议支持的操作如下: 

(1)从媒体服务器上检索媒体: 用户可通过HTTP或其它方法提交一个演示描述,如演示是组播,演示式就包含用于连续媒体的的组播地址和端口。如演示仅通过单播发送给用户,用户为了安全应提供目的地址。

(2)媒体服务器邀请进入会议:媒体服务器可被邀请参加正进行的会议,或回放媒体,或记录其中一部分,或全部。这种模式在分布式教育应用上很有用,会议中几方可轮流按远程控制按钮。

(3)将媒体加到现成讲座中:如服务器告诉用户可获得附加媒体内容,对现场讲座显得尤其有用,如HTTP/1.1中类似,RTSP请求可由代理,通道与缓存处理。

1.2 协议特点

  • 可扩展性: 新方法和参数很容易加入RTSP.
  • 易解析: RTSP可由标准HTTP或MIME解析器解析.
  • 安全: RTSP使用网页安全机制.
  • 独立于传输: RTSP可使用不可靠数据报协议(EDP), 可靠数据报协议(RDP); 如要实现应用级可靠, 可使用可靠流协议.
  • 多服务器支持: 每个流可放在不同服务器上, 用户端自动与不同服务器建立几个并发控制连接, 媒体同步在传输层执行.
  • 记录设备控制: 协议可控制记录和回放设备.
  • 流控与会议开始分离: 仅要求会议初始化协议提供, 或可用来创建惟一会议标识号. 特殊情况下, 可用SIP或H.323来邀请服务器入会.
  • 适合专业应用: 通过SMPTE时标, RTSP支持帧级精度, 允许远程数字编辑.
  • 演示描述中立: 协议没强加特殊演示或元文件, 可传送所用格式类型; 然而, 演示描述至少必须包括一个RTSP URL.
  • 代理与防火墙友好: 协议可由应用和传输层防火墙处理. 防火墙需要理解SETUP方法, 为UDP媒体流打开一个“缺口”.
  • HTTP友好: 此处, RTSP明智地采用HTTP观念, 使现在结构都可重用. 结构包括Internet内容选择平台(PICS). 由于在大多数情况下控制连续媒体需要服务器状态, RTSP不仅仅向HTFP添加方法.
  • 适当的服务器控制: 如用户启动一个流, 必须也可以停止一个流.
  • 传输协调: 实际处理连续媒体流前, 用户可协调传输方法.
  • 性能协调: 如基本特征无效, 必须有一些清理机制让用户决定哪种方法没生效. 这允许用户提出适合的用户界面.

二、 协议解析

2.1 典型的 rtsp 交互过程

C表示rtsp客户端, S表示rtsp服务端

1、OPTION 

    C->S:OPTION request //询问S有哪些方法可用

    S->C:OPTION response //S回应信息中包括提供的所有可用方法

2、DESCRIBE

    C->S:DESCRIBE request //要求得到S提供的媒体初始化描述信息

    S->C:DESCRIBE response //S回应媒体初始化描述信息, 主要是sdp

3、SETUP

    C->S:SETUP request //设置会话的属性, 以及传输模式, 提醒S建立会话

    S->C:SETUP response //S建立会话, 返回会话标识符, 以及会话相关信息

4、PLAY 

    C->S:PLAY request //C请求播放

    S->C:PLAY response //S回应该请求的信息

5、TEARDOWN

    C->S:TEARDOWN request //C请求关闭会话

    S->C:TEARDOWN response //S回应该请求

上述的过程是标准的,友好的rtsp流程,但实际的需求中并不一定按部就班来,其中第3和4步是必需的!

第一步,只要服务器客户端约定好,有哪些方法可用,则option请求可以不要。

第二步,如果我们有其他途径得到媒体初始化描述信息(比如http请求等等),则我们也不需要通过rtsp中的describe请求来完成。

第五步,可以根据系统需求的设计来决定是否需要。

2.2 RTSP 消息格式

RTSP的消息有两大类: 请求消息(request), 回应消息(response).

请求消息

    方法 URI RTSP版本 CR LF

    消息头 CR LF

    CR LF

    消息体 CR LF

其中方法包括OPTION回应中所有的命令,URI是接受方的地址,例如:rtsp://192.168.20.136. RTSP版本一般都是 RTSP/1.0。每行后面的CR LF表示回车换行,需要接受端有相应的解析,最后一个消息头需要有两个CR LF(即空行)。

回应消息

    RTSP版本 状态码 解释 CR LF

    消息头 CR LF

    CR LF

    消息体 CR LF

其中RTSP版本一般都是RTSP/1.0, 状态码是一个数值, 200表示成功, 解释是与状态码对应的文本解释.

2.3 消息头定义

消息头的定义如下表. 表格说明:

  • Type:

    • 类型 "g" 表示请求和响应中的通用请求头;
    • 类型 "R" 表示请求头;
    • 类型 "r" 表示响应头;
    • 类型 "e" 表示实体头字段.
  • Support:

    • "req." 表示必须由接收者以特殊的方法实现; 注意, 不是所有 "req." 字段在该类型的每个请求中都会被发送. "req." 只表示客户机(支持响应头)和服务器(支持请求头)必须执行该字段.
    • "opt." 表示是可选的.
  • 最后一栏列出了关于头字段产生作用的方法; 其中 "entity" 针对于返回一个信息主体的所有方法. )

| Header             | Type | Support | Methods                   |
|--------------------|------|---------|---------------------------|
| Accept             | R    | opt.    | entity                    |
| Accept-Encoding    | R    | opt.    | entity                    |
| Accept-Language    | R    | opt.    | all                       |
| Allow              | R    | opt.    | all                       |
| Authorization      | R    | opt.    | all                       |
| Bandwidth          | R    | opt.    | all                       |
| Blocksize          | R    | opt.    | All but OPTIONS, TEARDOWN |
| Cache-Control      | G    | opt.    | SETUP                     |
| Conference         | R    | opt.    | SETUP                     |
| Connection         | G    | req.    | all                       |
| Content-Base       | E    | opt.    | entity                    |
| Content-Encoding   | E    | req.    | SET_PARAMETER             |
| Content-Encoding   | E    | req.    | DESCRIBE, ANNOUNCE        |
| Content-Language   | E    | req.    | DESCRIBE, ANNOUNCE        |
| Content-Length     | E    | req.    | SET_PARAMETER, ANNOUNCE   |
| Content-Length     | E    | req.    | entity                    |
| Content-Location   | E    | opt.    | entity                    |
| Content-Type       | E    | req.    | SET_PARAMETER, ANNOUNCE   |
| Content-Type       | R    | req.    | entity                    |
| CSeq               | G    | req.    | all                       |
| Date               | G    | opt.    | all                       |
| Expires            | E    | opt.    | DESCRIBE, ANNOUNCE        |
| From               | R    | opt.    | all                       |
| If-Modified-Since  | R    | opt.    | DESCRIBE, SETUP           |
| Last-Modified      | E    | opt.    | entity                    |
| Proxy-Authenticate |      |         |                           |
| Proxy-Require      | R    | req.    | all                       |
| Public             | R    | opt.    | all                       |
| Range              | R    | opt.    | PLAY, PAUSE, RECORD       |
| Range              | R    | opt.    | PLAY, PAUSE, RECORD       |
| Referer            | R    | opt.    | all                       |
| Require            | R    | req.    | all                       |
| Retry-After        | R    | opt.    | all                       |
| RTP-Info           | R    | req.    | PLAY                      |
| Scale              | Rr   | opt.    | PLAY, RECORD              |
| Session            | Rr   | req.    | All but SETUP, OPTIONS    |
| Server             | R    | opt.    | all                       |
| Speed              | Rr   | opt.    | PLAY                      |
| Transport          | Rr   | req.    | SETUP                     |
| Unsupported        | R    | req.    | all                       |
| User-Agent         | R    | opt.    | all                       |
| Via                | G    | opt.    | all                       |
| WWW-Authenticate   | R    | opt.    | all                       |

常用头解析:

Header: Description                                                                      

CSeq: 命令的序列号, 逐1增加 ;                                                                       

Content-Length :这个标记的存在说明后面有实体数据, 而且给出了这个数据块的大小, 单位是byte;

X-Playlist-Gen-Id :用来检查播放列表是否有效. 这个标记最初在客户端发送DESCRIBE命令后使用. 客户端在发送“SETUP”命令给服务器时必须回应一样的值;               

X-Playlist-Seek-Id:值必须和X-Playlist-Gen-Id 域的值相同, 在PLAY请求命令中使用;

Blocksize:媒体包的总长度,单位是byte ;                                                                     

Session:Session ID是用作客户端和服务器之间是否是正确的连接。在客户端发送SETUP命令后,服务器会在应答消息头里面发送一个session值给客户端。这算建立的一个会话;

X-Accept-Authentication:允许的authentication 方法.  NTLM, Digest 和 Basic 是标准的 ;                                    

X-Broadcast-Id :是否是实况或者是先期录制的流。0 表示先期录制,其他的值表示是实况;                                                  

Range:暂无中文释义 ;                                                                            

Speed:用来调整传输到客户端的流得速度。假如你的带宽可以接受更高速的数据传送,这个域的值可以设置大于1来加速下载数据. i.e. x1 rate;              

Server:服务器类型和软件版本;                                                                          

EOF:文件结束标记,也是流的结束标记 ; 

Date:日期时间,下面举个例子:Tue, 18 Nov 2003 15:57:07 GMT ;  

Bandwidth:流需要的最大带宽,bits/秒;                                                                

Transport:使用什么协议来传输数据,比如TCP或者UDP等;                                                             

Etag:实体标记Entity tag,是一个分配给会话的值,就像”23180160″;                                             

Supported:支持的COM modules , 有的是可选的;                                                       

Content-Type:此域用来表示命令或者应答的用意. 下面是常用的几种类型:                                                          

1、application/x-wms-Logconnectstats 这个在SET_PARAMETER命令中用到,表示将客户端的信息登记到服务器上;            

2、application/sdp 这个表示接下来数据包里面的是sdp数据,它是在服务器对DESCRIBE命令的应答包中;                          

3、application/x-wms-contentdesc 表示紧跟的数据是一个内容描述对象,它设置the layout of the dialog;        

4、application/vnd.ms.wms-hdr.asfv1 表示跟着一个流媒体头信息(ASF header),可以用BASIC 或者DIGEST来解码;     

5、application/x-rtsp-packetpair 它被用来确定连接的可用带宽;                                        |

2.4 状态码

标准RTSP 消息的状态码(在应答消息的第一行表示)

| value | meaning                             |
|-------|-------------------------------------|
|100| Continue (all 100 range)            |
|200| OK                                  |
|201| Created                             |
|250| Low on Storage Space                |
|300| Multiple Choices                    |
|301| Moved Permanently                   |
|302| Moved Temporarily                   |
|303| See Other                           |
|304| Not Modified                        |
|305| Use Proxy                           |
|350| Going Away                          |
|351| Load Balancing                      |
|400| Bad Request                         |
|401| Unauthorized                        |
|402| Payment Required                    |
|403| Forbidden                           |
|404| Not Found                           |
|405| Method Not Allowed                  |
|406| Not Acceptable                      |
|407| Proxy Authentication Required       |
|408| Request Time-out                    |
|410| Gone                                |
|411| Length Required                     |
|412| Precondition Failed                 |
|413| Request Entity Too Large            |
|414| Request-URI Too Large               |
|415| Unsupported Media Type              |
|451| Parameter Not Understood            |
|452| reserved                            |
|453| Not Enough Bandwidth                |
|454| Session Not Found                   |
|455| Method Not Valid in This State      |
|456| Header Field Not Valid for Resource |
|457| Invalid Range                       |
|458| Parameter Is Read-Only              |
|459| Aggregate operation not allowed     |
|460| Only aggregate operation allowed    |
|461| Unsupported transport               |
|462| Destination unreachable             |
|500| Internal Server Error               |
|501| Not Implemented                     |
|502| Bad Gateway                         |
|503| Service Unavailable                 |
|504| Gateway Time-out                    |
|505| RTSP Version not supported          |
|551| Option not supported                |

三、 rtsp中常用方法举例

本节针对上面所述的典型交互过程进行说明

1、OPTION

目的是得到服务器提供的可用方法:

OPTIONS rtsp://192.168.20.136:5000/xxx666 RTSP/1.0

CSeq: 1 //每个消息都有序号来标记, 第一个包通常是option请求消息

User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

服务器的回应信息包括提供的一些方法,例如:

RTSP/1.0 200 OK

Server: UServer 0.9.7_rc1

Cseq: 1 //每个回应消息的cseq数值和请求消息的cseq相对应

Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, SCALE,GET_PARAMETER //服务器提供的可用的方法

\

2、DESCRIBE

C向S发起DESCRIBE请求,为了得到会话描述信息(SDP):

DESCRIBE rtsp://192.168.20.136:5000/xxx666 RTSP/1.0

CSeq: 2

token:

Accept: application/sdp

User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

\

服务器回应一些对此会话的描述信息(sdp):

RTSP/1.0 200 OK

Server: UServer 0.9.7_rc1

Cseq: 2

x-prev-url: rtsp://192.168.20.136:5000

x-next-url: rtsp://192.168.20.136:5000

x-Accept-Retransmit: our-retransmit

x-Accept-Dynamic-Rate: 1

Cache-Control: must-revalidate

Last-Modified: Fri, 10 Nov 2006 12:34:38 GMT

Date: Fri, 10 Nov 2006 12:34:38 GMT

Expires: Fri, 10 Nov 2006 12:34:38 GMT

Content-Base: rtsp://192.168.20.136:5000/xxx666/

Content-Length: 344

Content-Type: application/sdp

\

v=0 //以下都是sdp信息

o=OnewaveUServerNG 1451516402 1025358037 IN IP4 192.168.20.136

s=/xxx666

u=http:///

e=admin@

c=IN IP4 0.0.0.0

t=0 0

a=isma-compliance:1,1.0,1

\

a=range:npt=0-

m=video 0 RTP/AVP 96 //m表示媒体描述, 下面是对会话中视频通道的媒体描述

a=rtpmap:96 MP4V-ES/90000

a=fmtp:96 profile-level-id=245;config=000001B0F5000001B509000001000000012000C888B0E0E0FA62D089028307 a=control:trackID=0 //trackID=0表示视频流用的是通道0

\

3、SETUP

客户端提醒服务器建立会话,并确定传输模式:

SETUP rtsp://192.168.20.136:5000/xxx666/trackID=0 RTSP/1.0

CSeq: 3

Transport: RTP/AVP/TCP;unicast;interleaved=0-1

User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

//uri中 带有trackID=0, 表示对该通道进行设置. Transport参数设置了传输模式, 包的结构. 接下来的数据包头部第二个字节位置就是 interleaved, 它的值是每个通道都不同的, trackID=0的interleaved值有两个0或1, 0表示rtp包, 1表示rtcp包, 接 受端根据interleaved的值来区别是哪种数据包.

服务器回应信息:

RTSP/1.0 200 OK

Server: UServer 0.9.7_rc1

Cseq: 3

Session: 6310936469860791894 //服务器回应的会话标识符

Cache-Control: no-cache

Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=6B8B4567

\

4、PLAY

客户端发送播放请求:

PLAY rtsp://192.168.20.136:5000/xxx666 RTSP/1.0

CSeq: 4

Session: 6310936469860791894

Range: npt=0.000- //设置播放时间的范围

User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

服务器回应信息:

RTSP/1.0 200 OK

Server: UServer 0.9.7_rc1

Cseq: 4

Session: 6310936469860791894

Range: npt=0.000000-

RTP-Info: url=trackID=0;seq=17040;rtptime=1467265309

//seq和rtptime都是rtp包中的信息

\

5、TEARDOWN

客户端发起关闭请求:

TEARDOWN rtsp://192.168.20.136:5000/xxx666 RTSP/1.0

CSeq: 5

Session: 6310936469860791894

User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

\

服务器回应:

RTSP/1.0 200 OK

Server: UServer 0.9.7_rc1

Cseq: 5

Session: 6310936469860791894

Connection: Close

\

以上方法都是交互过程中最为常用的, 其它还有一些重要的方法如get/set_parameter,pause,redirect等等