
Quindicesimo articolo dedicato alle web radio.
Vi ricordate quando dicevo che le web radio sono come delle torte? Bene, approfondiamo questo argomento.
Per potere comprendere questa guida è necessario avere una minima concezione di teoria dei grafi.
In realtà la vostra radio, o meglio, il vostro pc e la vostra banda, non sono una grande torta, ma più precisamente sono la radice di un grafo aciclico connesso, ovvero di un albero N-ario di altezza 1.
Ovvero si ha una situazione simile a questa immagine:

(la grafica non è delle migliori, ma di meglio non so fare)
Il nodo BLU è il Computer che trasmette, detto server, mentre i nodi ROSSI sono i computer o gli apparecchi che ricevono il flusso, chiamati client.
Il server è la radice dell’albero, mentre i client sono le foglie.
L’altezza dell’albero è 1, come precedentemente detto.
Il numero massimo di figli della radice, ovvero di client che possono ascoltare la radio è dato (teoricamente) da:

Ad esempio se ho una banda in upload di 1MBPS, e imposto un bitrate di 64 kbps, mi potranno teoricamente sentire al massimo 16 client.
Questo è il modo con cui abbiamo conosciuto la radio, e a parte le guide tecniche, ci siamo sempre occupati di poter aumentare la banda, in modo che sia possibile aumentare il numero di client. Giusto no?
Be, sappiate che non è l’unica politica possibile. Non è per forza detto che la mia radio si debba sentire da un unica fonte, è possibile creare i cosidetti Ripetitori (in inglese relay).
Da questo momento in poi, considereremo altre politiche, che sfruttano i ripetitori, e le suddivideremo in mono e pluri relayed radio.
Cominciamo considerando il grafo della MRR e commentandolo.

(la grafica non è delle migliori, ma di meglio non so fare)
Intanto identifichiamo i vari nodi:
- Il nodo blu è il server, il computer principale
- I nodi verdi sono dei client, ma sono anche dei Relay, ovvero sono dei ripetitori di segnale, ai quali si appoggiano altri client.
- I nodi rossi sono client, che non fungono da ripetitori.
C’è da dire che ogni client Rosso, è promuovibile a Relay, e che una foglia è generalmente ROSSA, ma può anche essere VERDE. (ovvero è un relay a cui non si è appoggiato nessuno).
Questi alberi hanno altezza pari al massimo numero di relay che devi attraversare prima di arrivare alla fonte del segnale, più uno.
C’è da dire che questa configurazione, se da un lato abbassa la domanda di banda imposta al server, distibuendola anche ai relay, d’altra parte aumenta logaritmicamente il ritardo di propagazione.
Vediamo come:
Se il computer A trasmette al computer B che ripete a sua volta al computer C che ripete a sua volta al computer D, ovvero:
Quanto vale il ritardo di propagazione? Ovviamente 4 volte il ritardo di propagazione di una trasmissione diretta, quindi potreste sentire musica con molto ritardo!!!
D’altronde, il buon senso ci ricorda che la situazione lineare di cui sopra, non ha nessuna utilità pratica.
Se Invece ipotizziamo che ogni la radice e tutti i sottorelay abbiano AL MASSIMO due ascoltatori, che possono a loro volta fare da relay, allora si crea un simpatico albero binario, e il ritardo di propagazione stavolta è dato da:

Con x che rappresenta il numero di ascoltatori contemporaneamente connessi e Il 2 che fa da base al logaritmo dipende dal numero di ascoltatori che può servire ciascun rela. Se questo numero aumenta, aumenterà la base del logaritmo e di conseguenza diminuirà il numero di relay che deve attraversare un client per sentire il flusso audio.
In generale possiamo quindi dire che: Se si riesce a distribuire bene il numero di computer che fungono da relay con il numero di pc che richiedono il flusso, allora il ritardo di propagazione cresce in funzione del logaritmo del numero dei CLIENT contemporaneamente connessi alla radio.
Cosi si che possiamo davvero ragionare in grande!
Cominciamo sempre commentando il grafo della PRR:

(la grafica non è delle migliori, ma di meglio non so fare)
Questo è un esempio di Radio Pluri Relayed, ovvero radio in cui i client sono serviti da più relay, in vero stile P2P.
Può sembrare un grafo ciclico connesso, ma in realtà non è affatto ciclico, in quanto è orientato come tutti gli altri. I client non rimandano nulla ai Relay, quindi non è possibile che un relay invii qualcosa ad un altro relay tramite un client! (e questo mi sembra ovvio…)
Questa situazione è la migliore in tutti i campi, ed è di fatto lo schema del P2P, ovvero quando scaricate qualcosa da Emule o da qualsiasi programma di File sharing, e condividite, sotto sotto voi siete dei relay, ovvero acquisite qualcosa e ricambiate dando qualcos’altro, e siete in grado di ricevere qualcosa da più relay in contemporanea (da qui la denominazione PLURI relayed radio).
Se invece vi limitate a scaricare senza condividere, siete solo dei client (oltre che lurkatori infami
)
Questo schema multi-connesso è la soluzione a tutti i problemi, in quanto si partiziona il carico di banda nel maggior numero di computer possibili.
Che bello! Già, fantastico, peccato che sia impossibile da implementare in pratica.
Per quale motivo?
Semplice, supponiamo di essere un semplice client, che vuole sentire Radio Mammamiachesballo.
Radio Mammamiachesballo mi permette l’ascolto passando da 4 relay, perchè sono tutti occupati ai livelli superiori.
Quindi ho un ritardo pari a 4.
Ad un certo punto, si libera uno “spazio” su un relay al livello 2, me ne posso appropiare.
Si, ma a questo punto cosa succede? Succede che mi arrivano parti dello stesso flusso, sfasati di una certa quantità che è data dalla differenza dei ritardi, questo manda tutto a put***…
Anche qualora fosse possibile davvero segmentare il flusso (e non so se si possa fare davvero), non si potrebbe non essere vincolati dai diversi ritardi. (Queste sono considerazioni semi-personali, se qualcuno può provare che la cosa non è come dico, non solo lo pubblicherò, lo ringrazierò e se è di Palermo gli offrirò qualcosa, ma addirittura sarò pronto ad ammettere di avere detto cazzate pubblicamente)
Purtroppo, non è nemmeno possibile usufruire di più relay sullo stesso livello, perchè i ritardi di propagazione non dipendono solo dal livello, ma a quanto ho potuto provare, anche da molti altri fattori.
Considerazione finale sul modello plury relayed radio: Se si riesce a rendere prossimi a 0 i ritardi di propagazione dei flussi in streaming, allora questo modello può avere un senso, per ora accontentiamoci della possibilità concreta di avere una mono relayed radio.
P.S Questa è pura teoria… Sapete perchè? be, mi autocito da un altro post, quando ho commentato l’articolo 7 comma 1 lettera E del maledetto modulo awr:
Nel primo comma, di importante c’è soltanto la lettera E (le altre sono quisquilie…) che con un giro di parole VIETA IL REDIRECT ovvero dice che non è possibile utilizzare nel proprio canale flussi di qualsivoglia tipo appartenenti ad un altra radio. Scordatevi quindi di creare ponti di web radio e di ritrasmettere le principali radio in streaming del web. In teoria non sarebbe fattibile utilizzare PeerCast, o fare dei relay. Io sono pronto a muovere guerra.

