1 绪论1.1 目的实时流协议(RTSP)建立并控制一个或几个时间同步的连续流媒体。尽管连续媒体流与控制流有可能交叉,但RTSP本身通常并不发送连续媒体流。换言之,RTSP充当多媒体服务器的网络远程控制。 表示描述(presentation description)定义了被控流,但本文并没有定义表示描述的格式。 这里没有使用RTSP连接的概念,而由RTSP会话(session)代替(每次服务由服务器端保持一个带标签的会话)。RTSP会话没有绑定到传输层连接(如TCP连接)。因为虽然在RTSP会话期间,RTSP客户端可打开或关闭多个对服务器端的可靠传输连接以发出RTSP 请求。但此外,也可能使用无连接传输协议,比如用UDP发送RTSP请求。 RTSP控制的流可能用到RTP,但RTSP操作并不依赖用于携带连续媒体的传输机制。实时流协议在语法和操作上与HTTP/1.1类似,因此HTTP的扩展机制大都可加入RTSP。尽管如此,RTSP在很多方面还是和HTTP有很大的不同: 2 RTSP引入了很多新方法并且有不同的协议标识符。 2 RTSP服务器在大多数默认情况下需要维持一个状态,但HTTP是无状态协议。 2 RTSP客户机和服务器都可以发出请求。 2 数据由另一个协议传送(有一特例除外)。 2 RTSP使用ISO 10646(UTF-8) 而不是ISO 8859-1,以配合当前HTML的国际化。 2 RTSP使用URI请求时包含绝对URI。而由于历史原因造成的向后兼容性问题,HTTP/1.1只在请求中包含绝对路径,把主机名放入单独的标题域中。 这使得“虚拟主机”实现更为简便,一个单独IP地址的主机可虚拟为几个文件树主机。 协议支持的操作如下: 从媒体服务器上检索媒体: 用户可通过HTTP或其它方法请求一个表示描述。如表示是组播,表示描述就包含用于连续媒体的的组播地址和端口。如表示仅通过单播发送给用户,用户为了安全应提供目的地址。 媒体服务器邀请进入会议: 媒体服务器可被邀请参加正进行的会议,或回放媒体,或记录其中一部分,或全部。这种模式在分布式教育应用上很有用,会议中几方可轮流按远程控制按钮。 将媒体加到现成讲座中: 如服务器告诉用户可获得附加媒体内容,对现场讲座显得尤其有用。 如HTTP/1.1中类似,RTSP请求可由代理、通道与缓存处理。 1.2 要求在本文档中的关键字“必须”,“一定不能”,“要求”,“会”,“不会”,“应该”,“不应该”,“被推荐的”,“可以”,和“可选择的”都在RFC2119中解释。 1.3 术语一些术语原由HTTP/1.1采用。在HTTP/1.1中定义的术语这里不再列举。 合控制: 服务器使用单条时间线对多个流的控制。对音频/视频回馈来讲,这就意味着客户端仅需发送一条播放或者暂停消息就可同时控制音频和视频的回馈。 会议: 多方参与的多媒体表示,这里的多方意味着大于或者等于一方。 客户端: 指请求媒体服务器上连续流媒体数据的客户端。 连接: 两个应用程序以通讯为目的在传输层建立虚拟电路。 容器文件: 可以容纳多个共同播放时包含表示(presentation)的媒体流的文件。RTSP服务器可以为这 些容器文件提供合控制,但容器文件的概念本身并不是本协议内容。 连续媒体: 接受器和数据源之间存在时序关系的数据。也就是说,接受器需要重新产生存在于源数据中的时序关系。最普通的连续媒体的例子是音频和动画视频。连续媒体可以是实时的(但是不交互的),它们在源和接受器之间是一种紧密的时序关系;或者是流的形式,这种关系就没有那么严格了。 实体: 作为请求或者回应的有效负荷传输的信息。由以实体标题域(entity-header field)形式存在的元信息和以实体主体(entity body)形式存在的内容组成,如第八章所述。 媒体的初始化: 数据类型/编码的具体初始化,这些包括时钟输率,颜色表等。用户请求媒体回放的任何独立传输信息,是在创建流时初始化媒体流相位时产生的。 媒体参数: 针对回放前或回放过程中有可能改变的媒体类型而专门设定的参数。 媒体服务器: 可对一个或多个媒体流提供回放和录制服务的服务器。同一个表示(presentation)中不同的媒体流可能来自于不同的媒体服务器。媒体服务器可以建立在作为传送请求表示(presentation)的Web服务器的主机上,也可以建立在不同的主机上。 媒体服务器重定向: 重新定向媒体客户端到另外一个媒体服务器。 (媒体)流: 单个媒体实例,比如,在应用中共用音频流或视频流。当使用RTP时,流包括由RTP 会话(session)中源所创建的所有RTP和RTCP包。这和定义DSM-CC流时相同。 消息: RTSP通讯的基本单元。由15章语法定义的一串八位位组组成,并通过连接或者无连接协议传送。 参与者: 一个会议成员。参与者可以是机器,比如是媒体记录或回放服务器。 表示(presentation): 对用户请求所回馈的一组流,其使用下面的表示描述(presentation description)形式。在本文中的多数情况下,其意味着对流进行总体控制,但这并不是必须的。 表示描述(presentation description): 表示描述包含在表示(presentation)中一个或者多个媒体流的信息。比如,编码,网络地址和内容的信息。另外,其他IETF协议,如SDP协议使用会话(session)代替现场presentation。表示描述可以采用包括会话描述(session description)SDP在内的多种格式。 回Γbr />RTSP回应。如果能理解HTTP回应,就能清楚的理解RTSP回应。 请求; RTSP请求。如果能理解HTTP请求,就能清楚的理解RTSP请求。 RTSP会话(session): RTSP交互的全过程。比如,一个电影的观看过程。会话(session)包括由客户端建立连续媒体流传输机制(SETUP),使用播放(PLAY)或录制(RECORD)开始传送流,用停止(TEARDOWN)关闭流。 传输初始化: 客户端和服务器端之间传输信息(端口号,传输协议等)的交互。 1.4 协议特点RTSP 特性如下: 可扩展性: RTSP中很容易加入新方法和参数。 易解析: RTSP可由标准 HTTP或MIME解析器解析。 安全: RTSP使用网页安全机制。所有HTTP授权机制如basic和digest授权都可直接使用。也可以传输层或网络层安全机制。 独立于传输: RTSP可使用不可靠数据报协议(UDP)、可靠数据报协议(RDP),如要实现应用级可靠,可使用可靠流协议。 多服务器支持: 表示(presentation)中的每个流可放在不同服务器上,用户端自动同不同服务器建立几个并发控制连接,媒体同步在传输层执行。 记录设备控制: 协议可控制记录和回放设备,也可控制可在记录和回放切换的设备。 流控与会议开始分离: 流控与邀请媒体服务器入会分离;仅要求会议初始化协议提供,或可用来创建唯一会议标识号。特殊情况下, SIP或H.323 可用来邀请服务器入会。 适合专业应用: 通过SMPTE 时标,RTSP支持帧级精度,允许远程数字编辑。 表示描述中立: 协议没强加特殊表示或元文件,可传达所用格式类型;然而,表示描述至少必须包含一个RTSP URI。 代理与防火墙友好: 协议可由应用和传输层防火墙处理。防火墙需要理解SETUP方法,为UDP媒体流打开一个\"缺口\"。 HTTP友好: 此处,RTSP明智的采用HTTP观念,使现在结构都可重用。结构包括Internet 内容选择平台(PICS)。由于在大多数情况下控制连续媒体需要服务器状态, RTSP不仅仅向HTTP 添加方法。 适当的服务器控制: 如用户能启动一个流,它必须也能停止一个流。 服务器不能启动一个用户不能停止的流。 传输协调: 实际处理连续媒体流前,用户可协调传输方法。 性能协调: 如基本特征无效,必须有一些清理机制让用户决定那种方法没生效。这允许用户提出适合的用户界面。 例如,如果不允许寻找,用户界面必定能禁止位置条滑动。 以前要求RTSP必须能支持多用户,但现在得出一个更好的方法就是保证RTSP能很容易扩展成支持多用户即可。因为流的标志可以被多个控制流使用,因此”远程通过”成为可能。协议不涉及到多个客户端如何协调入口,其由下层“社会协议”或其他下层控制机制提供。 1.5 RTSP扩展由于不是所有媒体服务器有着相同的功能,媒体服务器有必要支持不同请求集。例如: 服务器可能只须支持回放,因此不必不支持录制功能。 对于支持现场播放的服务器可能不支持寻找功能。 一些服务器可能不支持设置流参数,因此不支持GET_PARAMETER和SET_PARAMETER。 但服务器应该实现所有12章中要求的标题域。 表示描述(presentation description)应当保证不提出服务器不支持的功能,这种情形和HTTP/1.1中[H19.6]描述方法不支持across server的情形一致。 RTSP 可以如下三种方式扩展,这里以改变大小排序: 以新参数扩展。如用户需要拒绝通知,而方法扩展不支持,相应标记就加入要求的段中。 加入新方法。如信息接收者不理解请求,返回501错误代码(还未实现),发送者不应再次尝试这种方法。用户可使用OPTIONS方法查询服务器支持的方法。服务器使用公共回应标题列出支持的方法。 定义新版本协议,允许改变所有部分。(除了协议版本号位置) 1.6 操作模式每个表示和媒体流可用RTSP URL识别。表示组成的整个表示与媒体属性由表示描述(presentation description)文件定义,表示描述格式不在本协议中定义。使用HTTP或其它途径用户可获得这个文件,它没有必要保存在媒体服务器上。 为了说明,假设表示描述(presentation description)描述了多个表示(presentation),其中每个表示(presentation)维持了一个公共时间轴。为简化说明,且不失一般性,假定表示描述(presentation description)的确包含这样一个表示(presentation)。表示(presentation)可包含多个媒体流。 表示描述(presentation description)即组成表示的流的描述,包括它们的编码,语言和使用户可以选择最符合要求媒体的其他参数。在表示描述中,被RTSP分别控制的媒体流由RTSP URL表示。RTSP URL指出了处理具体媒体流的服务器以及存在于该服务器上流的名字。多个媒体流可以放到不同的服务器上,比如音频和视频流可以分别放到不同服务器而负载共享。描述(description)还列出了服务器传输可使用的方法。 除媒体参数外,网络目标地址和端口也需要决定。下面区分几种操作模式: 单播: 以用户选择的端口号将媒体发送到RTSP请求源。 组播,服务器选择地址: 媒体服务器选择组播地址和端口,这是现场直播或准点播常用的方式。 组播,用户选择地址: 如服务器加入正在进行的组播会议,组播地址、端口和密匙由会议描述给出。 1.7 RTSP状态RTSP控制通过单独协议发送的流,与控制通道无关。例如,RTSP控制可通过TCP连接,而数据流通过UDP。因此,即使媒体服务器没有收到请求,数据也会继续发送。在会话生命期,单个媒体流可通过不同TCP连接顺序发出请求来控制。所以,服务器需要维持能联系流与RTSP请求的会话状态。 RTSP中很多方法与状态无关,但下列方法在定义服务器流资源的分配与应用上起着重要的用: SETUP: 让服务器给流分配资源,启动RTSP会话。 PLAY与RECORD: 启动SETUP 分配流的数据传输。 PAUSE: 临时停止流,而不释放服务器资源。 TEARDOWN: 释放流的资源,RTSP会话停止。 标识状态的RTSP方法使用会话(session)标题域识别RTSP会话,为回应SETUP请求,服务器生成会话标识。 1.8 与其他协议关系 RTSP在功能上与HTTP有重叠,与HTTP相互作用体现在与流内容的初始接触是通过网页的。目前的协议规范目的在于允许在网页服务器与实现RTSP媒体服务器之间存在不同传递点。例如,表示描述(presentation description)可通过HTTP和RTSP检索,这降低了浏览器的往返传递,也允许独立RTSP 服务器与用户不全依靠HTTP。 但是,RTSP与HTTP 的本质差别在于数据发送以不同协议进行。HTTP是不对称协议,用户发出请求,服务器作出回应。RTSP中,媒体用户和服务器都可发出请求,且其请求都是无状态的;在请求确认后很长时间内,仍可设置参数,控制媒体流。 重用HTTP功能至少在两个方面有好处,即安全和代理。要求非常接近,在缓存、代理和授权上采用HTTP功能是有价值的。 当大多数实时媒体使用RTP作为传输协议时,RTSP没有绑定到RTP。 RTSP假设存在表示描述格式可表示包含几个媒体流的表示的静态与临时属性。
2 符号协定既然很多定义和语法与HTTP/1.1中相同,这里仅指出它们在HTTP/1.1中定义的位置而并没有拷贝它们到本文档。为简便起见,本文档中[ HX.Y ]表示对应HTTP/1.1(RFC 2068)中的X.Y部分。([译者注:]为更方便学习RTSP,本翻译文档将相关段落完全译出) 与[H2.1]类似,本文对所有机制的说明都是以散文和补充反馈的方式来描述的。除RTSP中以”1#”代替”,”为分隔符不同外,其余在RFC 2234中有详细的描述。简单说明补充反馈方式如下: 补充反馈方式(augmented BNF)包括下面的结构: 要解释的名词=名词解释(name = definition) 规则的名字(name)就是它本身(不带任何尖括号,“<”,“>”),后面跟个等号=, 然后就是该规则的定义。如果规则需要用多个行来描述,利用空格进行缩进格式排 版。某些基本的规则使用大写,如SP, LWS, HT, CRLF, DIGIT, ALPHA,等等。定义 中还可以使用尖括号来帮助理解规则名的使用。 字面意思("literal") 文字的字面意思放在引号中间,除非特别指定,该段文字是大小写敏感的。 规则1|规则2(rule1 | rule2) “|”表示其分隔的元素是可选的,比如,“是|否”要选择‘是’或‘否’。 (规则1 规则2)((rule1 rule2)) 在圆括号中的元素表明必选其一。如(元素1(元素2|元素3)元素4)可表明两 种意思,即“元素1 元素2 元素 *规则(*rule) 在元素前加星号“*”表示循环,其完整形式是“<n>*<m>元素”,表明元素最少产 生<n>次,最多<m>次。缺省值是0到无限,例如,“1*元素”意思是至少有一个, 而“1*2元素”表明允许有1个或2个。 〔规则〕([rule]) 方括号内是可选元素。如“〔元素1 元素2〕”与“*1(元素1 元素2)”是一回事。 N 规则(N rule) 表明循环的次数:“<n>(元素)”就是“<n>*<n>(元素)”,也就是精确指出<n> 取值。因而,2DIGIT 就是2位数字, 3ALPHA 就是由三个字母组成字符串。 #规则(#rule) “#”与“*”类似,用于定义元素列表。 完整形式是“<n>#<m>元素”表示至少有<n>个至多有<m>个元素,中间用“,”或 任意数量的空格(LWS-linear whitespace)来分隔,这将使列表非常方便,如“(*LWS 元素 *( *LWS "," *LWS 元素 ))”就等同于“1#元素”。 空元素在结构中可被任意使用,但不参与元素个数的计数。也就是说,“(元素1),, (元素2)”仅表示2个元素。但在结构中,应至少有一个非空的元素存在。缺省 值是0到无限,即“#(元素)”表示可取任何数值,包括0;而“1#元素”表示至 少有1个;而“1#2元素”表示有1个或2个。 ;注释(; comment) 分号后面是注释,仅在单行使用。 隐含*LWS(implied *LWS) 本文的语法描述是基于单词的。除非另有指定,线性空格(LWS)可以两个邻近符 号或分隔符(tspecials)之间任意使用,而不会对整句的意思造成影响。在两个符号之 间必须有至少一个分隔符,因为它们也要做为单独的符号来解释。实际上,应用程序在 产生HTTP结构时,应当试图遵照“通常方式”,因为现在的确有些实现方式在通常方 式下无法正常工作。 在本备忘录中,我们用缩进的小型段落来提供动机和背景资料。这将使没有参与制定RTSP规范的读者更容易理解RTSP中各部分为什么要以该方式来实现。 3 协议参数3.1 RTSP版本同[H3.1]定义,仅用RTSP代替HTTP即可。如下: RTSP采用主从(<major>.<minor>)数字形式来表示版本。协议的版本政策倾向于让发送方表明其消息的格式及功能,而不仅仅为了获得通讯的特性,这样做的目的是为了与更高版本的RTSP实现通讯。只增加扩展域的值或增加了不影响通讯行为的消息组件都不会导致版本数据的变化。当协议消息的主要解析算法没变,而消息语法及发送方的隐含功能增加了,将会导致从版本号(<minor>)增加;当协议中消息的格式变化了,主版本号(<major>)也将发生改变。 RTSP消息的版本由消息第一行中的RTSP版本域来表示。RTSP-Version = "RTSP" "/" 1*DIGIT "." 1*DIGIT注意,主从版本应当被看作单独的整数,因为它们都有可能增加,从而超过一位整数。因而,RTSP/2.4比RTSP/2.13版本低,而RTSP/2.13又比RTSP/12.3版本低。版本号前面的0将被接收方忽略,而在发送方处也不应产生。 本文档定义了RTSP协议的1.0版本。发送本规范定义的请求(Request)或回应(Response)消息的应用必须指明RTSP的版本为“RTSP/ 当代理及网关收到与其自身版本不同的RTSP请求时,必须小心处理请求的推送,因为 协议版本表明发送方的能力,代理或网关不应发出高于自身版本的消息。如果收到高版本的请求,代理或网关必须降低该请求的版本,并回应一个错误。而低版本的请求也应在被推送前升级。代理或网关回应请求时必须和请求的版本相同。 3.2 RTSP URL“rtsp”和“rtspu”表示要通过RTSP协议来定位网络资源。本节详细定义了RTSP URL的语法和语义。 rtsp_URL= ( "rtsp:" | "rtspu:" ) "//" host [ ":" port ] [ abs_path ] host= <合法的Internet主机域名或IP地址(用十进制数及点组成), 见RFC1123,2.1节定义> port= *DIGIT abs_path 在 [H abs_path = "/" rel_path rel_path = [ path ] [ ";" params ] [ "?" query ] path = fsegment *( "/" segment ) fsegment = 1*pchar segment = *pchar params = param *( ";" param ) param = *( pchar | "/" ) scheme = 1*( ALPHA | DIGIT | "+" | "-" | "." ) net_loc = *( pchar | ";" | "?" ) query = *( uchar | reserved ) fragment = *( uchar | reserved ) pchar = uchar | ":" | "@" | "&" | "=" | "+" uchar = unreserved | escape unreserved = ALPHA | DIGIT | safe | extra | national escape = "%" HEX HEX reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" extra = "!" | "*" | "'" | "(" | ")" | "," safe = "$" | "-" | "_" | "." unsafe = CTL | SP | <"> | "#" | "%" | "<" | ">" national = <any OCTET excluding ALPHA, DIGIT, reserved, extra, safe, and unsafe> 权威的URL语法及语义信息请参见RFC1738[4]和RFC1808[9]。 [注意]:段(fragment)和询问(query)标识符在这时没有明确的定义,需要到RTSP服务器上解释。 rtsp要求使用可靠协议(Internet的TCP协议)发出命令,而rtspu则使用不可靠协议(Internet的UDP协议)。如是端口为空或没指定,则缺省为80端口。对于rtsp_URI来说,拥有被请求的资源的服务器主机通过侦听该端口的TCP连接(rtsp)或UDP包(rtspu)来接收该URI请求。只要可能,应尽量避免的在URL中直接使用IP地址。(请参考RFC1924)文本媒体标识符使用URL中的字符集及转义规则(参考RFC1738)来标识一个表示(presentation)与单个流(stream)。URL可以用于单个流或者多个流的集合,比如表示(presentation)。因此,在第十章所描述的请求(request)可以用于整个表示(presentation)或表示中的单个流。注意,有些请求方法仅能用于流而不能用于表示,反之亦然。 例如:RTSP URL: rtsp://media.example.com:554/twister/audiotrack 标识了twister表示(presentation)中,可以通过media.example.com554端口的TCP连接发送RTSP请求来控制的音频流。 也可以是这样RTSP URL: rtsp://media.example.com:554/twister 标识了由音频和视频流组成的twister表示(presentation)。 这并没有给出URL中相关流的标准方法。表示描述定义了表示中的层次关系以及单独流的URL。如一个表示描述可能将一个流命名为a.mov,而将整个表示命名为b.mov。 RTSP URL的路径组成对客户端来说不可见并且也并没有给出服务器的具体文件系统构。 只需进行简单替换后,表示描述同样可以用于非RTSP媒体控制协议。 3.3 会议标识会议标识采用URI标准编码方法编码,并对RTSP来说是不可见的。它们能包含任一八位位组值。必须保证会议标识在全局中的唯一性。在H.323中,将用到会议的标识值。 conference-id = 1*xchar 会议标识允许RTSP会话从媒体服务器参与的多媒体会议中获取参数。比如,可以要求媒体服务器用会议描述中的标识值来代替RTSP客户端以提供详细的传输信息。多媒体会议的建立不属于本协议内容,具体请参见H.323或SIP协议。 3.4 会话标识会话标识符是不可见的任意长度的字符串。线性空格必须是URL-escaped。会话标识符必须随机产生并且至少应有8个八位位组长以保证其难以被猜出。(详见16章) session-id = 1*( ALPHA | DIGIT | safe ) 3.5 SMPTE 相对时间戳SMPTE相对时间戳表示相对于开始剪辑的时间。相对时间戳以SMPTE时间编码形式表示而可以达到帧级量级的精度。时间编码的格式为:时:分:秒;帧.子帧,并以剪辑开始为起点。缺省的SMPTE格式为“SMPTE 30 drop”格式,其帧速是29.97帧每秒。可通过选择使用不同“SMPTE time”来选择其他SMPTE编码格式(如“SMPTE smpte-range= smpte-type "=" smpte-time "-" [ smpte-time ] smpte-type = "smpte" | "smpte-30-drop" | "smpte-25" ; 还可以加入其他时间编码 smpte-time = 1*2DIGIT ":" 1*2DIGIT ":" 1*2DIGIT [ ":" 1*2DIGIT ] [ "." 1*2DIGIT ] 比如: smpte=10:12:33:20- smpte=10:07:33- smpte=10:07:00-10:07:33:05.01 smpte-25=10:07:00-10:07:33:05.01 3.6正常播放时间正常播放时间(NPT)指出了流相对于表示(presentation)开始时的绝对位置。时间戳由一个十进制小数组成,以秒为单位,小数点左边可以直接以秒表示或者以小时:分:秒的形式表示。表示开始时对应0.0秒。负值没有意义。特殊的常数now定义为现场事件当前瞬间。它只能用于现场事件。在DSM-CC中,正常播放时间(NPT)是这样定义的:“直观地讲,NPT是用户和程序联系的时钟。它经常作为数字显示在VCR上。当处于普通播放模式(scale = 1)时,NPT正常前进。当处于快进扫描模式时(scale率为大于1的正数),NPT快速前进。当处于反向扫描模式(scale率小于-1)时,NPT快速后退。当处于暂停模式时,NPT停止。NPT(逻辑上)等同于SMPTE时间编码。 npt-range= ( npt-time "-" [ npt-time ] ) | ( "-" npt-time ) npt-time = "now" | npt-sec | npt-hhmmss npt-sec= 1*DIGIT [ "." *DIGIT ] npt-hhmmss = npt-hh ":" npt-mm ":" npt-ss [ "." *DIGIT ] npt-hh = 1*DIGIT ; any positive number npt-mm = 1*2DIGIT; 0-59 npt-ss = 1*2DIGIT; 0-59 比如: npt=123.45-125 npt=12:05:35.3- npt=now- 语法遵循ISO 8601规则。npt-sec标志法便于自动产生, ntp-hhmmss标志法便于人工使用。“now”常数允许客户端请求接收实时反馈而不是存储或者延时的版本。因为对于这种情况而言,既没有绝对时间,也没有0时间,所以需要该参数。 3.7 绝对时间绝对时间表示为ISO 8601时间戳,使用UTC(GMT)小数法表示。 utc-range= "clock" "=" utc-time "-" [ utc-time ] utc-time = utc-date "T" utc-time "Z" utc-date = 8DIGIT; < YYYYMMDD > utc-time = 6DIGIT [ "." fraction ] ; < HHMMSS.fraction > 比如, 19961108T143720.25Z 3.8 选择标签选择标签是用来指定RTSP新选择的唯一标识符。这些标签用于要求(Require)(12.32节)和代理要求(Proxy Require)(12.27节)标题域中。 语法: option-tag = 1*xchar 建立新的RTSP选择可以通过在选择前加入相反域名的前缀(如:对于能访问到foo.com则com.foo.mynewfeature" 是个合适的名字)或者在英特网权威数字分派委员会注册(IANA)新的选择。 当注册新RTSP选择标签的时候,应该提供以下信息: 选择的名字和描述。名字长度不限,但是应该不少于20字符。名字不得包含任何空格,控制符或句点。 指出谁拥有选择的改变控制权(例如,IETF,国际标准化组织,国际电信联盟-T,其他的国际标准化体,一个团体,一个公司,或者一组公司)。 描述更为详细的参考文档(如果有),比如,RFC,发表论文,专利文档,技术报告,源代码,或者计算机手册。 选择的所有权,以及联系地址(邮编及电子信件地址)。 4 RTSP消息RTSP是基于文本的协议,采用ISO 10646 字符集,使用UTF-8编码方案。行以CRLF中断,但接收者本身可将CR和LF解释成行终止符。基于文本的协议使以自描述方式增加可选参数更容易。由于参数的数量和命令的频率出现较低,处理效率没引起注意。如仔细研究,文本协议很容易以脚本语言(如:Tcl、Visual Basic与Perl)实现研究原型。 10646字符集避免敏感字符集切换,但对应用来说不可见。RTCP也采用这种编码方案。带有重要意义位的ISO 8859-1字符表示如100001x 10xxxxxx.。RTSP信息可通过任何低层传输协议携带。 请求包括方法、方法作用于其上的对象和进一步描述方法的参数。方法也可设计为在服务器端只需要少量或不需要状态维护。当信息体包含在信息中,信息体长度有如下因素决定: 不管实体标题域是否出现在信息中,不包括信息体的的回应信息总以标题域后第一和空行结束。 如出现内容长度标题域,其值以字节计,表示信息体长度。如未出现标题域,其值为零。 服务器关闭连接。 注意:RTSP目前并不支持HTTP/1.1\"块\"传输编码,需要有内容长度头。假如返回适度表示描述长度,即使动态产生,使块传输编码没有必要,服务器也应该能决定其长度。如有实体,即使必须有内容长度,且长度没显式给出,规则可确保行为合理。 从用户到服务器端的请求信息在第一行内包括源采用的方法、源标识和所用协议版本。RTSP定义了附加状态代码,而没有定义任何HTTP代码。 4.1 消息类型见[H4.1]。如下: RTSP消息由客户端到服务器的请求和由服务器到客户端的回应组成。 RTSP -message = Request | Response ; RTSP /1.0 messages 请求(Request)和回应(Response)消息都使用RFC822中实体传输部分规定(作为消息中的有效载荷)的消息格式。两者的消息都可能包括一起始行,一个或多个标题域(headers)、一行表示标题域结束的空行(即CRLF前没有内容的行),和一个消息主体(message-body,可选)。 generic-message = start-line *message-header CRLF [ message-body ] start-line = Request-Line | Status-Line 为了健壮性考虑,服务器应该忽略任何在期望收到请求行时收到的空行。换句话说,如果服务器正在读协议流,在一个消息开始时如果首先收到了CRLF,这个CRLF符应被忽略。 4.2 消息标题见[H4.2]。 RTSP标题域,包括主标题(General-Header,4.3节)、请求标题(Request-Header ,5.2节)、回应标题(Response-Header ,6.2节)及实体标题(Entity-Header,7.1节),都遵照RFC822-3.1节[7]给出的通用格式定义。每个标题域由后紧跟冒号的名字,单空格(SP),字符及域值组成。域名是大小写敏感的。虽然不提倡,标题域还是可以扩展成多行使用,只要这些行以一个以上的SP或HT开头就行。 RTSP-header = field-name ":" [ field-value ] CRLF field-name = token field-value = *( field-content | LWS ) field-content = <the OCTETs make up the field-value and consisting of either *TEXT or combinations of token, tspecials, and quoted-string> 标题域接收的顺序并不重要,但良好的习惯是,先发送主标题,然后是请求标题或回应 标题,最后是实体标题。当且仅当标题域的全部域值都用逗号分隔的列表示时(即,#(值)),多个有相同域名的RTSP标题域才可以表示在一个消息里。而且必须能在不改变消息语法的前提下,将并发的域值加到第一个值后面,之间用逗号分隔,最终能将多个标题域结合成“域名:域值”对。 4.3 消息主体见[H4.3]。 RTSP消息的消息主体(如果有)用来携带请求或回应的主体。仅在使用传输编码(Transfer-Encoding)时消息主体和实体主体才有所不同,这种情况在传输编码标题域中有详细说明。(见[H14.40]) message-body = entity-body | <entity-body encoded as per Transfer-Encoding> 传输编码必须能解释所有保证传输安全和正确的应用程序的传输编码。传输编码是消息而不是实体的一个属性,因此可以由任一应用程序随着请求/回应链添加或者删除。什么时候允许消息带消息体的规则在请求和回应两种情况下有所不同。在请求中有无消息主体的标志是是否包含内容长度或请求消息标题域中的传输编码标题域。只有当请求方法允许有实体主体的时候才能在请求中包含消息主体。 而对于回应消息来说,无论消息中是否存在消息主体都与请求方法和回应状态编码无关。所有回应标题请求方法的消息都不能包含消息主体,尽管有时会因为存在实体标题域而使人产生误解。所有1××(信息),204(无内容),304(未修改)回应都不包含消息主体。而其他回应则都包含主体,尽管其长度有可能长度为零。 4.4 消息长度当消息包含消息主体时,消息主体的长度由以下规则来决定(按优先级高低顺序排列): 1. 任何回应消息都不包含消息主体(如1××,204和304回应),并且不管消息中是否存在实体标题域都以消息标题域后的第一行空行表示结束。 2. 如果内容长度标题域存在,它在字节中的值就是消息主体的长度。如果内容标题域不存在,则假设值为零。 3. 服务器关闭连接时。(关闭连接没有用来表明请求主体结束,否则可能导致服务器不能回应。 注意,RTSP不支持(至少现在)HTTP/1.1的块传输编码(详见[H3.6])并且要求有内容长度标题域。尽管表示描述长度动态产生,但由于可获得了表示描述返回长度,使得服务器总是能决定表示描述长度而不需使用块传输编码方式。只要有实体主体就必须有内容长度项,这些规则保证了即使没有给出明确长度也能做出合理的操作。 5 普通标题域有几种标题域是请求与回应都要使用的,但并不用于被传输的实体。这些标题只用于被 传输的消息。 General-Header = Date ; Section 10.6 | Pragma ; Section 10.12 普通标题域名称只有在与协议版本的变化结合起来后,才能进行可靠的扩展。实际上, 新的或实验中的标题域只要能被通讯各方识别,其语法就可使用,而无法识别的标题域都将被视为实体域。 6 请求从客户端到服务器端的请求消息包括,消息首行中,对资源的请求方法、资源的标识符 及使用的协议。 Request = Request-Line ; 6.1节 *( general-header ; 5章 | request-header ; 6.2节 | entity-header ) ; 8.1节 CRLF [ message-body ] ; 4.3节 6.1 请求队列Request-Line = Method SP Request-URI SP RTSP-Version CRLF Method = "DESCRIBE" ; Section 10.2 | "ANNOUNCE" ; Section 10.3 | "GET_PARAMETER" ; Section 10.8 | "OPTIONS" ; Section 10.1 | "PAUSE" ; Section 10.6 | "PLAY" ; Section 10.5 | "RECORD" ; Section 10.11 | "REDIRECT" ; Section 10.10 | "SETUP" ; Section 10.4 | "SET_PARAMETER" ; Section 10.9 | "TEARDOWN" ; Section 10.7 | extension-method extension-method = token Request-URI = "*" | absolute_URI RTSP-Version = "RTSP" "/" 1*DIGIT "." 1*DIGIT 6.2 请求标题域request-header = Accept ; Section 12.1 | Accept-Encoding ; Section 12.2 | Accept-Language ; Section 12.3 | Authorization ; Section 12.5 | From ; Section 12.20 | If-Modified-Since ; Section 12.23 | Range ; Section 12.29 | Referer ; Section 12.30 | User-Agent ; Section 12.41 注意:相对于HTTP/1.1而言,RTSP请求要求绝对路径(并包括rtsp或rtspu方案,主机,端口号)。HTTP/1.1 要求服务器理解绝对URL, 但是客户端需要假设为主机请求标题域。这样做完全是为了HTTP/1.0服务器端向后兼容性,因此RTSP并不需要这样做。在请求URI中星号“*”表示此请求不用于其他资源,只用于服务器本身,并且它只能在使用的方法不要求应用于资源时才能使用。比如:OPTIONS * RTSP/1.0。 7 回应7.1 状态行完整回应消息的第一行就是状态行,它依次由协议版本、数字形式的状态代码、及相应 的词语文本组成,各元素间以空格(SP)分隔,除了结尾的CRLF外,不允许出现单独的 CR或LF符。 Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
|
|