INTERNET-DRAFT                   Henning Schulzrinne, Columbia University
                                        Anup Rao, Netscape Communications
                                       Rob Lanphier, Progressive Networks
SUBMITTED: 24th February 1997                   Expires: 24th August 1997

                    Real Time Streaming Protocol (RTSP)
                       draft-ietf-mmusic-rtsp-01.txt

STATUS OF THIS MEMO

This is an Internet-Draft. Internet-Drafts are working documents of the
Internet Engineering Task Force (IETF), its areas, and its working groups.
Note that other groups may also distribute working documents as
Internet-Drafts. Internet-Drafts are draft documents valid for a maximum of
six months and may be updated, replaced, or obsoleted by other documents at
any time. It is inappropriate to use Internet-Drafts as reference material
or to cite them other than as "work in progress."

To learn the current status of any Internet-Draft, please check the
"lid-abstracts.txt" listing contained in the Internet-Drafts Shadow
Directories on ftp.is.co.za (Africa), nic.nordu.net (Europe), mannari.oz.au
(Pacific Rim), ds.internic.net (Us East Coast), or ftp.isi.edu (US West
Coast).

Prior to the expiration of this draft, the list of open issues may be found
at the following URL:

http://www.prognet.com/prognet/rt/openissues.html

Abstract:

The Real Time Streaming Protocol, or RTSP, is an application-level protocol
for control over the delivery of data with real-time properties. RTSP
provides an extensible framework to enable controlled, on-demand delivery
of real-time data, such as audio and video. Sources of data can include
both live data feeds and stored clips. This protocol is intended to control
multiple data delivery sessions, provide a means for choosing delivery
channels such as UDP, multicast UDP and TCP, and delivery mechanisms based
upon RTP (RFC 1889).














H. Schulzrinne, A. Rao, R. Lanphier                            Page  1


INTERNET-DRAFT                   RTSP                February 21, 1997


Contents

   * 1 Introduction
        o 1.1 Purpose
        o 1.2 Requirements
        o 1.3 Terminology
        o 1.4 Protocol Properties
        o 1.5 Extending RTSP
        o 1.6 Overall Operation
        o 1.7 RTSP States
        o 1.8 Relationship with Other Protocols
   * 2 Notational Conventions
   * 3 Protocol Parameters
        o 3.1 RTSP Version
        o 3.2 RTSP URL
        o 3.3 Conference Identifiers
        o 3.4 Relative Timestamps
        o 3.5 Absolute Time
   * 4 RTSP Message
        o 4.1 Message Types
        o 4.2 Message Headers
        o 4.3 Message Body
        o 4.4 Message Length
   * 5 Request
   * 6 Response
        o 6.1 Status-Line
             + 6.1.1 Status Code and Reason Phrase
             + 6.1.2 Response Header Fields
   * 7 Entity
        o 7.1 Entity Header Fields
        o 7.2 Entity Body
   * 8 Connections
        o 8.1 Pipelining
        o 8.2 Reliability and Acknowledgements
   * 9 Method Definitions
        o 9.1 HELLO
        o 9.2 GET
        o 9.3 SETUP
        o 9.4 PLAY
        o 9.5 PAUSE
        o 9.6 CLOSE
        o 9.7 BYE
        o 9.8 GET_PARAMETER
        o 9.9 SET_PARAMETER
        o 9.10 REDIRECT
        o 9.11 SESSION
        o 9.12 RECORD
        o 9.13 Embedded Binary Data

H. Schulzrinne, A. Rao, R. Lanphier                            Page  2


INTERNET-DRAFT                   RTSP                February 21, 1997


   * 10 Status Codes Definitions
        o 10.1 Client Error 4xx
             + 10.1.1 451 Parameter Not Understood
             + 10.1.2 452 Conference Not Found
             + 10.1.3 453 Not Enough Bandwidth
             + 10.1.4 45x Session Not Found
             + 10.1.5 45x Method Not Valid in This State
             + 10.1.6 45x Header Field Not Valid for Resource
             + 10.1.7 45x Invalid Range
             + 10.1.8 45x Parameter Is Read-Only
   * 11 Header Field Definitions
        o 11.1 Accept
        o 11.2 Accept-Encoding
        o 11.3 Accept-Language
        o 11.4 Allow
        o 11.5 Authorization
        o 11.6 Bandwidth
        o 11.7 Blocksize
        o 11.8 Conference
        o 11.9 Content-Encoding
        o 11.10 Content-Length
        o 11.11 Content-Type
        o 11.12 Date
        o 11.13 If-Modified-Since
        o 11.14 Last-modified
        o 11.15 Location
        o 11.16 Range
        o 11.17 Require
        o 11.18 Unsupported
        o 11.19 Nack-Transport-Require
        o 11.20 Transport-Require
        o 11.21 Retry-After
        o 11.22 Speed
        o 11.23 Server
        o 11.24 Session
        o 11.25 Transport
        o 11.26 User-Agent
        o 11.27 Via
        o 11.28 WWW-Authenticate
   * 12 Caching
   * 13 Examples
        o 13.1 Media on Demand (Unicast)
        o 13.2 Live Media Event Using Multicast
        o 13.3 Playing media into an existing session
        o 13.4 Recording




H. Schulzrinne, A. Rao, R. Lanphier                            Page  3


INTERNET-DRAFT                   RTSP                February 21, 1997


   * 14 Syntax
        o 14.1 Base Syntax
        o 14.2 Internet Media Type Syntax
        o 14.3 Universal Resource Identifier Syntax
        o 14.4 RTSP-specific syntax
   * 15 Experimental
        o 15.1 Header Field Definitions
             + 15.1.1 Address
   * 16 Security Considerations
   * A State Machines
        o A.1 Client State Machine
             + A.1.1 Client States
             + A.1.2 Notes
             + A.1.3 State Table
        o A.2 Server State Machine
             + A.2.1 Server States
             + A.2.2 State Table
   * B Open Issues
   * C Author Addresses
   * D Acknowledgements
   * References

1 Introduction

1.1 Purpose

RTSP establishes and controls either single or several (time-synchronized)
streams of continuous media. It does not typically deliver the continuous
streams itself, although interleaving of the continuous media stream with
the control stream is possible (Section 9.13).

There is no notion of an RTSP connection, but rather a session maintained
by an identifier. An RTSP session is in no way tied to a transport-level
session. During an RTSP session, an RTSP client may open and close many
reliable transport connections to the server to issue RTSP requests.
Alternatively, it may use a connectionless transport protocol such as UDP.

The protocol is intentionally similar in syntax and operation to HTTP/1.1,
so that extension mechanisms to HTTP can in most cases also be added to
RTSP. However, RTSP differs in a number of important aspects from HTTP:









H. Schulzrinne, A. Rao, R. Lanphier                            Page  4


INTERNET-DRAFT                   RTSP                February 21, 1997


   * RTSP introduces a number of new methods and has a different protocol
     identifier.
   * An RTSP server needs to maintain state by default in almost all cases,
     as opposed to the stateless nature of HTTP. (RTSP servers and clients
     MAY use the HTTP state maintenance mechanism [1].)
   * Both an RTSP server and client can issue requests.
   * Data is carried out-of-band, by a different protocol. (There is an
     exception to this.)
   * RTSP is defined to use ISO 10646 (UTF-8) rather than ISO 8859-1,
     consistent with current HTML internationalization efforts [2].

          HS: Probably the right thing to do, but may lead to
          confusion with GET.

   * The Request-URI always contains the absolute URI. Because of backward
     compatibility with a historical blunder, HTTP/1.1 carries only the
     absolute path in the request

          This makes virtual hosting easier. However, this is
          incompatible with HTTP/1.1, which may be a bad idea. Makes
          definition of GET confusing, if it is included in RTSP.

The protocol supports the following operations:

Retrieval of media from media server:
     The client can request a session description via HTTP or some other
     method. If the session is being multicast, the session description
     contains the multicast addresses and ports to be used for the
     continuous media. If the session is to be sent only to the client via
     unicast, the client provides the destination for security reasons.

Invitation of a media server to a conference:
     A media server can be ``invited'' to join an existing conference,
     either to play back media into the session or to record all or a
     subset of the media in a session. This mode is useful for distributed
     teaching applications. Several parties in the conference may take
     turns ``pushing the remote control buttons''.

Addition of media to an existing session:
     Particularly for live events, it is useful if the server can tell the
     client about additional media becoming available.








H. Schulzrinne, A. Rao, R. Lanphier                            Page  5


INTERNET-DRAFT                   RTSP                February 21, 1997


RTSP requests may be handled by proxies, tunnels and caches as in HTTP/1.1.

1.2 Requirements

The key words ``MUST'', ``MUST NOT'', ``REQUIRED'', ``SHALL'', ``SHALL
NOT'', ``SHOULD'', ``SHOULD NOT'', ``RECOMMENDED'', ``MAY'', and
``OPTIONAL'' in this document are to be interpreted as described in RFC
xxxx [3].

1.3 Terminology

Some of the terminology has been adopted from HTTP/1.1 [4]. Terms not
listed here are defined as in HTTP/1.1.

Conference:
     a multiparty, multimedia session, where ``multi'' implies greater than
     or equal to one.

Client:
     The client requests continuous media data from the media server.

Connection:
     A transport layer virtual circuit established between two programs for
     the purpose of communication.

Continuous media:
     Data where there is a timing relationship between source and sink,
     that is, the sink must reproduce the timing relationshop that existed
     at the source. The most common examples of continuous media are audio
     and motion video. Continuous media can be realtime (interactive),
     where there is a ``tight'' timing relationship between source and
     sink, or streaming (playback), where the relationship is less strict.

Entity:
     An entity is a participant in a conference. This participant may be
     non-human, e.g., a media record or playback server.

Media server:
     The network entity providing playback or recording services for one or
     more media streams. Different media streams within a session may
     originate from different media servers. A media server may reside on
     the same or a different host as the web server the media session is
     invoked from.






H. Schulzrinne, A. Rao, R. Lanphier                            Page  6


INTERNET-DRAFT                   RTSP                February 21, 1997


Media session:
     A collection of media streams to be treated as an aggregate, with a
     single time axis. Typically, a client will synchronize in time all
     media streams within a media session. An example of a media session is
     a movie consisting of a video and audio track.

(Media) stream:
     A single media instance, e.g., an audio stream or a video stream as
     well as a single whiteboard or shared application group. When using
     RTP, a stream consists of all RTP and RTCP packets created by a source
     within an RTP session.

     [TBD: terminology is confusing since there's an RTP session, which is
     used by a single RTSP stream.]

Message:
     The basic unit of RTSP communication, consisting of a structured
     sequence of octets matching the syntax defined in Section 14 and
     transmitted via a connection or a connectionless protocol.

Response:
     An RTSP response. If an HTTP response is meant, that is indicated
     explicitly.

Request:
     An RTSP request. If an HTTP request is meant, that is indicated
     explicitly.

Session description:
     A session description contains information about one or more media
     within a session, such as the set of encodings, network addresses and
     information about the content. The session description may take
     several different formats, including SDP and SDF.

Media parameter:
     Parameter specific to a media type that may be changed while the
     stream is being played or prior to it.

1.4 Protocol Properties

RTSP has the following properties:

Extendable:
     New methods and parameters can be easily added to RTSP.





H. Schulzrinne, A. Rao, R. Lanphier                            Page  7


INTERNET-DRAFT                   RTSP                February 21, 1997


Easy to parse:
     RTSP can be parsed by standard HTTP or MIME parsers.

Secure:
     RTSP re-uses web security mechanisms, either at the transport level
     (TLS [5]) or within the protocol itself. All HTTP authentication
     mechanisms such as basic [4, Section 11.1,] and digest authentication
     [6] are directly applicable.