Ciao Fabrizio,
Complimenti per l’articolo, hai descritto i concetti fondamentali dello streaming P2P in maniera semplice ed efficace.
Premetto che, pur avendo realizzato CoopCast, non sono affatto un esperto di streaming.
Nonostante ciò provo a ragionare insieme a te sui problemi del relaying.
La prima cosa che mi viene in mente è che il problema del cambio del relay si presenta anche nel caso di strutture mono-relayed:
Immaginiamo la lista (albero 1-ario) S–>R1–>R2–>C. Il client sta ricevendo lo stream da R2 con un ritardo pari a 3. Che succede se R2 muore (che sò, si rompe il pc, spegne tutto perchè è pronta la cena, la telecom gli taglia l’ADSL) ? E’chiaro che il network (nel caso di CoopCast il tracker) deve redirigere il client verso un altro relay, nell’esempio R1.
In tal caso il ritardo cambia e diventa, supponiamo, pari a 2. E’ evidente che il client potrebbe ricevere frames che aveva già ricevuto. In tal caso è responsibilità del client (CoopCast Peer, nel mio caso) scartare detti frames, potendoli discriminare sulla base di un sequence-number. CoopCast Peer ragiona così: tiene traccia dell’ultimo sn ricevuto, diciamolo X; quando arriva il frame con sn Y, se risulta Y<=X allora lo scarta.
Spero di essere stato chiaro.
E’ evidente che potrebbe verificarsi anche il problema inverso e cioè che, in seguito alla caduta di un relay, un client viene rediretto su un nuovo relay con ritardo maggiore.
In tal caso il client non può fare molto e allo stream ricevuto viene a mancare necessariamente un pezzetto. Fortunatamente l’algoritmo di encoding si fa carico di risolvere tale problema e lo stream continua ad essere correttamente riprodotto (in genere avviene solo una breve pausa durante la riproduzione). Mi pare di aver capito che il meccanismo con cui vengono corretti tali errori sia basato sul concetto di keyframes, di cui però non parlo poichè non l’ho ancora approfondito.
Ora però voglio porre una questione di tipo diverso. Se è vero che il problema dei ritardi (vogliamo battezzarlo latenza ?) si pone in riferimento alle situazioni di cambio di relay,
quali conseguenze pratiche comporta in situazioni più normali? Voglio dire: se riesco ad ascoltare lo stream con una latenza di tot secondi, non posso essere comunque felice e contento e far finta di niente (sempre se me ne accorgo)?
Ora debbo proprio andare, spero di rivederci presto.
Ciao Gilberto, ti ringrazio per l’intervento, la tua opinione e competenza mi è sempre molto utile.
E’ tutto esattamente come dici. Peccato davvero che sia impossibile creare una pluri relayed radio.
Infatti tutti gli ascoltatori di web radio sono felici e contenti! Chiunque ascolta una radio realizzata con server shoutcast, ha una latenza di parecchi secondi, anche se direttamente connesso alla sorgente.
Non so se questo sia imputabile al fatto che il protocollo a livello applicazione icy (che è una “riformulazione” di http) si basi su un protocollo a livello di trasporto TCP, che richiede un handshaking ed ha il controllo di congestione.
Sarebbe stato meglio UDP, del resto perdere qualche frame non è un problema per applicazioni multimediali, mentre mantenere la banda costante, onestamente si.
Salutoni…
Ciao fabrizio grazie per tutto quello che fai.
In merito al problema in oggetto ho capito la teoria, ma non ho capito la pratica.
A trasmette su un indirizzo fisso.
B riceve collegandosi all’indirizzo fisso.
Come fa B a rillangiare?
Ciao antonio, grazie a te per la visita.
Non ho capito bene il concetto di “rilanciamento”, ma posso intuirlo.
Tu dici: “Come fa chi si collega ad un relay a raggiungere la radio da un singolo indirizzo?”
Se è questa la domanda te lo dico io: Si utilizza uno dei tanti tipi di metafile, come pls, asx, ram o altri ancora.. che permettono l’inserimento di più indirizzi di flussi audio. Chi scarica ed esegue questo metafile, può ascoltare la radio da un elenco di fonti (la sorgente e i relay) e scegliere sia quelle disponibili, che le migliori.
Salutoni
Ciao fabrizio,
e sui peer natted/firewalled cosa possiamo dire?
Fino a qualche tempo fa pensavo che nell’albero dei relaying DOVESSERO ESISTERE (nel senso di NON POTESSERO NON ESISTERE) i così detti “dead-ends”, “foglie morte”, costituite da quei peers che, pur ricevendo correttamente lo stream, non possono rilanciarlo essendo dietro un NAT/firewall e quindi inaccessibili da internet. Ho invece scoperto con grande piacere (grazie all’amico Hugo Neira) dell’esistenza di una tecnica chiamata “udp hole punching” che permette di superare brillantemente il problema e di effetture il relaying anche da dietro nat, rendendo la scalabilità dell’albero delle connessioni virtualmente illimitata. Ho subito messo mano a ferri e, finalmente, sono riuscito ad ottenere una versione di CoopCast (http://coopcast.netsolutions.it) dotata del NAT-traversal. Quello che sembrava (almeno a me) il più grosso limite del p2p streaming è stato superato!
Per essere corretto debbo però dire che la versione attuale di CoopCast, la 0.34 beta, soffre ancora di problemucci di stabilità, sui quali comunque sto lavorando tenacemente.
HLVS
Gibbo
Ciao Gibbo.
Nella mia alquanto semplicistica spiegazione, ho considerato i peer natted/firewalled alla stregua di dead-ends.
Ho considerato che chi (per volontà o per impossibilità oggettiva) non è in grado di rilanziare debba essere etichettato come foglia rossa e di conseguenza dead-end.
Il tuo lavoro è grandioso, ti ringrazio tanto che tu stia informandomi(ci) del work in progress del tuo progetto.
Se vuoi scrivere qualcosa sull’ udp hole punching ti ringrazierei molto.. anche sotto forma di link ad altro sito.
Ciao a Tutti! ho letto per caso questo thread…beh da un paio di mesi sto lavorando ad un progetto pesante ma appassionante ( farlo solo è ancora più dura ) ma che in qualche modo riguarda i vostri discorsi. Toxic ( il mio progetto ) è una piattaforma di streaming p2p basata su udp. Vero tutto quello che dite, però dimenticate che è possibile implementare buffer abbastanza sofisticati da sopportare ritardi diversi in un sistema pluri ripetitore. Nel caso di toxic ogni peer è ripetitore e rilascia al max della sua banda una frazione dei pacchetti che riceve lasciando poi a peer più potenti la compensazione. Su ogni peer poi un sofisticato buffer riordina i pacchetti giunti da fonti diverse posizionandoli temporalmente e dando un margine di n sec per far si che seppur provenendo con ritardi differenti risultino tutti pronti contemporaneamente allo scadere degli n secondi per essere riprodotti. ovviamente sto riducendo all’osso. il discorso è molto molto più complesso! alla prox
@Alessandro:
Complimenti per il progetto, ma non capisco una cosa, è vero si che si può utilizzare un pluriripetitore, ma il ritardo sarà sempre pari a quello del ripetitore con ritardo maggiore, per forza di cose, il chè implica che non è possibile creare una pluri relayed radio se non tramite abbattimento dei ritardi ad un fattore comune, che è ovviamente il ritardo più alto.
radio marte non riesco a sincronizzarla perche tramette a bitrate basso
@Antonio10:
Che significa la frase che hai scritto? :S
Ciao Fabri forse sono stato poco attento ma non sono riuscito a capire una cosa: se ci accontentiamo del ritardo che abbiamo con il sistema P2P riusciamo comunque a realizzare una web radio oppure è LAVORO PERSO?
Grazie e complimenti
@Giuliano:
Certo, infatti esiste peercast. Quello che è difficile da implementare è il multifonte, detto pluri relayed radio
Dove posso trovare informazioni e consigli utili per semplificarmi la vita? Una radio web può essere realizzata utilizzando qualsisasi gestore che sia Tiscli Alice Fatweb?
Ciao e tenk
@Emix: fai prima a dire cosa significhi “semplificarsi la vita”
Si, una web radio si può fare con qualsiasi gestore.
“Semplificarmi la vita” nel senso se ci sono siti o libri dove uno poco esperto come me possa riuscire ad installare ed impostare il tutto. Ciao e grazie
@emi:
Ci sono diverse guide su internet.. per quanto riguarda libri obiettivamente non saprei.
Se vuoi puoi leggere tutti i miei articoli dedicati alle web radio e commentare in ciascun articolo di interesse.
[...] Si è già parlato teoricamente di P2P e radio, ma adesso vediamo come potere affrontare concretamente il problema. [...]
[...] Tempo fa, parlai anche se in modo minimale di alberi e teoria dei grafi. [...]