Capitolo II Il protocollo RTSP
Il Real Time Streaming Protocol (RTSP), è un protocollo di livello applicativo per il controllo della distribuzione di dati con proprietà real-time; esso permette, in maniera del tutto estensibile, ad un client di controllare la trasmissione di video e audio, siano essi memorizzati localmente al server o live, accedendo ad essi attraverso una o più sessioni. Permette, inoltre, di controllare la distribuzione di dati multipli, prevedendo la possibilità di scegliere il protocollo di trasporto più adatto tra UDP e TCP, non dipendendo, comunque, dal protocollo di trasporto dei dati utilizzato, che in genere è il RTP. Tutto ciò è particolarmente interessante poiché, ad esempio, il controllo di una sessione può avvenire mediante una connessione TCP, mentre la distribuzione dei dati con UDP; in questo modo, la trasmissione, una volta avviata, continua anche se non ci sono successive richieste al media server. Grazie a tale protocollo è quindi possibile ottenere informazioni sulle sessioni in corso e avviare, mettere in pausa, fermare, registrare, etc. la riproduzione dei flussi multimediali in esse contenuti. Si parlerà in termini di "presentazione" per indicare linsieme di uno o più flussi presentati al client e che rappresentano loggetto della trasmissione in streaming.
Per ciascuna presentazione sarà necessario darne una descrizione, utile nello stabilire una sessione di streaming e che in genere viene fornita con lausilio del Session Description Protocol. Essa contiene informazioni sui media che fanno parte della presentazione, quali linsieme delle codifiche utilizzate, gli indirizzi di rete ed informazioni varie sui contenuti. Inoltre, ciascun flusso multimediale sarà identificato da un RTSP URL, che punta al media server in cui è localizzato il media, oltre che al percorso relativo di detto file in tale server. I messaggi, composti di headers e body, utilizzati dallo streaming protocol sono di tipo richiesta-risposta con grosse analogie con il protocollo HTTP/1.1; come in questultimo infatti, essi realizzano dei metodi, ossia le operazioni possibili che spaziano da una semplice richiesta di "PLAY" ad una richiesta di descrizione del contenuto dei media mediante il "DESCRIBE". Altro aspetto importante da sottolineare è che per il RTSP non si può propriamente parlare in termini di connessione, è infatti più appropriato parlare di sessione, di cui il server conserva memoria mediante luso di identificatori; in questo modo un client può aprire e chiudere molte connessioni affidabili di trasporto con il server, per permettere poi le richieste di controllo. Per sessione si intende una transazione RTSP completa, per esempio la visione di un film. Essa consiste tipicamente di un settaggio iniziale da parte del client in cui avviene linizializzazione degli specifici tipi di dato e codecs utilizzati. E questa la fase di "SETUP", in cui cè lo scambio di quelle informazioni, indipendenti dal trasporto, che sono richieste da un client per il playback di un media stream . Ci sarà poi una fase di riproduzione effettiva dello stream (PLAY o RECORD) che si concluderà con la chiusura di esso (TEARDOWN).
In figura II.1 viene raffigurato un esempio di sessione RTSP.