Transport-independent:
     RTSP may use either an unreliable datagram protocol (UDP) [7], a
     reliable datagram protocol (RDP, not widely used [8]) or a reliable
     stream protocol such as TCP [9] as it implements application-level
     reliability.

Multi-server capable:
     Each media stream within a session can reside on a different server.
     The client automatically establishes several concurrent control
     sessions with the different media servers. Media synchronization is
     performed at the transport level.

Control of recording devices:
     The protocol can control both recording and playback devices, as well
     as devices that can alternate between the two modes (``VCR'').

Separation of stream control and conference initiation:
     Stream control is divorced from inviting a media server to a
     conference. The only requirement is that the conference initiation
     protocol either provides or can be used to create a unique conference
     identifier. In particular, SIP [10] or H.323 may be used to invite a
     server to a conference.

Suitable for professional applications:
     RTSP supports frame-level accuracy through SMPTE time stamps to allow
     remote digital editing.

Session description neutral:
     The protocol does not impose a particular session description or
     metafile format and can convey the type of format to be used. However,
     the session description must contain an RTSP URI.

Proxy and firewall friendly:
     The protocol should be readily handled by both application and
     transport-layer (SOCKS [11]) firewalls. A firewall may need to
     understand the SETUP method to open a ``hole'' for the UDP media
     stream.



H. Schulzrinne, A. Rao, R. Lanphier                            Page  8


INTERNET-DRAFT                   RTSP                February 21, 1997


HTTP-friendly:
     Where sensible, RTSP re-uses HTTP concepts, so that the existing
     infrastructure can be re-used. This infrastructure includes JEPI (the
     Joint Electronic Payment Initiative) for electronic payments and PICS
     (Platform for Internet Content Selection) for associating labels with
     content. However, RTSP does not just add methods to HTTP, since the
     controlling continuous media requires server state in most cases.

Appropriate server control:
     If a client can start a stream, it must be able to stop a stream.
     Servers should not start streaming to clients in such a way that
     clients cannot stop the stream.

Transport negotiation:
     The client can negotiate the transport method prior to actually
     needing to process a continuous media stream.

Capability negotiation:
     If basic features are disabled, there must be some clean mechanism for
     the client to determine which methods are not going to be implemented.
     This allows clients to present the appropriate user interface. For
     example, if seeking is not allowed, the user interface must be able to
     disallow moving a sliding position indicator.

     An earlier requirement in RTSP' was multi-client capability.
     However, it was determined that a better approach was to make
     sure that the protocol is easily extensible to the multi-client
     scenario. Stream identifiers can be used by several control
     streams, so that ``passing the remote'' would be possible. The
     protocol would not address how several clients negotiate access;
     this is left to either a ``social protocol'' or some other floor
     control mechanism.

1.5 Extending RTSP

RTSP can be extended in three ways, listed in order of the magnitude of
changes supported:












H. Schulzrinne, A. Rao, R. Lanphier                            Page  9


INTERNET-DRAFT                   RTSP                February 21, 1997


   * Existing methods can be extended with new parameters, as long as these
     parameters can be safely ignored by the recipient. (This is equivalent
     to adding new parameters to an HTML tag.)
   * New methods can be added. If the recipient of the message does not
     understand the request, it responds with error code 501 (Not
     implemented) and the sender can then attempt an earlier, less
     functional version.
   * A new version of the protocol can be defined, allowing almost all
     aspects (except the position of the protocol version number) to
     change.

1.6 Overall Operation

Each media stream and session may be identified by an RTSP URL. The overall
session and the properties of the media the session is made up of are
defined by a session description file, the format of which is outside the
scope of this specification. The session description file is retrieved
using HTTP, either from the web server or the media server, typically using
an URL with scheme HTTP.

The session description file contains a description of the media streams
making up the media session, including their encodings, language, and other
parameters that enable the client to choose the most appropriate
combination of media. In this session description, each media stream is
identified by an RTSP URL, which points to the media server handling that
particular media stream and names the stream stored on that server. Several
media streams can be located on different servers; for example, audio and
video tracks can be split across servers for load sharing. The description
also enumerates which transport methods the server is capable of. If
desired, the session description can also contain only an RTSP URL, with
the complete session description retrieved via RTSP.

Besides the media parameters, the network destination address and port need
to be determined. Several modes of operation can be distinguished:

Unicast:
     The media is transmitted to the source of the RTSP request, with the
     port number picked by the client. Alternatively, the media is
     transmitted on the same reliable stream as RTSP.

Multicast, server chooses address:
     The media server picks the multicast address and port. This is the
     typical case for a live or near-media-on-demand transmission.






H. Schulzrinne, A. Rao, R. Lanphier                            Page 10


INTERNET-DRAFT                   RTSP                February 21, 1997


Multicast, client chooses address:
     If the server is to participate in an existing multicast conference,
     the multicast address, port and encryption key are given by the
     conference description, established by means outside the scope of this
     specification.

1.7 RTSP States

RTSP controls a stream which may be sent via a separate protocol,
independent of the control channel. For example, RTSP control may occur on
a TCP connection while the data flows via UDP. Thus, data delivery
continues even if no RTSP requests are received by the media server. Also,
during its lifetime, a single media stream may be controlled by RTSP
requests issued sequentially on different TCP connections. Therefore, the
server needs to maintain ``session state'' to be able to correlate RTSP
requests with a stream.

     HS: This does not imply that the protocol has to be stateful in
     the way described here. If state were to be defined by identifier
     only, the first PLAY or RECORD request would initiate stream
     flow, with no need for SETUP. It has been argued that a separate
     setup simplifies the life of firewall writers.

Many methods in RTSP do not contribute to state. However, there are four
that play a central role in defining the allocation and usage of stream
resources on the server: SETUP, PLAY, PAUSE, and CLOSE. The roles they play
are defined as follows.

 Step session allocation method  session control method
 1    SETUP
 2                               PLAY
 3                               PAUSE
 4    CLOSE

 SETUP Causes the server to allocate resources for a stream.
 PLAY  Starts data transmission on a stream allocated via SETUP.
 PAUSE Temporarily halts a stream, without freeing server resources.

 CLOSE Frees resources associated with the stream. The session ceases to
       exist on the server.

A client must issue a SETUP request unless all necessary transport
information is already available.






H. Schulzrinne, A. Rao, R. Lanphier                            Page 11


INTERNET-DRAFT                   RTSP                February 21, 1997


1.8 Relationship with Other Protocols

RTSP has some overlap in functionality with HTTP. It also may interact with
HTTP in that the initial contact with streaming content is often to be made
through a web page. The current protocol specification aims to allow
different hand-off points between a web server and the media server
implementing RTSP. For example, the session description can be retrieved
using HTTP or RTSP. Having the session description be returned by the web
server makes it possible to have the web server take care of authentication
and billing, by handing out a session description whose media identifier
includes an encrypted version of the requestor's IP address and a
timestamp, with a shared secret between web and media server.

However, RTSP differs fundamentally from HTTP in that data delivery takes
place out-of-band, in a different protocol. HTTP is an asymmetric protocol,
where the client issues requests and the server responds. In RTSP, both the
media client and media server can issue requests. RTSP requests are also
not stateless, in that they may set parameters and continue to control a
media stream long after the request has been acknowledged.

     Re-using HTTP functionality has advantages in at least two areas,
     namely security and proxies. The requirements are very similar,
     so having the ability to adopt HTTP work on caches, proxies and
     authentication is valuable.

While most real-time media will use RTP as a transport protocol, RTSP is
not tied to RTP.

RTSP assumes the existence of a session description format that can express
both static and temporal properties of a media session containing several
media streams.

2 Notational Conventions

Since many of the definitions and syntax are identical to HTTP/1.1, this
specification only points to the section where they are defined rather than
copying it. For brevity, [HX.Y] is to be taken to refer to Section X.Y of
the current HTTP/1.1 specification (RFC 2068).

All the mechanisms specified in this document are described in both prose
and an augmented Backus-Naur form (BNF) similar to that used in RFC 2068
[H2.1]. It is described in detail in [12].







H. Schulzrinne, A. Rao, R. Lanphier                            Page 12


INTERNET-DRAFT                   RTSP                February 21, 1997


In this draft, we use indented and smaller-type paragraphs to provide
background and motivation. Some of these paragraphs are marked with HS, AR
and RL, designating opinions and comments by the individual authors which
may not be shared by the co-authors and require resolution.

3 Protocol Parameters

3.1 RTSP Version

[H3.1] applies, with HTTP replaced by RTSP.

3.2 RTSP URL

The ``rtsp'' and ``rtspu'' schemes are used to refer to network resources
via the RTSP protocol. This section defines the scheme-specific syntax and
semantics for RTSP URLs.

  rtsp_URL = ( "rtsp:" | "rtspu:" ) "//" host [ ":" port ] [abs_path]
  host     = <A legal Internet host domain name of IP address
             (in dotted decimal form), as defined by Section 2.1
             of RFC 1123>
  port     = *DIGIT

abs_path is defined in [H3.2.1].

     Note that fragment and query identifiers do not have a
     well-defined meaning at this time, with the interpretation left
     to the RTSP server.

The scheme rtsp requires that commands are issued via a reliable protocol
(within the Internet, TCP), while the scheme rtspu identifies an unreliable
protocol (within the Internet, UDP).

If the port is empty or not given, port 554 is assumed. The semantics are
that the identified resource can be controlled be RTSP at the server
listening for TCP (scheme ``rtsp'') connections or UDP (scheme ``rtspu'')
packets on that port of host, and the Request-URI for the resource is
rtsp_URL.

The use of IP addresses in URLs SHOULD be avoided whenever possible (see
RFC 1924 [13]).








H. Schulzrinne, A. Rao, R. Lanphier                            Page 13


INTERNET-DRAFT                   RTSP                February 21, 1997


A media presentation is identified by an textual media identifier, using
the character set and escape conventions [H3.2] of URLs []. Requests
described in Section 9 can refer to either the whole presentation or an
individual track within the presentation. Note that some methods can only
be applied to tracks, not presentations. A specific instance of a session,
e.g., one of several concurrent transmissions of the same content, is
indicated by the Session header field (Section 11.24) where needed.

For example, the RTSP URL

  rtsp://media.content.com:554/twister/audiotrack

identifies the audio track within the presentation ``twister'', which can
be controlled via RTSP requests issued over a TCP connection to port 554 of
host media.content.com.

     This does not imply a standard way to reference tracks in URLs.
     The session description defines the hierarchical relationships in
     the presentation and the URLs for the individual tracks. A
     session description may name a track 'a.mov' and the whole
     presentation 'b.mov'.

The path components of the RTSP URL are opaque to the client and do not
imply any particular file system structure for the server.

     This decoupling also allows session descriptions to be used with
     non-RTSP media control protocols, simply by replacing the scheme
     in the URL.

3.3 Conference Identifiers

Conference identifiers are opaque to RTSP and are encoded using standard
URI encoding methods (i.e., LWS is escaped with %). They can contain any
octet value. The conference identifier MUST be globally unique. For H.323,
the conferenceID value is to be used.














H. Schulzrinne, A. Rao, R. Lanphier                            Page 14


INTERNET-DRAFT                   RTSP                February 21, 1997


  conference-id = 1*OCTET  ; LWS must be URL-escaped

     Conference identifiers are used to allow to allow RTSP sessions
     to obtain parameters from multimedia conferences the media server
     is participating in. These conferences are created by protocols
     outside the scope of this specification, e.g., H.323 [15] or SIP
     [10]. Instead of the RTSP client explicitly providing transport
     information, for example, it asks the media server to use the
     values in the conference description instead. If the conference
     participant inviting the media server would only supply a
     conference identifier which is unique for that inviting party,
     the media server could add an internal identifier for that party,
     e.g., its Internet address. However, this would prevent that the
     conference participant and the initiator of the RTSP commands are
     two different entities.

3.4 Relative Timestamps

A relative time-stamp expresses time relative to the start of the clip.
Relative timestamps are expressed as SMPTE time codes for frame-level
access accuracy. The time code has the format hours:minutes:seconds.frames,
with the origin at the start of the clip. For NTSC, the frame rate is 29.97
frames per second. This is handled by dropping the first frame index of
every minute, except every tenth minute. If the frame value is zero, it may
be omitted.

  smpte-range = "smpte" "=" smpte-time "-" [ smpte-time ]
  smpte-time = 1*2DIGIT ":" 1*2DIGIT ":" 1*2DIGIT [ "." 1*2DIGIT ]

Examples:

  10:12:33.40
  10:7:33
  10:7:0

3.5 Absolute Time

Absolute time is expressed as ISO 8601 timestamps. It is always expressed
as UTC (GMT).

  utc-range = "clock" "=" utc-time "-" [ utc-time ]
  utc-time = utc-date "T" utc-time "Z"
  utc-date = 8DIGIT ; < YYYYMMDD >
  utc-time = 6DIGIT ; < HHMMSS >





H. Schulzrinne, A. Rao, R. Lanphier                            Page 15


INTERNET-DRAFT                   RTSP                February 21, 1997


Example for November 8, 1996 at 14h37 and 20 seconds UTC:

  19961108T143720Z

4 RTSP Message

RTSP is a text-based protocol and uses the ISO 10646 character set in UTF-8
encoding (RFC 2044). Lines are terminated by CRLF, but receivers should be
prepared to also interpret CR and LF by themselves as line terminators.

     Text-based protocols make it easier to add optional parameters in
     a self-describing manner. Since the number of parameters and the
     frequency of commands is low, processing efficiency is not a
     concern. Text-based protocols, if done carefully, also allow easy
     implementation of research prototypes in scripting languages such
     as Tcl, Visual Basic and Perl.

     The 10646 character set avoids tricky character set switching,
     but is invisible to the application as long as US-ASCII is being
     used. This is also the encoding used for RTCP. ISO 8859-1
     translates directly into Unicode, with a high-order octet of
     zero. ISO 8859-1 characters with the most-significant bit set are
     represented as 1100001x 10xxxxxx.

RTSP messages can be carried over any lower-layer transport protocol that
is 8-bit clean.

Requests contain methods, the object the method is operating upon and
parameters to further describe the method. Methods are idempotent, unless
otherwise noted. Methods are also designed to require little or no state
maintenance at the media server.


















H. Schulzrinne, A. Rao, R. Lanphier                            Page 16


INTERNET-DRAFT                   RTSP                February 21, 1997


4.1 Message Types

See [H4.1]

4.2 Message Headers

See [H4.2]

4.3 Message Body

See [H4.3]

4.4 Message Length

When a message-body is included with a message, the length of that body is
determined by one of the following (in order of precedence):

  1. Any response message which MUST NOT include a message-body (such as
     the 1xx, 204, and 304 responses) is always terminated by the first
     empty line after the header fields, regardless of the entity-header
     fields present in the message.
  2. If a Content-Length header field (section 11.10) is present, its value
     in bytes represents the length of the message-body. If this header
     field is not present, a value of zero is assumed.
  3. By the server closing the connection. (Closing the connection cannot
     be used to indicate the end of a request body, since that would leave
     no possibility for the server to send back a response.)

Note that RTSP does not (at present) support the ``chunked'' transfer
coding and requires the presence of the Content-Length header field.

     Given the moderate length of session descriptions returned, the
     server should always be able to determine its length, even if it
     is generated dynamically, making the chunked transfer encoding
     unnecessary. Even though Content-Length must be present if there
     is any entity body, the rules ensure reasonable behavior even if
     the length is not given explicitly.

5 Request

A request message from a client to a server or vice versa includes, within
the first line of that message, the method to be applied to the resource,
the identifier of the resource, and the protocol version in use.






H. Schulzrinne, A. Rao, R. Lanphier                            Page 17


INTERNET-DRAFT                   RTSP                February 21, 1997


  Request = Request-line CRLF
            *request-header
            CRLF
            [ message-body ]

  Request-Line = Method SP Request-URI SP RTSP-Version SP seq-no CRLF

  Method = "GET"             ; Section
         | "SETUP"           ; Section
         | "PLAY"            ; Section
         | "PAUSE"           ; Section
         | "CLOSE"           ; Section
         | "RECORD"          ; Section
         | "REDIRECT"        ; Section
         | "HELLO"           ; Section
         | "SESSION"         ; Section
         | "BYE"             ; Section
         | "SET_PARAMETER"   ; Section
         | "GET_PARAMETER"   ; Section
         | extension-method

  extendion-method = token

  Request-URI = absolute_URI

  RTSP-Version = "RTSP" "/" 1*DIGIT "." 1*DIGIT

  seq-no = 1*DIGIT

Note that in contrast to HTTP/1.1, RTSP requests always contain the
absolute URL (that is, including the scheme, host and port) rather than
just the absolute path.

6 Response

[H6] applies except that HTTP-Version is replaced by RTSP-Version. Also,
RTSP defines additional status codes and does not define some HTTP codes.
The valid response codes and the methods they can be used with are defined
in the table 1 and 2.

After receiving and interpreting a request message, the recipient responds
with an RTSP response message.







H. Schulzrinne, A. Rao, R. Lanphier                            Page 18


INTERNET-DRAFT                   RTSP                February 21, 1997


  Response = Status-Line             ; Section
             *( general-header       ; Section
              | response-header      ; Section
              | entity-header )      ; Section
             CRLF
             [ message-body ]        ; Section

6.1 Status-Line

The first line of a Response message is the Status-Line, consisting of the
protocol version followed by a numeric status code, the sequence number of
the corresponding request and the textual phrase associated with the status
code, with each element separated by SP characters. No CR or LF is allowed
except in the final CRLF sequence. Note that the addition of a

  Status-Line = RTSP-Version SP Status-Code SP seq-no SP Reason-Phrase CRLF

6.1.1 Status Code and Reason Phrase

The Status-Code element is a 3-digit integer result code of the attempt to
understand and satisfy the request. These codes are fully defined in
section10. The Reason-Phrase is intended to give a short textual
description of the Status-Code. The Status-Code is intended for use by
automata and the Reason-Phrase is intended for the human user. The client
is not required to examine or display the Reason-Phrase.

The first digit of the Status-Code defines the class of response. The last
two digits do not have any categorization role. There are 5 values for the
first digit:

   * 1xx: Informational - Request received, continuing process
   * 2xx: Success - The action was successfully received, understood, and
     accepted
   * 3xx: Redirection - Further action must be taken in order to complete
     the request
   * 4xx: Client Error - The request contains bad syntax or cannot be
     fulfilled
   * 5xx: Server Error - The server failed to fulfill an apparently valid
     request

The individual values of the numeric status codes defined for RTSP/1.0, and
an example set of corresponding Reason-Phrase's, are presented below. The
reason phrases listed here are only recommended - they may be replaced by
local equivalents without affecting the protocol. Note that RTSP adopts
most HTTP/1.1 status codes and adds RTSP-specific status codes in the
starting at 450 to avoid conflicts with newly defined HTTP status codes.



H. Schulzrinne, A. Rao, R. Lanphier                            Page 19


INTERNET-DRAFT                   RTSP                February 21, 1997


   Status-Code    = "100"   ; Continue
                  | "200"   ; OK
                  | "201"   ; Created
                  | "202"   ; Accepted
                  | "203"   ; Non-Authoritative Information
                  | "204"   ; No Content
                  | "205"   ; Reset Content
                  | "206"   ; Partial Content
                  | "300"   ; Multiple Choices
                  | "301"   ; Moved Permanently
                  | "302"   ; Moved Temporarily
                  | "303"   ; See Other
                  | "304"   ; Not Modified
                  | "305"   ; Use Proxy
                  | "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
                  | "409"   ; Conflict
                  | "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"   ; Conference Not Found}
                  | "453"   ; Not Enough Bandwidth}
                  | "45x"   ; Session Not Found}
                  | "45x"   ; Method Not Valid in This State}
                  | "45x"   ; Header Field Not Valid for Resource}
                  | "45x"   ; Invalid Range}
                  | "45x"   ; Parameter Is Read-Only}
                  | "500"   ; Internal Server Error
                  | "501"   ; Not Implemented
                  | "502"   ; Bad Gateway
                  | "503"   ; Service Unavailable
                  | "504"   ; Gateway Time-out
                  | "505"   ; HTTP Version not supported
                  | extension-code




H. Schulzrinne, A. Rao, R. Lanphier                            Page 20


INTERNET-DRAFT                   RTSP                February 21, 1997


   extension-code = 3DIGIT

   Reason-Phrase  = *<TEXT, excluding CR, LF>

RTSP status codes are extensible. RTSP applications are not required to
understand the meaning of all registered status codes, though such
understanding is obviously desirable. However, applications MUST understand
the class of any status code, as indicated by the first digit, and treat
any unrecognized response as being equivalent to the x00 status code of
that class, with the exception that an unrecognized response MUST NOT be
cached. For example, if an unrecognized status code of 431 is received by
the client, it can safely assume that there was something wrong with its
request and treat the response as if it had received a 400 status code. In
such cases, user agents SHOULD present to the user the entity returned with
the response, since that entity is likely to include human-readable
information which will explain the unusual status.

































H. Schulzrinne, A. Rao, R. Lanphier                            Page 21


INTERNET-DRAFT                   RTSP                February 21, 1997


 Code reason                         HELLO GET  SETUP  PLAY  RECORD PAUSE
 100  Continue                       x     x    x      x     x      x
 200  OK                             x     x    x      x     x      x
 300  Multiple Choices               x     x    x      x     x
 301  Moved Permanently              x     x    x      x     x
 302  Moved Temporarily              x     x    x      x     x
 303  See Other                      x     x    x      x     x
 304  Not Modified                   x     x    x      x     x
 305  Use Proxy                      x     x    x      x     x
 400  Bad Request                    x     x    x      x     x      x
 401  Unauthorized                   x     x    x      x     x      x
 402  Payment Required               x     x    x      x     x      x
 403  Forbidden                      x     x    x      x     x
 404  Not Found                      x     x    x      x     x
 405  Method Not Allowed             x     x    x      x     x      x
 406  Not Acceptable                 x     x    x      x     x
 407  Proxy Authentication Required  x     x    x      x     x      x
 408  Request Timeout                x     x    x      x     x      x
 409  Conflict
 410  Gone                           x     x    x      x     x      x
 411  Length Required                x     x    x
 412  Precondition Failed            x     x
 413  Request Entity Too Large       x     x
 414  Request-URI Too Long           x     x    x      x     x      x
 415  Unsupported Media Type         x     x
 45x  Only Valid for Stream          x     x    x
 45x  Invalid parameter
 45x  Not Enough Bandwidth                      x
 45x  Illegal Conference Identifier
 45x  Illegal Session Identifier                x      x     x      x
 45x  Parameter Is Read-Only
 45x  Header Field Not Valid
 500  Internal Server Error          x     x    x      x     x      x
 501  Not Implemented                x     x    x      x     x      x
 502  Bad Gateway                    x     x    x      x     x      x
 503  Service Unavailable            x     x    x      x     x      x
 504  Gateway Timeout                x     x    x      x     x      x
 505  RTSP Version Not Supported     x     x    x      x     x      x

Table 1: Status codes and their usage with RTSP methods









H. Schulzrinne, A. Rao, R. Lanphier                            Page 22


INTERNET-DRAFT                   RTSP                February 21, 1997


 Code reason                 CLOSE  REDIRECT  GET_PARAMETER SET_PARAMETER
 100  Continue               x      x         x             x
 200  OK                     x      x         x             x
 300  Multiple Choices              x         x             x
 301  Moved Permanently      x      x         x             x
 302  Moved Temporarily      x      x         x             x
 303  See Other              x      x         x             x
 304  Not Modified           x      x         x             x
 305  Use Proxy              x      x         x             x
 400  Bad Request            x      x         x             x
 401  Unauthorized                  x         x             x
 402  Payment Required              x         x             x
 403  Forbidden              x      x         x             x
 404  Not Found              x      x         x             x
 405  Method Not Allowed     x      x         x             x
 406  Not Acceptable         x      x         x             x

 407  Proxy Authentication   x      x         x             x
      Required
 408  Request Timeout        x      x         x             x
 409  Conflict                                x             x
 410  Gone                                    x             x
 411  Length Required                         x             x
 412  Precondition Failed                     x             x

 413  Request Entity Too     x      x         x             x
      Large
 414  Request-URI Too Long   x      x         x             x
 415  Unsupported Media Type
 45x  Only Valid for Stream
 45x  Invalid parameter
 45x  Not Enough Bandwidth

 45x  Illegal Conference
      Identifier

 45x  Illegal Session        x      x
      Identifier
 45x  Parameter Is Read-Only                                x
 45x  Header Field Not Valid









H. Schulzrinne, A. Rao, R. Lanphier                            Page 23


INTERNET-DRAFT                   RTSP                February 21, 1997


 500  Internal Server Error  x      x         x             x
 501  Not Implemented        x      x         x             x
 502  Bad Gateway            x      x         x             x
 503  Service Unavailable    x      x         x             x
 504  Gateway Timeout        x      x         x             x

 505  RTSP Version Not       x      x         x             x
      Supported

Table 2: Status codes and their usage with RTSP methods

6.1.2 Response Header Fields

The response-header fields allow the request recipient to pass additional
information about the response which cannot be placed in the Status-Line.
These header fields give information about the server and about further
access to the resource identified by the Request-URI.

  response-header = Location              ; Section
                    | Proxy-Authenticate  ; Section
                    | Public              ; Section
                    | Retry-After         ; Section
                    | Server              ; Section
                    | Vary                ; Section
                    | WWW-Authenticate    ; Section

Response-header field names can be extended reliably only in combination
with a change in the protocol version. However, new or experimental header
fields MAY be given the semantics of response-header fields if all parties
in the communication recognize them to be response-header fields.
Unrecognized header fields are treated as entity-header fields.

7 Entity

Request and Response messages MAY transfer an entity if not otherwise
restricted by the request method or response status code. An entity
consists of entity-header fields and an entity-body, although some
responses will only include the entity-headers.

In this section, both sender and recipient refer to either the client or
the server, depending on who sends and who receives the entity.

7.1 Entity Header Fields

Entity-header fields define optional metainformation about the entity-body
or, if no body is present, about the resource identified by the request.



H. Schulzrinne, A. Rao, R. Lanphier                            Page 24


INTERNET-DRAFT                   RTSP                February 21, 1997


  entity-header  = Allow                    ; Section 14.7
                   | Content-Encoding         ; Section 14.12
                   | Content-Language         ; Section 14.13
                   | Content-Length           ; Section 14.14
                   | Content-Type             ; Section 14.18
                   | Expires                  ; Section 14.21
                   | Last-Modified            ; Section 14.29
                   | extension-header

          extension-header = message-header

The extension-header mechanism allows additional entity-header fields to be
defined without changing the protocol, but these fields cannot be assumed
to be recognizable by the recipient. Unrecognized header fields SHOULD be
ignored by the recipient and forwarded by proxies.

7.2 Entity Body

See [H7.2]

8 Connections

RTSP requests can be transmitted in several different ways:

   * persistent transport connections used for several request-response
     transactions;
   * one connection per request/response transaction;
   * connectionless mode.

The type of transport connection is defined by the RTSP URI (Section 3.2).
For the scheme ``rtsp'', a persistent connection is assumed, while the
scheme ``rtspu'' calls for RTSP requests to be send without setting up a
connection.

Unlike HTTP, RTSP allows the media server to send requests to the media
client. However, this is only supported for persistent connections, as the
media server otherwise has no reliable way of reaching the client. Also,
this is the only way that requests from media server to client are likely
to traverse firewalls.

8.1 Pipelining

A client that supports persistent connections or connectionless mode MAY
``pipeline'' its requests (i.e., send multiple requests without waiting for
each response). A server MUST send its responses to those requests in the
same order that the requests were received.



H. Schulzrinne, A. Rao, R. Lanphier                            Page 25


INTERNET-DRAFT                   RTSP                February 21, 1997


8.2 Reliability and Acknowledgements

Requests are acknowledged by the receiver unless they are sent to a
multicast group. If there is no acknowledgement, the sender may resend the
same message after a timeout of one round-trip time (RTT). The round-trip
time is estimated as in TCP (RFC TBD), with an initial round-trip value of
500 ms. An implementation MAY cache the last RTT measurement as the initial
value for future connections. If a reliable transport protocol is used to
carry RTSP, the timeout value MAY be set to an arbitrarily large value.

     This can greatly increase responsiveness for proxies operating in
     local-area networks with small RTTs. The mechanism is defined
     such that the client implementation does not have be aware of
     whether a reliable or unreliable transport protocol is being
     used. It is probably a bad idea to have two reliability
     mechanisms on top of each other, although the RTSP RTT estimate
     is likely to be larger than the TCP estimate.

Each request carries a sequence number, which is incremented by one for
each request transmitted. If a request is repeated because of lack of
acknowledgement, the sequence number is incremented.

     This avoids ambiguities when computing round-trip time estimates.

[TBD: An initial sequence number negotiation needs to be added for UDP;
otherwise, a new stream connection may see a request be acknowledged by a
delayed response from an earlier ``connection''. This handshake can be
avoided with a sequence number containing a timestamp of sufficiently high
resolution.]

The reliability mechanism described here does not protect against
reordering. This may cause problems in some instances. For example, a CLOSE
followed by a PLAY has quite a different effect than the reverse.
Similarly, if a PLAY request arrives before all parameters are set due to
reordering, the media server would have to issue an error indication. Since
sequence numbers for retransmissions are incremented (to allow easy RTT
estimation), the receiver cannot just ignore out-of-order packets. [TBD:
This problem could be fixed by including both a sequence number that stays
the same for retransmissions and a timestamp for RTT estimation.]

Systems implementing RTSP MUST support carrying RTSP over TCP and MAY
support UDP. The default port for the RTSP server is 554 for both UDP and
TCP.






H. Schulzrinne, A. Rao, R. Lanphier                            Page 26


INTERNET-DRAFT                   RTSP                February 21, 1997


A number of RTSP packets destined for the same control end point may be
packed into a single lower-layer PDU or encapsulated into a TCP stream.
RTSP data MAY be interleaved with RTP and RTCP packets. Unlike HTTP, an
RTSP method header MUST contain a Content-Length whenever that method
contains a payload. Otherwise, an RTSP packet is terminated with an empty
line immediately following the method header.

9 Method Definitions

The method token indicates the method to be performed on the resource
identified by the Request-URI. The method is case-sensitive. New methods
may be defined in the future. Method names may not start with a $ character
(decimal 24) and must be a token.

 method        direction   requirement
 GET           C->S        recommended
 SETUP         C->S        recommended
 PLAY          C->S        required
 PAUSE         C->S        recommended
 CLOSE         C->S        required
 REDIRECT      S->C        optional
 SESSION       S->C        optional
 RECORD        C->S        optional
 BYE           C->S        required?
 SET_PARAMETER C->S, S->C  optional
 GET_PARAMETER C->S, S->C  optional

Table 3: Overview of RTSP methods

     HS: PAUSE is recommend, but not required in that a fully
     functional server can be built that does not support this method,
     for example, for live feeds. Similarly, SETUP is not needed for a
     server that only handles multicast events with transport
     parameters set outside of RTSP. GET and BYE are controversial.

9.1 HELLO

RTSP sessions MAY be initiated by a HELLO message. The request URI is "*"
to indicate that the request pertains to the session itself. The primary
use of the HELLO message is to verify the identity of the sender to the
receiver; both sides must authorize one another to enable full access to
server resources. Unauthorized clients may be disconnected or restricted to
a subset of server resources.






H. Schulzrinne, A. Rao, R. Lanphier                            Page 27


INTERNET-DRAFT                   RTSP                February 21, 1997


In addition, if the optional Require header is present, option tags within
the header indicate features needed by the requestor that are not required
at the version level of the protocol.

Example 1:

  C->S:  HELLO * RTSP/1.0 1
         Require: implicit-play, record-feature
         Transport-Require: switch-to-udp-control, gzipped-messages

Note that these are fictional features (though we may want to make them
real one day).

Example 2 (using RFC2069-style authentication only as an example):

  S->C: HELLO * RTSP/1.0 1
        Authenticate: Digest realm="testrealm@host.com",
          nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
          opaque="5ccc069c403ebaf9f0171e9517f40e41"

Response:

Possible errors: 401, Parameter Not Understood

Examples:

  S->C:  RTSP/1.0 200 1 OK
         Date: 23 Jan 1997 15:35:06 GMT
         Nack-Transport-Require: switch-to-udp-control

Note that these are fictional features (though we may want to make them
real one day).

Example 2 (using RFC2069-style authentication only as an example):

  C->S: RTSP/1.0 401 1 Unauthorized
        Authorization: Digest username="Mufasa",
            realm="testrealm@host.com",
            nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
            uri="/dir/index.html",
            response="e966c932a9242554e42c8ee200cec7f6",
            opaque="5ccc069c403ebaf9f0171e9517f40e41"







H. Schulzrinne, A. Rao, R. Lanphier                            Page 28


INTERNET-DRAFT                   RTSP                February 21, 1997


     HS: I consider HELLO superfluous, not fully specified and just
     complicating client and server. It is also not clear how this is
     supposed to work when a client connects to the server, since it
     can't know ahead of time whether the server will issus a HELLO
     request. So it may connect, issue a SETUP, be refused and then
     somehow guess that it's supposed to wait for HELLO.
     Authentication of the client can be readily achieved by standard
     HTTP-like methods. On either retrieving the session description
     or the first SETUP, the server would refuse with 401, supply the
     authentication methods (and nonces) it is willing to accept and
     wait for the request to be re-issued with proper authentication.
     As with standard web browser, a client can cache the
     authentication message for efficiency.

     Similarly, the client can ask the server to authenticate itself
     with the first request.

     Feature announcement can be done using standard HTTP mechanism,
     with a well-defined registration mechanism for feature names.

     RL: HELLO offers the opportunity to negotiate server features
     prior to actually needing them. A client may wish to poll a
     server for its features without actually causing any action to
     occur, and HELLO offers that opportunity.

9.2 GET

The GET method retrieves a session description from a server. It may use
the Accept header to specify the session description formats that the
client understands.

If the media server has previously been invited to a conference by the
client, the GET request SHOULD contain the Conference header field. If the
GET request contains a conference identifier, the media server MAY locate
the conference description and use the multicast addresses and port numbers
supplied in that description. The media server SHOULD only offer media
types corresponding to the media types currently active within the
conference. If the media server has no local reference to this conference,
it returns status code 452.

The conference invitation should also contain an indication whether the
media server is expected to receive or generate media, or both. (A VCR-like
device would support both directions.) If the invitation does not contain
an indication of the operations to be performed, the media server should
accept and then reject inappropriate operations.




H. Schulzrinne, A. Rao, R. Lanphier                            Page 29


INTERNET-DRAFT                   RTSP                February 21, 1997


The server responds with a description of the requested resource.

Example:

  C->S: GET rtsp://server.example.com/fizzle/foo RTSP/1.0 312
        Accept: application/sdp, application/sdf, application/mheg
        Bandwidth: 4000

  S->C: RTSP/1.0 200 312 OK
        Date: 23 Jan 1997 15:35:06 GMT
        Content-Type: application/sdp
        Content-Length: 376

        v=0
        o=mhandley 2890844526 2890842807 IN IP4 126.16.64.4
        s=SDP Seminar
        i=A Seminar on the session description protocol
        u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps
        e=mjh@isi.edu (Mark Handley)
        c=IN IP4 224.2.17.12/127
        t=2873397496 2873404696
        a=recvonly
        m=audio 3456 RTP/AVP 0
        m=video 2232 RTP/AVP 31
        m=whiteboard 32416 UDP WB
        a=orient:portrait

or

  S->C: RTSP/1.0 200 312 OK
        Date: 23 Jan 1997 15:35:06 GMT
        Content-Type: application/x-rtsp-mh
        Content-Length: 2782

        <2782 octets of data containing stream descriptions and
        headers for the requested presentation>

     The authors disagree amongst themselves as to whether having an
     GET method within RTSP is appropriate. The alternative would be
     that the stream header would be done as an HTTP GET, and then
     RTSP would be used for SETUP, PLAY, etc. RL believes there are a
     number of reasons why a GET method is appropriate within RTSP:







H. Schulzrinne, A. Rao, R. Lanphier                            Page 30


INTERNET-DRAFT                   RTSP                February 21, 1997


        * An RTSP GET is a request for header information, while an
          HTTP GET is a request for the entire file. For instance, an
          RTSP GET on a Quicktime file with the name foo.mov would
          mean "please send me the header and packetization
          information for foo.mov", whereas an HTTP GET for that file
          would mean "please send me foo.mov".
        * Assuming the client only has an URL to a resource, it is
          highly desireable to get to the point where the client is
          actually receiving data all over one connection. Though this
          would be possible if one assumed that one can multiplex RTSP
          and HTTP on the same connection, there is a question of how
          much of a web server would have to be supported in order to
          fulfill this simpler requirement.
        * Since the RTSP GET contains information such as codec,
          packetization, total size, and whether the clip is live or
          stored, it is important to insure integrity between the
          session description and the media it represents. This
          information may be cached by HTTP proxies, but it would be
          needed by caching RTSP proxies.

     RL and AR feel that the scope and applicability of this message
     should be limited, and therefore, it may be appropriate to come
     up with another name for this message.

     HS believes that this only works if GET is required. Otherwise,
     the client has no way of knowing whether to first send a GET or
     SETUP. The easy alternative is to have any further descriptive
     information that is necessary encoded in the session description.
     Thus, the naming does not matter; the resource description can
     either have a separate name or the same name if the server can
     distinguish variants based on the requested type, as modern web
     servers can. (A single URL can return different objects depending
     on the content of the Accept fields.) It appears likely that the
     RTSP GET will over time acquire all the functionality of the HTTP
     GET and thus lead to unnecessary duplication. If the description
     is lengthy, the ability to use HTTP caches is likely to
     compensate for any additional latency due to having to open two
     streams. Also, note that relying on HTTP get does not mean that
     this has to be a separate server.

9.3 SETUP

The SETUP request for a URI specifies the transport mechanism to be used
for the streamed media. Note that SETUP makes sense only for an individual
media stream, rather than an aggregate. A client can issue a SETUP request
for a stream that is already playing to change transport parameters.



H. Schulzrinne, A. Rao, R. Lanphier                            Page 31


INTERNET-DRAFT                   RTSP                February 21, 1997


If the optional Require header is present, option tags within the header
indicate features needed by the requestor that are not required at the
version level of the protocol. The Transport-Require header is used to
indicate proxy-sensitive features that MUST be stripped by the proxy to the
server if not supported. Furthermore, any Transport-Require header features
that are not supported by the proxy MUST be negatively acknowledged by the
proxy to the client if not supported.

     HS: In my opinion, the Require header should be replaced by PEP
     since PEP is standards-track, has more functionality and somebody
     already did the work.

The Transport header specifies the transports acceptable to the client for
data transmission; the response will contain the transport selected by the
server.

  C->S: SETUP foo/bar/baz.rm RTSP/1.0 302
        Transport: rtp/udp;port=458

  S->C: RTSP/1.0 200 302 OK
        Date: 23 Jan 1997 15:35:06 GMT
        Transport: cush/udp;port=458

9.4 PLAY

The PLAY method tells the server to start sending data via the mechanism
specified in SETUP. A client MUST NOT issue a PLAY request until any
outstanding SETUP request have been acknowledged as successful.

A PLAY request without a Range header is legal. It starts playing a stream
from the beginning unless the stream has been paused. If a stream has been
paused via PAUSE, stream delivery resumes at the pause point. If a stream
is playing, such a PLAY request causes no further action and can be used by
the client to test server liveness.

The following example plays the whole session starting at SMPTE time code
0:10:20 until the end of the clip.

  C->S: PLAY rtsp://audio.example.com/twister.en RTSP/1.0 833
        Range: smpte=0:10:20-

For playing back a recording of a live event, it may be desirable to use
clock units:

  C->S: PLAY rtsp://audio.example.com/meeting.en RTSP/1.0 835
        Range: clock=19961108T142300Z-19961108T143520Z



H. Schulzrinne, A. Rao, R. Lanphier                            Page 32


INTERNET-DRAFT                   RTSP                February 21, 1997


  S->C: RTSP/1.0 200 833 OK
        Date: 23 Jan 1997 15:35:06 GMT

A media server only supporting playback MUST support the smpte format and
MAY support the clock format.

     RL says: We had considered optionally overloading PLAY with SETUP
     information. This would have potentially allowed a case where one
     could implement a minimal RTSP server that only handles the PLAY
     command. However, we decided that supporting that minimal of a
     server was problematic for a couple of reasons:

        * We must be able to negotiate the transport (i.e. have server
          acknowledgment) prior to actually needing to deal with the
          data. We don't want to have a server start spewing packets
          at us before we are ready to deal with them. The server
          acknowledgment with setup information MUST arrive before the
          first packet.
        * We need make sure that we aren't dealing with an allocation
          method every time we are dealing with PLAY. We anticipate
          the potential of dealing with PLAY frequently when a client
          chooses to issue several seeks, and so simplifying this
          message is imperative.

     HS says: PLAY without SETUP is useful and possible, in particular
     if the session description contains all necessary information,
     without options. The client knows whether it needs to configure
     transport parameters or not. For multicast delivery, for example,
     it likely would not have to set additional parameters. I doubt
     that allowing one additional parameter is going to greatly
     complicate or slow down a server.

9.5 PAUSE

The PAUSE request causes the stream delivery to be interrupted (halted)
temporarily. If the request URL names a track, only playback and recording
of that track is halted. If the request URL names a presentation, delivery
of all currently active tracks is halted. After resuming playback or
recording, synchronization of the tracks MUST be maintained. Any server
resources are kept.









H. Schulzrinne, A. Rao, R. Lanphier                            Page 33


INTERNET-DRAFT                   RTSP                February 21, 1997


Example:

  C->S: PAUSE /fizzle/foo RTSP/1.0 834

  S->C: RTSP/1.0 200 834 OK
        Date: 23 Jan 1997 15:35:06 GMT

9.6 CLOSE

Stop the stream delivery for the given URI, freeing the resources
associated with it. If the URI is the root node for this session, any
session identifier associated with the session is no longer valid. Unless
all transport parameters are defined by the session description, a SETUP
request has to be issued before the session can be played again.

Example:

  C->S: CLOSE /fizzle/foo RTSP/1.0 892

  S->C: RTSP/1.0 200 892 OK

9.7 BYE

Terminate the session.

Example:

  C->S: BYE /movie RTSP/1.0 894

  S->C: RTSP/1.0 200 894 OK
        Date: 23 Jan 1997 15:35:06 GMT

     HS: I believe BYE to be unnecessary since CLOSE already frees
     resources and session descriptor.

9.8 GET_PARAMETER

The requests retrieves the value value of a parameter of a session
component specified in the URI. Multiple parameters can be requested in the
message body using the content type text/rtsp-parameters. Note that
parameters include server and client statistics. [HS: registry of parameter
names for statistics and other purposes, possibly using the HTTP feature
registration mechanism.] A GET_PARAMETER with no entity body may be used to
test client or server liveness (``ping'').





H. Schulzrinne, A. Rao, R. Lanphier                            Page 34


INTERNET-DRAFT                   RTSP                February 21, 1997


Example:

  S->C: GET_PARAMETER /fizzle/foo RTSP/1.0 431
        Content-Type: text/rtsp-parameters
        Session: 1234
        Content-Length: 15

        packets_received
        jitter

  C->S: RTSP/1.0 200 431 OK
        Content-Length: 46
        Content-Type: text/rtsp-parameters

        packets_received: 10
        jitter: 0.3838

9.9 SET_PARAMETER

This method requests to set the value of a parameter for a session
component specified by the URI.

A request SHOULD only contain a single parameter to allow the client to
determine why a particular request failed. A server MUST allow a parameter
to be set repeatedly to the same value, but it MAY disallow changing
parameter values.

Note: transport parameters for the media stream MUST only be set with the
SETUP command.

     Restricting setting transport parameters to SETUP is for the
     benefit of firewalls.

     The parameters are split in a fine-grained fashion so that there
     can be more meaningful error indications. However, it may make
     sense to allow the setting of several parameters if an atomic
     setting is desirable. Imagine device control where the client
     does not want the camera to pan unless it can also tilt to the
     right angle at the same time.

A SET_PARAMETER request without parameters can be used as a way to detect
client or server liveness.







H. Schulzrinne, A. Rao, R. Lanphier                            Page 35


INTERNET-DRAFT                   RTSP                February 21, 1997


Example:

  C->S: SET_PARAMETER /fizzle/foo RTSP/1.0 421
        Content-type: text/rtsp-parameters

        fooparam: foostuff
        barparam: barstuff

  S->C: RTSP/1.0 450 421 Invalid Parameter
        Content-Length: 6

        barparam

9.10 REDIRECT

A redirect request informs the client that it must connect to another
server location. It contains the mandatory header Location, which indicates
that the client should issue a GET for that URL. It may contain the
parameter Range, which indicates when the redirection takes effect.

Mandatory header: Location [XXX: add this to table if accepted]

Example: This request redirects traffic for this URI to the new server at
the given play time:

  S->C: REDIRECT /fizzle/foo RTSP/1.0 732
        Location: rtsp://bigserver.com:8001
        Range: clock=19960213T143205Z-

9.11 SESSION

This request is used by a media server to send new media information to the
client. If a new media type is added to a session (e.g., during a live
event), the whole session description should be sent again, rather than
just the additional components.

     This allows the deletion of session components.

Example:

  S->C: SESSION /twister RTSP/1.0 902
        Session: 1234
        Content-Type: application/sdp






H. Schulzrinne, A. Rao, R. Lanphier                            Page 36


INTERNET-DRAFT                   RTSP                February 21, 1997


        Session Description

9.12 RECORD

This method initiates recording a range of media data according to the
session description. The timestamp reflects start and end time (UTC). If no
time range is given, use the start or end time provided in the session
description. If the session has already started, commence recording
immediately. The Conference header is mandatory.

A media server supporting recording of live events MUST support the clock
range format; the smpte format does not make sense.

In this example, the media server was previously invited to the conference
indicated.

  C->S:  RECORD /meeting/audio.en RTSP/1.0 954
         Session: 1234
         Conference: 128.16.64.19/32492374

9.13 Embedded Binary Data

Binary packets such as RTP data are encapsulated by an ASCII dollar sign
(24 decimal), followed by a one-byte session identifier, followed by the
length of the encapsulated binary data as a binary, two-byte integer in
network byte order. The binary data follows immediately afterwards, without
a CRLF.

Status Codes Definitions

Where applicable, HTTP status [H10] codes are re-used. Status codes that
have the same meaning are not repeated here. See Tables 1 and 2 for a
listing of which status codes may be returned by which request.

10.1 Client Error 4xx

10.1.1 451 Parameter Not Understood

The recipient of the request does not support one or more parameters
contained in the request.

10.1.2 452 Conference Not Found

The conference indicated by a Conference header field is unknown to the
media server.




H. Schulzrinne, A. Rao, R. Lanphier                            Page 37


INTERNET-DRAFT                   RTSP                February 21, 1997


10.1.3 453 Not Enough Bandwidth

The request was refused since there was insufficient bandwidth. This may,
for example, be the result of a resource reservation failure.

10.1.4 45x Session Not Found

10.1.5 45x Method Not Valid in This State

10.1.6 45x Header Field Not Valid for Resource

The server could not act on a required request header. For example, if PLAY
contains the Range header field, but the stream does not allow seeking.

10.1.7 45x Invalid Range

The Range value given is out of bounds, e.g., beyond the end of the
presentation.

10.1.8 45x Parameter Is Read-Only

The parameter to be set by SET_PARAMETER can only be read, but not
modified.

11 Header Field Definitions

HTTP/1.1 or other, non-standard header fields not listed here currently
have no well-defined meaning and SHOULD be ignored by the recipient.

Tables 4 and 5 summarize the header fields used by RTSP. Type ``R''
designates requests, type ``r'' responses. Fields marked with ``x'' MUST be
implemented by the recipient. If the field content does not apply to the
particular resource, the server MUST return status 45x (Header Field Not
Valid for Resource).















H. Schulzrinne, A. Rao, R. Lanphier                            Page 38


INTERNET-DRAFT                   RTSP                February 21, 1997


                   type  HELLO  GET  SETUP PLAY  RECORD  PAUSE
 Accept            R            x
 Accept-Encoding   R            x
 Accept-Language   R            x    o     o
 Authorization     R     o      o    o     o     o       o
 Bandwidth         R                 o
 Blocksize         R                 o
 Conference        R            o    o     ?     ?       ?
 Connection        Rr           x    x     x     x       x
 Content-Encoding  Rr           x
 Content-Length    Rr           x
 Content-Type      Rr           x
 Date              Rr    o      o    o     o     o       o
 If-Modified-Since R            o
 Last-Modified     r            o
 Public            r     o      o    o     o     o       o
 Range             R                       x     x
 Referer           R     o      o    o     o     o       o
 Require           R     x      o    x     o     o       o
 Retry-After       r     o      o    o     o     o       o
 Session           Rr                x     x     x       x
 Server            r     o      o    o     o     o       o
 Speed             Rr                      o     o
 Transport         Rr                x
 Transport-Require R     x      o    x     o     o       o
 User-Agent        R     o      o    o     o     o       o
 Via               Rr    o      o    o     o     o       o
 WWW-Authenticate  r     o      o    o     o     o       o

Table 4: Overview of RTSP header fields for GET, SETUP, PLAY, RECORD and
PAUSE


















H. Schulzrinne, A. Rao, R. Lanphier                            Page 39


INTERNET-DRAFT                   RTSP                February 21, 1997


                   CLOSE  REDIRECT  GET_PARAMETER  SET_PARAMETER
 Accept
 Accept-Encoding
 Accept-Language
 Authorization     o      o         o              o
 Bandwidth
 Blocksize
 Conference
 Connection        x      x         x              x
 Content-Encoding  x      x         x              x
 Content-Length    x      x         x              x
 Content-Type      x      x         x              x
 Date              o      o         o              o
 If-Modified-Since
 Last-Modified
 Public            o      o         o              o
 Range
 Referer           o      o         o              o
 Retry-After       o      o         o              o
 Session           x      x         x              x
 Server            o      o         o              o
 Speed
 Transport
 User-Agent        o      o         o              o
 Via               o      o         o              o
 WWW-Authenticate  o      o         o              o

Table 5: Overview of RTSP header fields for PAUSE, CLOSE, GET_PARAMETER and
SET_PARAMETER

11.1 Accept

The Accept request-header field can be used to specify certain session
description content types which are acceptable for the response.

     The ``level'' parameter for session descriptions is properly
     defined as part of the MIME type registration, not here.












H. Schulzrinne, A. Rao, R. Lanphier                            Page 40


INTERNET-DRAFT                   RTSP                February 21, 1997


See [H14.1] for syntax.

Example of use:

Accept: application/sdf, application/sdp;level=2

11.2 Accept-Encoding

See [H14.3]

11.3 Accept-Language

See [H14.4]. Note that the language specified applies to the session
description, not the media content.

11.4 Allow

The Allow response header field lists the methods supported by the resource
identified by the request-URI. The purpose of this field is to strictly
inform the recipient of valid methods associated with the resource. An
Allow header field must be present in a 405 (Method not allowed) response.

Example of use:

  Allow: SETUP, PLAY, RECORD, SET_PARAMETER

11.5 Authorization

See [H14.8]

11.6 Bandwidth

The Bandwidth request header field describes the estimated bandwidth
available to the client, expressed as a positive integer and measured in
bits per second.














H. Schulzrinne, A. Rao, R. Lanphier                            Page 41


INTERNET-DRAFT                   RTSP                February 21, 1997


  Bandwidth  = "Bandwidth" ":" 1*DIGIT

Example:

  Bandwidth: 4000

11.7 Blocksize

This request header field is sent from the client to the media server
asking the server for a particular media packet size. This packet size does
not include lower-layer headers such as IP, UDP, or RTP. The server is free
to use a blocksize which is lower than the one requested. The server MAY
truncate this packet size to the closest multiple of the minimum
media-specific block size or overrides it with the media specific size if
necessary. The block size is a strictly positive decimal number and
measured in octets. The server only returns an error (416) if the value is
syntactically invalid.

11.8 Conference

This request header field establishes a logical connection between a
conference, established using non-RTSP means, and an RTSP stream.

  Conference = "Conference" ":" conference-id

Example:

  Conference: 199702170042.SAA08642@obiwan.arl.wustl.edu%20Starr

11.9 Content-Encoding

See [H14.12]

11.10 Content-Length

This field contains the length of the content of the method (i.e. after the
double CRLF following the last header). Unlike HTTP, it MUST be included in
all messages that carry content beyond the header portion of the message.
It is interpreted according to [H14.14].

11.11 Content-Type

See [H14.18]. Note that the content types suitable for RTSP are likely to
be restricted in practice to session descriptions and parameter-value
types.




H. Schulzrinne, A. Rao, R. Lanphier                            Page 42


INTERNET-DRAFT                   RTSP                February 21, 1997


11.12 Date

See [H14.19].

11.13 If-Modified-Since

See [H14.24]. If the request URL refers to a presentation rather than a
track, the server is to return the presentation if any of the track has
been modified since the time stated in the header field.

11.14 Last-modified

The Last-Modified entity-header field indicates the date and time at which
the origin server believes the variant was last modified. See [H14.29]. If
the request URI refers to an aggregate, the field indicates the last
modification time across all leave nodes of that aggregate.

11.15 Location

See [H14.30].

11.16 Range

This request header field specifies a range of time. The range can be
specified in a number of units. This specification defines the smpte (see
Section 3.4) and clock (see Section 3.5) range units. Within RTSP, byte
ranges [H14.36.1] are not meaningful and MUST NOT be used.

  Range = "Range" ":" 1#ranges-specifier

  ranges-specifier = utc-range | smpte-range

Example:

  Range: clock=19960213T143205Z-

11.17 Require

The Require header is used by clients to query the server about features
that it may or may not support. The server MUST respond to this header by
negatively acknowledging those features which are NOT supported in the
Unsupported header.

     HS: Naming of features - yet another name space. I believe this
     header field to be redundant. PEP should be used instead.




H. Schulzrinne, A. Rao, R. Lanphier                            Page 43


INTERNET-DRAFT                   RTSP                February 21, 1997


For example

C->S:   SETUP /foo/bar/baz.rm RTSP/1.0 302
        Require: funky-feature
        Funky-Parameter: funkystuff

S->C:   RTSP/1.0 200 506 Option not supported
        Unsupported: funky-feature

C->S:   SETUP /foo/bar/baz.rm RTSP/1.0 303

S->C:   RTSP/1.0 200 303 OK

This is to make sure that the client-server interaction will proceed
optimally when all options are understood by both sides, and only slow down
if options aren't understood (as in the case above). For a well-matched
client-server pair, the interaction proceeds quickly, saving a round-trip
often required by negotiation mechanisms. In addition, it also removes
state ambiguity when the client requires features that the server doesn't
understand.

11.18 Unsupported

See Section 11.17 for a usage example.

     HS: same caveat as for Require applies.

11.19 Nack-Transport-Require

Negative acknowledgement of features not supported by the server. If there
is a proxy on the path between the client and the server, the proxy MUST
insert a message reply with an error message 506 (Feature not supported).

     HS: Same caveat as for Require applies.

11.20 Transport-Require

The Transport-Require header is used to indicate proxy-sensitive features
that MUST be stripped by the proxy to the server if not supported.
Furthermore, any Transport-Require header features that are not supported
by the proxy MUST be negatively acknowledged by the proxy to the client if
not supported.

See Section 11.17 for more details on the mechanics of this message and a
usage example.




H. Schulzrinne, A. Rao, R. Lanphier                            Page 44


INTERNET-DRAFT                   RTSP                February 21, 1997


     HS: Same caveat as for Require applies.

11.21 Retry-After

See [H14.38].

11.22 Speed

This request header fields parameter requests the server to deliver data to
the client at a particular speed, contingent on the server's ability and
desire to serve the media stream at the given speed. Implementation by the
server is OPTIONAL. The default is the bit rate of the stream.

The parameter value is expressed as a decimal ratio, e.g., a value of 2.0
indicates that data is to be delivered twice as fast as normal. A speed of
zero is invalid. A negative value indicates that the stream is to be played
back in reverse direction.

  speed = "Speed" ":" ["-"]1*DIGIT [ "." *DIGIT ]

Example:

  Speed: 2.5

11.23 Server

See [H14.39]

11.24 Session

This request and response header field identifies a session, started by the
media server in a SETUP or PLAY response and concluded by CLOSE on the
session URL (presentation). The session identifier is chosen by the media
server and has the same syntax as a conference identifier. Once a client
receives a Session identifier, it MUST return it for any request related to
that session.













H. Schulzrinne, A. Rao, R. Lanphier                            Page 45


INTERNET-DRAFT                   RTSP                February 21, 1997


     HS: This may be redundant with the standards-track HTTP state
     maintenance mechanism [1]. The equivalent way of doing this would
     be for the server to send Set-Cookie: Session="123"; Version=1;
     Path = "/twister" and for the client to return later Cookie:
     Session = "123"; $Version=1; $Path = "/twister". In the response
     to the CLOSE message, the server would simply send Set-Cookie:
     Session="123"; Version=1; Max-Age=0 to get rid of the cookie on
     the client side. Cookies also have a time-out, so that a server
     may limit the lifetime of a session at will. Unlike a web
     browser, a client would not store these states on disk.

11.25 Transport

This request header indicates which transport protocol is to be used and
configures its parameters such as multicast, compression, multicast
time-to-live and destination port for a single stream. It sets those values
not already determined by a session description. In some cases, the session
description contains all necessary information. In those cases, a Transport
header field (and the SETUP request containing it) are not needed.

'Interleaved' implies mixing the media stream with the control stream, in
whatever protocol is being used by the control stream. Currently, the
next-layer protocols RTP is defined. Parameters may be added to each
protocol, separated by a semicolon. For RTP, the boolean parameter
compressed is defined, indicating compressed RTP according to RFC XXXX. For
multicast UDP, the integer parameter ttl defines the time-to-live value to
be used. For UDP and TCP, the parameter port defines the port data is to be
sent to.

The SSRC parameter indicates the RTP SSRC value that should be (request)i
or will be (response) used by the media server. This parameter is only
valid for unicast transmission. It identifies the synchronization source to
be associated with the media stream.

The Transport header MAY also be used to change certain transport
parameters. A server MAY refuse to change parameters of an existing stream.

The server MAY return a Transport response header in the response to
indicate the values actually chosen.

A Transport request header field may contain a list of transport options
acceptable to the client. In that case, the server MUST return a single
option which was actually chosen. The Transport header field makes sense
only for an individual media stream, not a session.





H. Schulzrinne, A. Rao, R. Lanphier                            Page 46


INTERNET-DRAFT                   RTSP                February 21, 1997


  Transport = "Transport" ":"
              1#transport-protocol/upper-layer *parameter
  transport-protocol = "UDP" | "TCP"
  upper-layer  = "RTP"
  parameters = ";" "multicast" |
               ";" "compressed" |
               ";" "interleaved" |
               ";" "ttl" "=" ttl |
               ";" "port" "=" port |
               ";" "ssrc" "=" ssrc
  ttl        = 1*3(DIGIT)
  port       = 1*5(DIGIT)
  ssrc       = 8*8(HEX)

Example:

  Transport: udp/rtp;compressed;ttl=127;port=3456

11.26 User-Agent

See [H14.42]

11.27 Via

See [H14.44].

11.28 WWW-Authenticate

See [H14.46].

12 Caching

In HTTP, response-request pairs are cached. RTSP differs significantly in
that respect. Typically, responses are not cachable (except maybe for the
GET response), rather it is desirable for the media data (that is typically
delivered outside of RTSP) to be cached. Since the responses for anything
but GET and GET_PARAMETER do not return any data, caching is not an issue
for these requests.











H. Schulzrinne, A. Rao, R. Lanphier                            Page 47


INTERNET-DRAFT                   RTSP                February 21, 1997


HS: A proxy cache for RTSP would look not much different from an HTTP
cache. To the client, the proxy cache would appear like a regular media
server, to the media server like a client. Just like an HTTP cache has to
store the content type, content language, etc. for the objects it caches, a
media cache has to store the session description. Typically, a cache would
eliminate all transport-references (that is, multicast information) from
the session description, since these are independent of the data delivery
from the cache to the client. Information on the encodings remains the
same. If the cache is able to translate the cached media data, it would
create a new session description with all the encoding possibilities it can
offer.

13 Examples

To emphasize that RTSP is independent of the session description format,
the following examples use a fictional session description language which
is chosen to be sufficiently self-explanatory.

13.1 Media on Demand (Unicast)

Client C requests a movie from media servers A ( audio.content.com) and V
(video.content.com). The media description is stored on a web server W.
This, however, is transparent to the client. The client is only interested
in the last part of the movie. The server requires authentication for this
movie. The audio track can be dynamically switched between between two sets
of encodings. The URL with scheme rtpsu indicates the media servers want to
use UDP for exchanging RTSP messages.

C->W: GET /twister HTTP/1.1
      Host: www.content.com
      Accept: application/sdf; application/sdp

W->C: 200 OK
      Content-Type: application/sdf















H. Schulzrinne, A. Rao, R. Lanphier                            Page 48


INTERNET-DRAFT                   RTSP                February 21, 1997


      (session
        (all
         (media (t audio) (oneof
            ((e PCMU/8000/1 89 DVI4/8000/1 90) (id lofi))
            ((e DVI4/16000/2 90 DVI4/16000/2 91) (id hifi))
           )
           (language en)
           (id rtspu://audio.content.com/twister/audio.en)
           )
           (media (t video) (e JPEG)
             (id rtspu://video.content.com/twister/video)
           )
         )
       )

C->A: SETUP rtsp://audio.content.com/twister/audio.en/lofi RTSP/1.0 1
      Transport: rtp/udp;compression;port=3056

A->C: RTSP/1.0 200 1 OK
      Session: 1234

C->V: SETUP rtsp://video.content.com/twister/video RTSP/1.0 1
      Transport: rtp/udp;compression;port=3058

V->C: RTSP/1.0 200 1 OK
      Session: 1235

C->V: PLAY rtsp://video.content.com/twister/video RTSP/1.0 2
      Session: 1235
      Range: smpte 0:10:00-

V->C: RTSP/1.0 200 2 OK

C->A: PLAY rtsp://audio.content.com/twister/audio.en/lofi RTSP/1.0 2
      Session: 1234
      Range: smpte 0:10:00-

A->C: 200 2 OK

C->A: CLOSE rtsp://audio.content.com/twister/audio.en/lofi RTSP/1.0 3
      Session: 1234

A->C: 200 3 OK

C->V: CLOSE rtsp://video.content.com/twister/video RTSP/1.0 3
      Session: 1235



H. Schulzrinne, A. Rao, R. Lanphier                            Page 49


INTERNET-DRAFT                   RTSP                February 21, 1997


V->C: 200 3 OK

Even though the audio and video track are on two different servers, may
start at slightly different times and may drift with respect to each other,
the client can synchronize the two using standard RTP methods, in
particular the time scale contained in the RTCP sender reports.

13.2 Live Media Event Using Multicast

The media server M chooses the multicast address and port. Here, we assume
that the web server only contains a pointer to the full description, while
the media server M maintains the full description. During the session, a
new subtitling stream is added.

C->W: GET /concert HTTP/1.1
      Host: www.content.com

W->C: HTTP/1.1 200 OK
      Content-Type: application/sdf

      (session
        (id rtsp://live.content.com/concert)
      )

C->M: GET rtsp://live.content.com/concert RTSP/1.0 1

M->C: RTSP/1.0 200 1 OK
      Content-Type: application/sdf

      (session (all
        (media (t audio) (id music) (a IP4 224.2.0.1) (p 3456))
      ))

C->M: PLAY rtsp://live.content.com/concert/music RTSP/1.0 2
      Range: smpte 1:12:0

M->C: RTSP/1.0 405 2 No positioning possible

M->C: SESSION concert RTSP/1.0
      Content-Type: application/sdf

      (session (all
        (media (t audio) (id music))
        (media (t text) (id lyrics))
      ))




H. Schulzrinne, A. Rao, R. Lanphier                            Page 50


INTERNET-DRAFT                   RTSP                February 21, 1997


C->M: PLAY rtsp://live.content.com/concert/lyrics RTSP/1.0

Since the session description already contains the necessary address
information, the client does not set the transport address. The attempt to
position the stream fails since this is a live event.

13.3 Playing media into an existing session

A conference participant C wants to have the media server M play back a
demo tape into an existing conference. When retrieving the session
description, C indicates to the media server that the network addresses and
encryption keys are already given by the conference, so they should not be
chosen by the server. The example omits the simple ACK responses.

C->M: GET /demo HTTP/1.1
      Host: www.content.com
      Accept: application/sdf, application/sdp

M->C: HTTP/1.1 200 1 OK
      Content-type: application/sdf

      (session
         (id 548)
         (media (t audio) (id sound)
      )

C->M: SETUP rtsp://server.content.com/demo/548/sound RTSP/1.0 2
      Conference: 218kadjk

13.4 Recording

Conference participant C asks the media server M to record a session. If
the session description contains any alternatives, the server records them
all.

C->M: SESSION rtsp://server.content.com/meeting RTSP/1.0 89
      Content-Type: application/sdp

      v=0
      s=Mbone Audio
      i=Discussion of Mbone Engineering Issues

M->C: 415 89 Unsupported Media Type
      Accept: application/sdf





H. Schulzrinne, A. Rao, R. Lanphier                            Page 51


INTERNET-DRAFT                   RTSP                February 21, 1997


C->M: SESSION rtsp://server.content.com/meeting RTSP/1.0 90
      Content-Type: application/sdf

M->C: 200 90 OK

C->M: RECORD rtsp://server.content.com/meeting RTSP/1.0 91
      Range: clock 19961110T1925-19961110T2015

14 Syntax

The RTSP syntax is described in an augmented Backus-Naur form (BNF) as used
in RFC 2068 (HTTP/1.1).

14.1 Base Syntax

OCTET     = <any 8-bit sequence of data>
CHAR      = <any US-ASCII character (octets 0 - 127)>
UPALPHA   = <any US-ASCII uppercase letter "A".."Z">
LOALPHA   = <any US-ASCII lowercase letter "a".."z">
ALPHA     = UPALPHA | LOALPHA
DIGIT     = <any US-ASCII digit "0".."9">
CTL       = <any US-ASCII control character
             (octets 0 - 31) and DEL (127)>
CR        = <US-ASCII CR, carriage return (13)>
LF        = <US-ASCII LF, linefeed (10)>
SP        = <US-ASCII SP, space (32)>
HT        = <US-ASCII HT, horizontal-tab (9)>
<">       = <US-ASCII double-quote mark (34)>
CRLF      = CR LF
LWS       = [CRLF] 1*( SP | HT )
TEXT      = <any OCTET except CTLs>
tspecials = "(" | ")" | "<" | ">" | "@"
          | "," | ";" | ":" | "\" | <">
          | "/" | "[" | "]" | "?" | "="
          | "{" | "}" | SP | HT
token = 1*<any CHAR except CTLs or tspecials>
quoted-string = ( <"> *(qdtext) <"> )
qdtext = <any TEXT except <">>
quoted-pair = "\" CHAR

message-header = field-name ":" [ field-value ] CRLF
field-name = token
field-value = *( field-content | LWS )
field-content = <the OCTETs making up the field-value and consisting
                 of either *TEXT or combinations of token, tspecials,
                 and quoted-string>



H. Schulzrinne, A. Rao, R. Lanphier                            Page 52


INTERNET-DRAFT                   RTSP                February 21, 1997


14.2 Internet Media Type Syntax

media-type = type "/" subtype *( ";" parameter )
type = token
subtype = token
parameter = attribute "=" value
attribute = token
value = token | quoted-string

14.3 Universal Resource Identifier Syntax

uri = ( absoluteURI | relativeURI ) [ "#" fragment ]
absoluteURI = scheme ":" *( uchar | reserved )
relativeURI = net-path | abs-path | rel-path
net-path = "//" net-loc [ abs-path ]
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, reserverd, extra,
            safe, and unsafe>

14.4 RTSP-specific syntax

setup-response = response-line
                 date-type-header
                 *( nack-require-header
                  | nack-require-transport-header )
                  CRLF





H. Schulzrinne, A. Rao, R. Lanphier                            Page 53


INTERNET-DRAFT                   RTSP                February 21, 1997


redirect-response = response-line
                    date-type-header

session-response = response-line
                   date-type-header

play-response = response-line
                date-type-header

pause-response = response-line
                 date-type-header

message-body = *OCTET

accept-header = "Accept" ":" 1#media-type
allow-header = "Allow" ":" 1#method
blocksize-header = "Blocksize" ":" 1*DIGIT
content-length-header = "Content-Length" ":" 1*DIGIT
content-type-header = "Content-Type" ":" media-type
date-type-header = "Date" ":" rfc1123-date
location-header = "Location" ":" request-uri
require-header = "Require" ":" #parameters
transport-require-header = "Transport-Require" ":" #parameters
nack-require-header = "Nack-Require" ":" #parameters
nack-transport-require-header = "Nack-Transport-Require" ":" #parameters

auth-scheme = token
ip-address = <IP address in dotted-decimal form per RFC 1123>
port-number = 1*DIGIT
blocksize-value = 1*DIGIT
credentials = auth-scheme ":" #parameter
rfc1123-date = wkday "," SP date SP time SP "GMT"
date = 2DIGIT SP month SP 4DIGIT ; day month year (e.g., 12 Dec 1998)
time = 2DIGIT ":" 2DIGIT ":" 2DIGIT ; 00:00:00 - 23:59:59
wkday = "Mon" | "Tue" | "Wed" | "Thu" | "Fri" | "Sat" | "Sun"
month = "Jan" | "Feb" | "Mar" | "Apr" | "May" | "Jun"
      | "Jul" | "Aug" | "Sep" | "Oct" | "Nov" | "Dec"

15 Experimental

This section gathers parts of the protocol which are less well understood
and require extensive further discussion.







H. Schulzrinne, A. Rao, R. Lanphier                            Page 54


INTERNET-DRAFT                   RTSP                February 21, 1997


15.1 Header Field Definitions

The following additional HTTP headers may be useful for RTSP:

   * Accept-Language
   * Cache-Control
   * From
   * Max-Forwards
   * Proxy-Authenticate
   * Proxy-Authorization
   * Public
   * Referer

15.1.1 Address

Designates address to send multimedia data to.

     It appears that in almost all cases, the destination address is
     the same one where the RTSP command originates from. If TCP is
     used for control, this also eliminates the possibilities of
     pointing a data stream at an unsuspecting third party.

16 Security Considerations

The protocol offers the opportunity for a remote-control denial-of-service
attack. The attacker, using a forged source IP address, can ask for a
stream to be played back to that forged IP address.

Since there is no relation between a transport layer connection and an RTSP
session, it is possible for a malicious client to issue requests with
random session identifiers which would affect unsuspecting clients. This
does not require spoofing of network packet addresses. The server SHOULD
use a large random session identifier to make this attack more difficult.

Both problems can be be prevented by appropriate authentication.

In addition, the security considerations outlined in [H15] apply.

A State Machines

The RTSP client and server state machines describe the behavior of the
protocol from session initialization through session termination.

[TBD: should we allow for the trivial case of a server that only implements
the PLAY message, with no control.]




H. Schulzrinne, A. Rao, R. Lanphier                            Page 55


INTERNET-DRAFT                   RTSP                February 21, 1997


State is defined on a per object basis. An object is uniquely identified by
the stream URL AND the session identifier. (A server may choose to generate
dynamic session descriptions where the URL is unique for a particular
session and thus may not need an explicit session identifier in the request
header.) Any request/reply using URLs denoting a session comprised of
multiple streams will have an effect on the individual states of all the
substreams. For example:

Assuming the stream /coolmovie contains two substreams /coolmovie/audio and
/coolmovie/video, then the following command:

  PLAY /coolmovie RTSP/1.0 559
  Session: 12345

will have an effect on the states of coolmovie/audio and coolmovie/video.

     This example does not imply a standard way to represent
     substreams in URLs or a relation to the filesystem. See Section
     3.2.

A.1 Client State Machine

A.1.1 Client States

These are defined as follows:

NULL:
     No state
INIT:
     GET or SETUP has been sent, waiting for reply.
READY:
     SETUP reply received OR after playing, PAUSE reply received.
PLAYING:
     PLAY reply received

A.1.2 Notes

In general, the client transitions state on receipt of specific replies.
After a period of inactivity, state transitions back to NULL. "Inactivity"
is defined as one of the following:

   * For state PLAYING, no data being received and/or lack of wellness
     information from the server.
   * The client stays in any other state continuously for more than a
     specific interval. The choice of this interval is left to the
     implementation.



H. Schulzrinne, A. Rao, R. Lanphier                            Page 56


INTERNET-DRAFT                   RTSP                February 21, 1997


If no explicit SETUP is required for the object (for example, it is
available via a multicast group) , state begins at READY. In this case,
there are only two states, i.e READY and PLAYING.

A client MUST disregard messages with a sequence number less than the last
one . If no message has been received, the first received message's
sequence number will be the starting point.

A.1.3 State Table

In the NEXT STATE column, + indicates that the message was successful,
-indicates that it was unsuccessful.

STATE           MESSAGES                NEXT STATE(+)   NEXT STATE(-)

INIT            GET REPLY               INIT            NULL
                SETUP REPLY             READY           INIT
                REDIRECT                NULL            NULL
                BYE                     NULL            NULL
                OTHER                   INIT            INIT

READY           PLAY REPLY              PLAYING         READY
                SETUP REPLY             READY           INIT
                BYE                     NULL            NULL
                OTHER                   READY           READY

PLAYING         PAUSE REPLY             READY           PLAYING
                PLAY REPLY              PLAYING         CLOSED
                BYE                     NULL            NULL
                CLOSE REPLY             NULL            PLAYING
                OTHER                   PLAYING         PLAYING

This assumes that a PLAY during state PLAYING is an implicit PAUSE, PLAY.

     HS: BYE should be replaced by CLOSE.

A.2 Server State Machine

A.2.1 Server States

INIT:
     The initial state, no valid SETUP receieved.
READY:
     Last SETUP received was successful, reply sent or after playing, last
     PAUSE received was successful, reply sent.




H. Schulzrinne, A. Rao, R. Lanphier                            Page 57


INTERNET-DRAFT                   RTSP                February 21, 1997


PLAYING:
     Last PLAY received was successful, reply sent. Data actually being
     sent.

In general, server state transitions occur on receiving requests. On
receiving a BYE, state transitions back to INIT. After inactivity for a
period, state also transitions back to INIT. "Inactivity" is defined as:

   * For states other than PLAYING, no messages for that object for a
     specific interval. The choice of interval is left to the
     implementation.
   * In state PLAYING, lack of wellness information from the client.(This
     information could be either RTCP or be requested by the server by
     other means)

The REDIRECT message, when sent, is effective immediately. If a similar
change of location occurs at a certain time in the future, this is assumed
to be indicated by the session description. For purposes of this table, a
REDIRECT is considered an unsuccessful GET.

A server MUST disregard messages with a sequence number less than the last
one. If no message has been received, the first received message's sequence
number will be the starting point.

SETUP is valid in states INIT and READY only. An error message should be
returned in other cases. If no explicit SETUP is required for the object,
state starts at READY, ie. there are only two states READY and PLAYING.

A.2.2 State Table

In the NEXT STATE column, + indicates that the message was successful,
-indicates that it was unsuccessful.

STATE           MESSAGES                NEXT STATE(+)   NEXT STATE(-)

INIT            GET                     INIT            INIT
                SETUP                   READY           INIT
                BYE                     INIT            INIT
                OTHER                   -               INIT

READY           PLAY                    PLAYING         READY
                SETUP                   READY           INIT
                CLOSE                   INIT            -
                BYE                     INIT            -
                OTHER                   -               READY




H. Schulzrinne, A. Rao, R. Lanphier                            Page 58


INTERNET-DRAFT                   RTSP                February 21, 1997


PLAYING         PLAY                    PLAYING         READY
                PAUSE                   READY           PLAYING
                CLOSE                   INIT            PLAYING
                BYE                     INIT            -
                OTHER                   -               PLAYING

B Open Issues

   * Define text/rtsp-parameter MIME type.
   * Lots of inconsistencies need to be fixed: naming of methods in state
     definition, syntax.
   * Allow changing of transport for a stream that's playing? May not be a
     great idea since the same can be accomplished by tear down and
     re-setup.
   * How does the server get back to the client unless a persistent
     connection is used? Probably cannot, in general.
   * Cache and proxy behavior?
   * Session: or Set-Cookie: ?
   * Behavior of all methods in state diagram.
   * Error message for method
   * When do relative RTSP URLs make sense?
   * Nack-require, etc. are dubious. This is getting awfully close to the
     HTTP extension mechanisms [16] in complexity, but is different.
   * Suggestion (HS): shelve REDIRECT method for now, until necessity
     becomes clear.
   * Use HTTP absolute path + Host field or do the right thing and carry
     full URL, including host in request?

C Author Addresses

Henning Schulzrinne
Dept. of Computer Science
Columbia University
1214 Amsterdam Avenue
New York, NY 10027
USA
electronic mail: schulzrinne@cs.columbia.edu

Anup Rao
Netscape Communications Corp.
USA
electronic mail: anup@netscape.com







H. Schulzrinne, A. Rao, R. Lanphier                            Page 59


INTERNET-DRAFT                   RTSP                February 21, 1997


Robert Lanphier
Progressive Networks
1111 Third Avenue Suite 2900
Seattle, WA 98101
USA
electronic mail: robla@prognet.com

D Acknowledgements

This draft is based on the functionality of the RTSP draft. It also borrows
format and descriptions from HTTP/1.1.

This document has benefited greatly from the comments of all those
participating in the MMUSIC-WG. In addition to those already mentioned, the
following individuals have contributed to this specification:

 Rahul Agarwal     Eduardo F. Llach
 Bruce Butterfield Rob McCool
 Martin Dunsmuir   Sujal Patel
 Mark Handley      Igor Plotnikov
 Peter Haight      Pinaki Shah
 Brad Hefta-Gaub   Jeff Smith
 John K. Ho        Alexander Sokolsky
 Ruth Lang         Dale Stammen
 Stephanie Leif    John Francis Stracke

References

1     D. Kristol and L. Montulli, ``HTTP state management mechanism,'' RFC
     2109, Internet Engineering Task Force, Feb. 1997.

2     F. Yergeau, G. Nicol, G. Adams, and M. Duerst, ``Internationalization
     of the hypertext markup language,'' RFC 2070, Internet Engineering
     Task Force, Jan. 1997.

3     S. Bradner, ``Key words for use in RFCs to indicate requirement
     levels,'' Internet Draft, Internet Engineering Task Force, Jan. 1997.
     Work in progress.

4     R. Fielding, J. Gettys, J. Mogul, H. Frystyk, and T. Berners-Lee,
     ``Hypertext transfer protocol - HTTP/1.1,'' RFC 2068, Internet
     Engineering Task Force, Jan. 1997.

5     A. Freier, P. Karlton, and P. Kocher, ``The TLS protocol,'' Internet
     Draft, Internet Engineering Task Force, Dec. 1996. Work in progress.




H. Schulzrinne, A. Rao, R. Lanphier                            Page 60


INTERNET-DRAFT                   RTSP                February 21, 1997


6     J. Franks, P. Hallam-Baker, J. Hostetler, P. A. Luotonen, and E. L.
     Stewart, ``An extension to HTTP: digest access authentication,'' RFC
     2069, Internet Engineering Task Force, Jan. 1997.

7     J. Postel, ``User datagram protocol,'' STD 6, RFC 768, Internet
     Engineering Task Force, Aug. 1980.

8     R. Hinden and C. Partridge, ``Version 2 of the reliable data protocol
     (RDP),'' RFC 1151, Internet Engineering Task Force, Apr. 1990.

9     J. Postel, ``Transmission control protocol,'' STD 7, RFC 793,
     Internet Engineering Task Force, Sept. 1981.

10    M. Handley, H. Schulzrinne, and E. Schooler, ``SIP: Session
     initiation protocol,'' Internet Draft, Internet Engineering Task
     Force, Dec. 1996. Work in progress.

11    P. McMahon, ``GSS-API authentication method for SOCKS version 5,''
     RFC 1961, Internet Engineering Task Force, June 1996.

12    D. Crocker, ``Augmented BNF for syntax specifications: ABNF,''
     Internet Draft, Internet Engineering Task Force, Oct. 1996. Work in
     progress.

13    R. Elz, ``A compact representation of IPv6 addresses,'' RFC 1924,
     Internet Engineering Task Force, Apr. 1996.

14    T. Berners-Lee, ``Universal resource identifiers in WWW: a unifying
     syntax for the expression of names and addresses of objects on the
     network as used in the world-wide web,'' RFC 1630, Internet
     Engineering Task Force, June 1994.

15    International Telecommunication Union, ``Visual telephone systems and
     equipment for local area networks which provide a non-guaranteed
     quality of service,'' Recommendation H.323, Telecommunication
     Standardization Sector of ITU, Geneva, Switzerland, May 1996.

16    D. Connolly, ``PEP: an extension mechanism for http,'' Internet
     Draft, Internet Engineering Task Force, Jan. 1997. Work in progress.










H. Schulzrinne, A. Rao, R. Lanphier                    Page 61