Figura II.1 Sessione RTSP
Dal momento che non tutti i media servers hanno le stesse funzionalità, devono comunque essere in grado di gestire alcuni insiemi di funzioni; ciò che è veramente necessario è che essi implementino i campi principali degli headers descritti in seguito.
II.2 Operazioni supportate dal protocollo
Il protocollo supporta fondamentalmente le seguenti operazioni:
Il RTSP ha una serie di proprietà che sono di seguito elencate:
Di seguito sono descritti i parametri principali presenti nei messaggi RTSP; si ricorda che un messaggio è lunità base di una comunicazione RTSP, consistente in una sequenza strutturata di ottetti costruiti con opportuna sintassi.
Una presentazione o un semplice stream, è identificato da un identificatore testuale, usando le convenzioni e linsieme di caratteri propri della URL Il riferimento per risorse a contenuti multimediali ottenibili tramite RTSP, prevede il ricorso al seguente schema:
rtsp_URL ( "rtsp:" | "rtspu:") "//" host [ ":" port] [path assoluto]
Lo schema "rtsp" nellintestazione sarà usato qualora ci sia la richiesta di trasmissione dei comandi tramite un protocollo affidabile, il TCP, mentre la sintassi "rtspu" è utilizzata qualora si usi un protocollo non affidabile quale il UDP (la "u" finale sta infatti per unreliable, inaffidabile). Per "host" si riferisce ad un nome valido e legale di un dominio Internet facente capo ad un indirizzo IP; il campo "port", naturalmente, si riferisce alla porta utilizzata dal protocollo. Se il suo valore è omesso sarà considerata la porta di default 554. Quindi, per esempio, se si ha un RTSP URL di questo tipo:
rtsp://media.example.com:654/twister/audiotrack
si fa riferimento alla traccia audio della presentazione "twister", che potrà essere controllata tramite richieste RTSP su connessione TCP verso la porta 654 del host media.example.com.
Ancora, la URL:
rtsp://media.example.com/twister
identifica la presentazione "twister" che potrà essere composta di traccia audio e video, controllabile dalla porta 554 dellhost media.example.com.
E da sottolineare che non cè un modo standard per riferirsi agli streams in una URL; la descrizione della presentazione, definisce la relazione gerarchica allinterno di tale presentazione, quindi si potrà ad esempio per un media composto di 2 tracce, audio e video, richiedere lintera presentazione (ci penserà il SDP a comunicare al client di quante e quali tracce essa è composta) oppure si potranno richiedere le due componenti separatamente.
II.4.2 Identificatori di sessione
Tali identificatori sono stringhe scelte dal server in maniera del tutto casuale, di lunghezza sì arbitraria, ma costituite necessariamente da non meno di 8 caratteri, siano essi letterali o numerali, in modo da rendere più difficile la loro decodifica da parte di eventuali crackers. La sintassi è la seguente:
session: xxxxxxxx
Un timestamp SMPTE esprime il tempo relativo di inizio di un clip; esso è espresso in termini di codici temporali con il seguente formato: ore:minuti:secondi:frames.subframes
Come si nota ci potrà essere anche lindicazione dei frames al secondo il cui valore oscillerà tra 0 e 29. I subframes saranno indicati in centesimi di un frame. La sintassi è:
"Range:" "smpte" "=" [1*2 cifre ":" 1*2 cifre ":" 1*2 cifre ":" 1*2 cifre "." 1*2 cifre]
Indica la posizione assoluta dallinizio della presentazione; la parte sinistra del decimale, può essere espressa sia in secondi sia in minuti e ore, mentre la parte a destra del punto decimale misura le frazioni di secondo. Linizio di una presentazione corrisponde a 0.0 secondi ed una costante speciale ("now") viene definita per gli eventi live. Intuitivamente, NPT può essere considerato come lorologio del viewer associato ad un dato programma. La sintassi è:
"npt" "=" [1*2cifre ":" 1*2 cifre ":" 1*2 cifre ":" 1*2 cifre]
Il real time streaming protocol è un protocollo di tipo "text-based", molto simile al HTTP, i cui messaggi, composti di headers e body, implementano praticamente delle richieste e delle risposte necessarie alla comunicazione tra client e server.
In un messaggio di richiesta, si distinguerà nella prima linea lindicazione del metodo, la URI della richiesta e lindicazione della versione del protocollo (RTSP/1.0). I possibili metodi sono 11: "DESCRIBE", "ANNOUNCE", "GET_PARAMETER", "OPTIONS", "PAUSE", "PLAY", "RECORD", "REDIRECT", "SETUP", "SET_PARAMETER", "TEARDOWN" e verranno descritti nel prossimo paragrafo. Nel header del messaggio seguiranno poi diversi parametri (es. "Accept", "Range", Session", "Transport") , alcuni dei quali saranno comuni a quelli dei messaggi di risposte e verranno citati in seguito.
Nel messaggio di risposta, la prima linea è la "Status-Line", consistente nella versione del protocollo seguito da un codice di stato numerico; questultimo, è un intero di tre cifre necessario per codificare il tipo di risposta nel messaggio e che usualmente è seguito da una frase dove si esprime, in formato più intuibile dalluomo, il significato di tale risposta (es. "200 OK" o "404 Not Found"). La prima cifra del codice di stato definisce la classe della risposta; ci sono 5 valori possibili, facenti capo a 5 classi diverse:
Per una descrizione di alcuni dei più noti tra i codici di stato si rimanda al paragrafo II.6.
Da sottolineare che le applicazioni RTSP non necessariamente dovranno capire il significato di tutti i codici registrati, ma è ovvio che la piena comprensione è desiderabile. In ogni modo, le applicazioni dovranno però saper interpretare la classe di ogni codice, indicata dalla prima cifra, così che, qualora non siano in grado di capire un codice ad esse sconosciuto iniziante con la cifra x, possano associargli almeno il significato del codice x00. Per esempio se un client riceve il codice di stato 431 a lui sconosciuto, può tranquillamente assumere che qualcosa sia andato storto con la sua richiesta e interpreterà detta risposta come se avesse ricevuto un codice 400.
Come detto, il metodo indica loperazione che deve essere attuata sulla risorsa identificata dalla Request-URI. I metodi sono visualizzati nella seguente tabella II.1 in cui si mette in risalto la direzione della richiesta (es. Cà S implica che è un metodo utilizzabile solo per richieste dal client al server), loggetto della richiesta (P: presentazione; S: singolo stream) ed i requisiti.
Metodo Direzione Oggetto Requisiti
___________________________________________________________________________
DESCRIBE C->S P,S raccomandato
ANNOUNCE C->S, S->C P,S opzionale
GET_PARAMETER C->S, S->C P,S opzionale
OPTIONS C->S, S->C P,S richiesto (S->C: opzionale)
PAUSE C->S P,S raccomandato
PLAY C->S P,S richiesto
RECORD C->S P,S opzionale
REDIRECT S->C P,S opzionale
SETUP C->S S richiesto
SET_PARAMETER C->S, S->C P,S opzionale
TEARDOWN C->S P,S richiesto
Tabella II.1 Metodi RTSP
Dalla tabella si può notare, ad esempio, come il metodo PAUSE sia raccomandato ma non richiesto, dato che alcuni servers, in particolare quelli che trasmettono in live feeds, non hanno la necessità, oltre che la funzionalità, per supportare tale operazione. Quella che segue è una descrizione dei metodi tuttora implementati:
II.7 Definizione dei codici di stato
Come si è già ampiamente detto in precedenza, i codici di stato sono stringhe di 3 cifre necessarie a codificare i responsi per ciascuna richiesta, in modo da fornire lo stato della sessione al client o al server. Essi sono indicati in tabella 2.2, in cui, a ciascun codice, viene associata la "reason-phrase", ossia una descrizione del tipo di risposta messa in forma più intelligibile per lumano; saranno inoltre indicati i metodi a cui essi si riferiscono:
________________________________________________________
-----------------------------------------------------------------------------------------
200 OK tutti
201 Created RECORD
250 Low on Storage Space RECORD
-----------------------------------------------------------------------------------------
300 Multiple Choices tutti
301 Moved Permanently tutti
302 Moved Temporarily tutti
303 See Other tutti
305 Use Proxy tutti
-----------------------------------------------------------------------------------------
400 Bad Request tutti
401 Unauthorized tutti
402 Payment Required tutti
403 Forbidden tutti
404 Not Found tutti
405 Method Not Allowed tutti
406 Not Acceptable tutti
407 Proxy Authentication Required tutti
408 Request Timeout tutti
410 Gone tutti
411 Length Required tutti
412 Precondition Failed DESCRIBE, SETUP
413 Request Entity Too Large tutti
414 Request-URI Too Long tutti
415 Unsupported Media Type tutti
451 Invalid parameter SETUP
452 Illegal Conference Identifier SETUP
453 Not Enough Bandwidth SETUP
454 Session Not Found tutti
455 Method Not Valid In This State tutti
456 Header Field Not Valid tutti
457 Invalid Range PLAY
458 Parameter Is Read-Only SET_PARAMETER
459 Aggregate Operation Not Allowed tutti
460 Only Aggregate Operation Allowed tutti
461 Unsupported Transport tutti
462 Destination Unreachable tutti
-----------------------------------------------------------------------------------------
500 Internal Server Error tutti
501 Not Implemented tutti
502 Bad Gateway tutti
503 Service Unavailable tutti
504 Gateway Timeout tutti
505 RTSP Version Not Supported tutti
551 Option not support tutti
Tabella II.2 Codici di stato RTSP
Di seguito sono descritti alcuni dei codici più importanti:
400 Bad Request: la richiesta non può essere compresa dal server data la sintassi sbagliata, quindi è necessario che il client effettui le dovute modifiche prima di ritrasmettere la richiesta.
404 Not Found: la risorsa richiesta dal client non esiste nel lato server.
405 Method Not Allowed: il metodo richiesto non può essere esaudito dal server specificato poiché evidentemente questultimo non lo supporta, quindi, allegato a tale risposta, ci dovrebbe essere un header "Allow" contenente la lista di tutti i metodi supportati.
453 Not Enough Bandwidth: la richiesta è stata rifiutata poiché non cè banda sufficiente.
454 Session Not Found: lidentificatore di sessione nel header Session del messaggio è mancante, invalido o è scaduto.
457 Invalid Range: il valore dato per il range relativo alla riproduzione è errato, per esempio è dopo la fine della presentazione.
461 Unsupported Transport: il campo Transport nel messaggio non contiene una specifica di trasporto supportato.
462 Destination Unreachable: il canale di trasmissione dei dati non può essere stabilito poiché lindirizzo del client non può essere raggiunto. Ciò può accadere ad esempio quando il client ha inserito nel campo "Destination" un indirizzo errato.
II.8 Definizione dei campi del header
Di seguito si evidenzia lutilità ed il significato di alcuni tra i principali campi del header del messaggio RTSP.
Accept: è utilizzato nelle richieste per specificare i tipi di descrizione di una presentazione noti dal client, in modo che il server in una risposta possa inviargli tali descrizione in un opportuno formato;
Allow: serve per elencare i metodi supportati dalla risorsa identificata dal request URI, in modo da scongiurare richieste con metodi non supportati;
Bandwidth: descrive la larghezza di banda stimata disponibile al lato client, espressa come un intero positivo e misurata in bits per secondo;
Blocksize: mandato dal client al media server per richiedere una particolare grandezza dei pacchetti, escludendo però gli headers dei protocolli di livello sottostante quale IP, UDP o RTP;
Conference: stabilisce una connessione logica tra una prestabilita conferenza ed uno stream RTSP; la conference-id non può essere cambiata nellambito di una stessa sessione;
Content Length: contiene la lunghezza del contenuto del metodo ed è obbligatorio usarla per quei messaggi che hanno dati anche dopo il campo header, come ad esempio nella risposta ad una richiesta di "DESCRIBE" dove in seguito al header sarà allegata la descrizione della presentazione;
CSeq: specifica il numero di sequenza di una coppia richiesta-risposta; questo campo deve essere presente in ogni messaggio RTSP. Per ogni richiesta, la relativa risposta avrà stesso numero, come del resto anche una ritrasmissione dovrà contenere stesso numero delloriginale;
Expires: fornisce la data e lora oltre cui la descrizione del media dovrebbe essere considerata scaduta;
Range: utilizzato sia nelle richieste sia nelle risposte, specifica un intervallo temporale relativo alla durata della presentazione; si farà riferimento ad unità temporali in formato NPT o SMPTE;
Require: usato dal client per richiedere al server quali opzioni possa o meno supportare; il server, nel caso di risposta negativa, risponderà usando lheader "Unsupported"; tale meccanismo è molto importante poiché, permette allinterazione tra client e server di procedere senza ritardi nel caso in cui tutte le opzioni siano comprese e, viceversa, di procedere più "lentamente" qualora appunto ci sia una mancanza di comprensione;
RTP-Info: campo utilizzato per settare i parametri specifici del RTP nella risposta ad un PLAY; sarà composto di tre diversi sottocampi:
Rtptime: indica il timestamp RTP, corrispondente al valore di tempo presente nel header "Range", necessario al client per costruire il normal play time. Da notare che informazioni sui timestamps RTP si possono ottenere anche tramite il Real Time Control Protocol, ma i contenuti ottenuti, non sono sufficienti per generare una completa mappatura nel NPT. Inoltre, per assicurare che tali informazioni siano disponibili immediatamente al momento della ricerca, è nata la necessità di introdurli nel canale di controllo fornito dal RTSP;
Scale: la presenza in questo campo di un valore "1", indica la riproduzione o la registrazione del media alla velocità normale di visione, mentre ad esempio un valore pari a "2", indica un azione a velocità doppia rispetto al normale;
Speed: necessario al client per richiedere al server la distribuzione dei dati ad una velocità particolare a patto però che il server sia disponibile ad esaudire tale operazione o abbia le possibilità per farlo. Anche in questo caso la velocità di riproduzione sarà codificata in cifre indicanti multipli o frazioni della velocità normale;
Session: campo presente nelle richieste e risposte, identificante una sessione RTSP iniziata da un media server con il metodo "SETUP" e conclusa da un "TEARDOWN". Come accennato in precedenza, lidentificatore di sessione deve essere scelto dal media server e deve essere fornito in un SETUP; il client, di suo, dovrà necessariamente fornire tale valore negli headers di ogni sua successiva richiesta relativa a tale sessione. Ci potrà essere anche lindicazione di un "timeout", permesso solo nelle risposte, necessario al server per indicare quanto tempo esso è in grado di mantenere in vita la presente sessione senza avere ricevuto alcuna richiesta dal client, ossia quanto tempo rimarrà in uno stato di "wait" per quella sessione;
Timestamp: descrive il momento in cui il client manda una richiesta al server;
Transport: indica quale protocollo di trasporto deve essere utilizzato e configura i propri parametri quali lindirizzo di destinazione, il time-to-live multicast e le porte di destinazione per ciascun flusso, valori questi, non propriamente specificati nella descrizione della presentazione. Vediamo in breve quali sono questi sottocampi:
Unsupported: serve per indicare nella risposta linsieme di quelle caratteristiche richieste dal client ma non supportate dal server;
User-Agent: il nome dellapplicativo utilizzato per la sessione di streaming RTSP.
Un client RTSP dovrà necessariamente essere in grado di:
Un server RTSP dovrà: