Tecniche per l`affidabilità delle comunicazioni basate su codici FEC
by user
Comments
Transcript
Tecniche per l`affidabilità delle comunicazioni basate su codici FEC
Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica tesi di laurea specialistica Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Anno Accademico 2007/2008 Relatore Ch.mo prof. Stefano Russo correlatori Ing. Christiancarmine Esposito Ing. Generoso Paolillo candidato Angelo Gentile matr. 885/156 Alla mia famiglia Non cercare di diventare un uomo di successo, ma piuttosto un uomo di valore. Albert Einstein Indice Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS ............................................................................................................................................I Indice............................................................................................................................................... V Introduzione ..................................................................................................................................... 7 Capitolo 1 ....................................................................................................................................... 13 Meccanismi di comunicazione affidabile e stato dell’arte dei protocolli multicast........ 13 1.1 I requisiti di un protocollo di comunicazione affidabile e i sistemi mission-critical ........... 13 1.2 Schemi per la realizzazione di una comunicazione affidabile ............................................. 15 1.2.1 Affidabilità basata sul sender ........................................................................................ 20 1.2.2 Affidabilità basata sul receiver ..................................................................................... 21 1.3 I protocolli multicast affidabili ............................................................................................ 24 1.3.1 RMDP:un semplice protocollo basato su FEC ............................................................. 24 1.3.2 Digital Fountain: affidabilità sender-based mediante uso di Tornado Codes ............... 28 1.3.3 EC-SRM:un approccio ibrido NAK + FEC .................................................................. 30 1.3.4 Slingshot:un esempio di affidabilità mediante receiver-based FEC ............................. 34 1.3.5 Ricochet: la Lateral Error Correction............................................................................ 38 Capitolo 2 ....................................................................................................................................... 45 Tecniche di affidabilità basate su Erasure Codes in piattaforme DDS........................... 45 2.1 Introduzione ......................................................................................................................... 45 2.2 Gli Erasure Codes ................................................................................................................ 46 2.2.1 Concetti di base ............................................................................................................. 47 2.2.2 Codici Reed-Solomon ................................................................................................... 50 2.2.3 Codici LDPC ................................................................................................................ 52 2.3 I middleware di tipo publish/subscribe e l’OMG Data Distribution Service ....................... 57 2.3.1 Il modello di comunicazione publish/subscribe ............................................................ 57 2.3.2 Introduzione allo standard OMG DDS ......................................................................... 61 2.3.4 Modello di programmazione del DDS ......................................................................... 63 2.3.4 Le politiche di QoS del DDS ........................................................................................ 65 2.3.5 Le problematiche nell’utilizzo del DDS nel contesto dei MCS .................................... 69 2.3.6 Una possibile soluzione: l’utilizzo di FEC ................................................................... 70 V Capitolo 3 ....................................................................................................................................... 72 Erasure Codes a livello applicativo e realizzazione di un protocollo di trasporto affidabile in OpenDDS ......................................................................................................... 72 3.1 Integrazione degli Erasure Codes in piattaforme DDS ........................................................ 72 3.2 Erasure Codes a livello applicativo...................................................................................... 74 3.2.1 La piattaforma RTI DDS............................................................................................... 74 3.2.2 Libreria Jerasure per codici Reed-Solomon .................................................................. 80 3.2.3 L’applicazione benchmark ............................................................................................ 83 3.3 La campagna sperimentale ................................................................................................... 85 3.3.1 Descrizione del testbed ................................................................................................. 85 3.3.2 Caratterizzazione del comportamento di rete................................................................ 86 3.3.3 Emulazione di rete:il modello di Gilbert....................................................................... 89 3.3.4 Risultati e valutazione delle prestazioni........................................................................ 91 3.3.5 Considerazioni .............................................................................................................. 98 3.4 Erasure Codes a livello trasporto ......................................................................................... 98 3.4.1 La piattaforma OpenDDS ............................................................................................. 99 3.4.2 Il Pluggable Transport Layer di OpenDDS................................................................. 101 3.5 Il prototipo di un protocollo di trasporto FEC-based per OpenDDS ................................. 106 3.5.1 Scelte di progetto ........................................................................................................ 106 3.5.2 Architettura complessiva............................................................................................. 107 3.5.3 Integrazione in OpenDDS ........................................................................................... 112 Conclusioni e sviluppi futuri ........................................................................................................ 115 Appendice A ................................................................................................................................ 118 Realizzazione di un plug-in di trasporto in OpenDDS ................................................... 118 A.1 Utilizzo del Transport Framework di OpenDDS .......................................................... 118 Ringraziamenti ............................................................................................................................. 136 Bibliografia .................................................................................................................................. 140 VI Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Introduzione I sistemi per la distribuzione dei dati hanno subito in anni recenti una profonda trasformazione che si è tradotta in una enorme crescita in termini di complessità e dimensioni. Essi sono oramai distribuiti su scala geografica, costituiscono cioè vere e proprie federazioni di sistemi i cui sottosistemi componenti sono spesso situati a distanze tali da dover interagire attraverso reti di tipo WAN e/o attraverso la Internet. La nuova generazione di tali sistemi prende il nome di Ultra Large Scale (ULS) Systems proprio ad indicare tali caratteristiche. L’estensione su scala geografica dei sistemi ULS e l’elevato numero di parti che in essi intervengono pongono delle serie problematiche di affidabilità e scalabilità. Data la vastità delle reti di interconnessione è infatti elevatissima la probabilità che qualche componente hardware si guasti o che si verifichi una congestione, provocando la perdita dei dati inviati. I sistemi ULS devono pertanto essere in grado di funzionare anche in presenza di un certo numero di guasti di rete, necessitano cioè di appositi meccanismi di fault-tolerance. In questo contesto si può dunque definire come affidabile un servizio di distribuzione dei dati se esso garantisce la consegna anche in presenza di guasti di rete. La scalabilità è un altro requisito fondamentale per tali sistemi. Gli ULS hanno moltissimi utenti ed utilizzano grosse quantità di risorse data la vastità della scala di distribuzione, ed 7 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS è molto probabile che il numero di utenti aumenti durante il ciclo di vita degli ULS, con conseguente aumento delle risorse richieste. È pertanto necessario saper gestire la crescita delle dimensioni in modo che non provochi un peggioramento eccessivo delle prestazioni. Un sistema è infatti scalabile se le sue prestazioni degradano linearmente al crescere della dimensione del sistema stesso. Nel dominio dei sistemi orientati alla distribuzione dei dati esiste la classe dei sistemi mission-critical, per la quale ai requisiti concernenti l’affidabilità e la scalabilità se ne aggiungono altri riguardanti la celerità nella consegna dei dati stessi. Si è cioè di fronte alla necessità di offrire un servizio di distribuzione affidabile dei dati nel rispetto di determinati vincoli temporali. Esempi di sistemi mission-critical sono i sistemi di controllo del traffico aerero (ATC-Air Traffic Control) dislocati su scala continentale. Oggetto del presente lavoro di tesi è lo studio di tecniche innovative per la realizzazione di comunicazioni affidabili in sistemi mission-critical che effettuano distribuzione di dati. I due classici approcci alla realizzazione di una comunicazione affidabile prevedono l’utilizzo di: • Tecniche di Automatic Repeat reQuest (ARQ) che raggiungono l’affidabilità mediante richieste (esplicite o meno) di ritrasmissione dei dati persi; • Tecniche di Forward Error Correction (FEC) che consentono di rimediare alle eventuali perdite e/o corruzioni dei dati mediante codici rivelatori e correttori d’errore. 8 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Le tecniche di tipo ARQ hanno il pregio della semplicità implementativa, soffrendo peraltro di problemi inerenti alla proliferazione delle richieste di ritrasmissione e all’elevata latenza in fase di scoperta e recupero perdite. Le tecniche di tipo FEC, pur presentando un carico computazionale aggiuntivo dovuto alle fasi di codifica e decodifica, permettono di superare le limitazioni degli schemi ARQ offrendo in generale una maggiore prevedibilità dei tempi di recupero dei pacchetti persi. Non esiste tuttavia uno schema in assoluto migliore di un altro e l’efficacia di ognuno di essi dipende dal contesto in cui operano e dai requisiti dell’applicazione. Una soluzione architetturale interessante per la realizzazione di applicazioni orientate alla distribuzione dei dati in tali sistemi è costituita dai sistemi middleware di tipo publish/subscribe . Il modello Publish/Subscribe risulta particolarmente adatto alla realizzazione di applicazioni distribuite aventi come task principale la distribuzione dei dati. I middleware basati sul modello Publish/Subscribe offrono infatti un elevato grado di disaccoppiamento tra le entità comunicanti, rendendo particolarmente agevole la realizzazione di schemi di comunicazione molti-a-molti (anche con requisiti di tempo stringenti,come nel caso di sistemi real-time e mission critical appunto) ed offrendo un elevato grado di scalabilità al crescere dei partecipanti alla comunicazione. In particolare in tali contesti è ampiamente utilizzato un particolare tipo di middleware di tipo publish/subscribe – l’OMG DDS (Data Distribution Service)– che oltre alle proprietà comuni ai sistemi basati su tale modello, offre un ampio supporto alle politiche di QoS (Quality of Service) Fissato l’obiettivo di realizzare uno schema di affidabilità innovativo per i servizi di distribuzione dei dati e partendo dalla constatazione che, allo stato attuale, le piattaforme 9 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS DDS esistenti offrono meccanismi di affidabilità basati esclusivamente su schemi ARQ, in questo lavoro di tesi si è: • Studiata sperimentalmente la realizzazione di meccanismi che, mediante uso di codici di protezione (Erasure Codes) integrati nel DDS, introducano determinismo nella consegna dei dati; • iniziata la realizzazione di un protocollo di trasporto affidabile per piattaforme DDS integrante Erasure Codes. In una prima fase di studio si è utilizzata un’applicazione benchmark per estrarre dati sperimentali che permettessero di confermare la validità dell’approccio. In particolare si è messo a confronto l’utilizzo del servizio di consegna affidabile della piattaforma DDS stessa, basato su soli meccanismi di ritrasmissione, con l’utilizzo di un schema FEC realizzato a livello applicativo, cioè “poggiato” sul servizio best-effort del DDS. Le sperimentazioni effettuate in laboratorio mediante emulatori WAN confermano che sotto certe ipotesi è possibile realizzare una consegna certa dei dati con il solo utilizzo di FEC, senza dover ricorrere necessariamente al servizio di consegna affidabile fornito dalla piattaforma DDS. Alla luce dei risultati ottenuti si è tuttavia compresa la necessità di un cambio di approccio,stante la dipendenza della soluzione iniziale dal DDS stesso. Per realizzare un meccanismo che non fosse vincolato al DDS, ci si è dunque concentrati sulla possibilità di realizzare uno strato di trasporto affidabile da integrare in una piattaforma DDS. In particolare si è lavorato su un’implementazione open-source dello standard DDS, OpenDDS. Partendo dal transport framework di OpenDDS e da un protocollo multicast UDP-like (cioè non affidabile) si è realizzato un primo prototipo di un semplice protocollo integrante Erasure Codes. Tale prototipo, pur essendo estremamente semplice, costituisce 10 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS una piattaforma iniziale per la costruzione di un protocollo di trasporto complesso per DDS basato su schemi di tipo FEC. 11 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 12 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Capitolo 1 Meccanismi di comunicazione affidabile e stato dell’arte dei protocolli multicast 1.1 I requisiti di un protocollo di comunicazione affidabile e i sistemi missioncritical Un protocollo di comunicazione può essere definito affidabile se garantisce la consegna dei messaggi anche in presenza di guasti di rete. La consegna certa è un requisito particolarmente laborioso da raggiungere in alcuni contesti applicativi. L’affidabilità della comunicazione in sistemi mission-critical (MCS-Mission Critical Systems) operanti su scala geografica è l’oggetto del presente lavoro di tesi. I MCS di nuova generazione sono definiti come federazioni di sistemi autonomi interconnessi da reti a estensione geografica. I suddetti sistemi presentano un’elevata criticità temporale: dati inviati oltre fissati limiti possono condurre a instabilità del sistema con conseguenti rischi per persone o cose. La loro natura mission critical sottintende inoltre la capacità di far fronte ad errori e guasti che inevitabilmente si presentano in fase operativa. Infine,rappresentando una classe di sistemi ULS (Ultra Large Scale)[25] sono caratterizzati da una grande quantità di dati scambiati,diversi e numerosi utenti umani e,come già detto, 13 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS dall’utilizzo di reti di telecomunicazione ad estensione geografica (reti WAN- Wide Area Network). Figura 1 - Esempio di sistema mission critical su scala geografica: controllo del traffico aereo Tali reti sono caratterizzate da: • elevata imprevedibilità dei patterns di perdita dei pacchetti • elevata variabilità della latenza di rete (definita come l’intervallo di tempo intercorrente tra l’invio del dato da parte del mittente e l’effettiva ricezione dello stesso da parte del ricevente.) • guasti di rete frequenti ,non prevedibili e spesso correlati tra loro,con conseguenti perdite di messaggi ,isolate (raramente) o a burst . 14 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Le caratteristiche di tali sistemi e delle reti su cui operano impongono requisiti particolarmente stringenti alla consegna dei messaggi (e più in generale,di qualunque tipo di dato scambiato tra i partecipanti) e dunque ai protocolli utilizzati. Schematizzando,si possono identificare i seguenti requisiti per l’infrastruttura di comunicazione dei MCS.: • Consegna dei dati entro fissati limiti temporali (prevedibilità); • Tolleranza ai guasti di rete; • Scalabilità: degrado lineare delle prestazioni al crescere delle entità comunicanti. Ai requisiti sopra elencati va ovviamente aggiunto il requisito di consegna certa dei dati inviati, senza il quale è impossibile definire un meccanismo di comunicazione come affidabile. 1.2 Schemi per la realizzazione di una comunicazione affidabile Il recupero dei messaggi da corruzione1 e/o perdita può essere raggiunto sostanzialmente mediante due tecniche. Esse possono essere nella pratica declinate in varie forme allo scopo di realizzare schemi flessibili ed adatti ai contesti specifici. Tali tecniche sono[10]: ¾ ARQ – Automatic Repeat reQuest: (lett. “richiesta di ritrasmissione automatica”) si basa sulla ritrasmissione dei pacchetti corrotti o mancanti 11 nel contesto considerato la corruzione del pacchetto provoca lo scarto dello stesso,dunque è equivalente alla perdita 15 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS attivata da un implicito o esplicito riscontro positivo o negativo (ACK /NAK) inviato dai riceventi. Figura 2 - Funzionamento di un tipico schema ARQ Essendo le perdite spesso correlate possono esser necessarie più ritrasmissioni per assicurare la consegna di un determinato pacchetto ad un determinato receiver2. Tuttavia in media il numero di ritrasmissioni per ogni pacchetto è 1/(1-p) con p pari al tasso di perdita dei pacchetti(PLR,packet loss rate)[10]. Le tecniche ARQ sono di norma utilizzate in protocolli multicast per la semplicità di implementazione e per la loro efficacia,pur presentando alcune limitazioni quali: • necessità di un canale di ritorno, • latenza di recovery di un pacchetto perso dipendente dal RTT e dal pattern di perdita dei pacchetti (e quindi dalla lunghezza dei bursts) 2 • ridotta scalabilità • sender quale bottleneck della comunicazione Se un pacchetto è andato perso potrebbe cioè capitare che anche alcune sue ritrasmissioni si perdano 16 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Gli schemi ARQ non godono di una buona scalabilità se utilizzati in protocolli multicast .Infatti la probabilità di perdite incorrelate cresce con la dimensione del gruppo multicast richiedendo la ritrasmissione della maggioranza dei pacchetti[10] ,mentre l’invio continuato dei riscontri (positivi) da parte dei singoli receiver può provocare un fenomeno noto in letteratura come ACK implosion [9,11],in cui il sender è letteralmente sommerso da messaggi di riscontro. Inoltre la dipendenza della latenza di recovery dal RTT rende tali schemi inadatti al loro utilizzo in contesti real time [10,11]. La dipendenza della stessa dai patterns di perdita dei pacchetti,che sono in generale diversi per ogni receiver,li rende inadatti anche all’utilizzo su canali con capacità di banda limitata(o comunque in contesti in cui è da evitare lo spreco di banda),in quanto essa provoca ritrasmissioni di pacchetti spesso non necessari alla maggioranza dei receivers[17]. È chiaro inoltre che l’utilizzo di schemi ARQ in reti ad estensione geografica comporterebbe un’elevata imprevedibilità della latenza di recovery: • in tali reti è infatti impossibile ottenere una stima precisa dell’RTT a causa della variabilità della latenza di rete; • l’imprevedibilità dei patterns di perdita dei pacchetti non permette invece di stimare con precisione le lunghezze dei bursts da cui dipende direttamente la latenza dell’ARQ. Tutto questo si traduce nell’impossibilità di offrire dei limiti superiori ed inferiori alla latenza di recovery . Gli schemi ARQ si rivelano pertanto sostanzialmente inadatti all’utilizzo in MCS. 17 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS ¾ FEC –Forward Error Correction: (lett.” Correzione degli errori in avanti”)si basa sull’utilizzo di codici che permettono di ricostruire i pacchetti persi tramite l’aggiunta di dati ridondanti .La comunicazione si arricchisce dunque di una fase di codifica lato sender,con costruzione di pacchetti di ridondanza da inviare insieme ai dati originari, e di una fase di decodifica lato receiver,dove i dati vengono ricostruiti dai pacchetti ricevuti(cfr. figura seguente). Figura 3 - Funzionamento di uno schema FEC Gli svantaggi di tali schemi sono sostanzialmente relativi all’aumento del carico computazionale dovuto alla codifica/decodifica dei dati,che tuttavia è bilanciato dalla superiore scalabilità e dalla ridotta,nonché maggiormente predicibile, latenza della fase di discovery e recovery perdite rispetto a schemi di tipo ARQ. La maggiore scalabilità dipende dal fatto che negli schemi FEC la fase di recupero è a carico dei destinatari. La latenza di scoperta e recupero perdite si riduce perché non è più necessario attendere una comunicazione dal destinatario al sender per ottenere il dato. Inoltre essa diventa maggiormente predicibile in quanto la codifica rende i 18 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS dati indipendenti dal pattern di perdita dei pacchetti: lo schema funziona finchè le perdite sono in numero minore o uguale a quello massimo assunto. Gli schemi FEC costituiscono pertanto una soluzione valida per garantire l’affidabilità in protocolli di comunicazione multicast. FEC si fonda su assunzioni di tipo statistico sul numero massimo di perdite itrodotte dal canale pertanto nei casi in cui il numero di perdite reale sia maggiore di quello atteso, meccanismi di FEC “puri” possono non garantire da soli la consegna certa dei dati,rendendo necessaria talvolta l’introduzione di uno schema misto FEC+ARQ[10] per rimediare con le ritrasmissioni ai casi in cui FEC fallisca. Schemi FEC puri restano comunque una soluzione attraente in contesti applicativi in cui il ritardo introdotto da soluzioni ARQ è inaccettabile oppure in cui ricontattare il sender per i pacchetti persi è impossibile o da evitare [11]. La suddivisione in schemi ARQ e FEC costituisce una prima possibile classificazione delle tecniche di affidabilità. È tuttavia possibile un’ulteriore suddivisione in due classi [11] che distingue gli schemi in base alla responsabilità della reliability della comunicazione : • Affidabilità basata sul sender (sender-based reliability) • Affidabilità basata sul receiver (receiver-based reliability) 19 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 1.2.1 Affidabilità basata sul sender Negli schemi ad affidabilità basata sul sender è l’entità che trasmette in multicast a dover assicurare la consegna certa dei dati. Tali schemi possono essere sia basati su tecniche ARQ che FEC (oppure su approcci ibridi) che possono a loro volta essere così classificati[9,11]: • ACK/timeout:in questo approccio i receivers inviano dei riscontri positivi (ACKs) al sender quando ricevono un pacchetto entro un certo intervallo di tempo( si rende quindi necessario l’utilizzo di timeout);è un meccanismo che in comunicazioni multicast ad elevata frequenza di invio messaggi porta,specialmente con un elevato numero di receivers,al già citato problema dell’ ACK implosion. Una delle soluzioni proposte per aggirare il problema e rendere lo schema parzialmente scalabile in contesti multicast è quello dell’uso di ACK trees,cioè di aggregazioni gerarchiche di riscontri in modo da ridurne il numero e dunque il carico sul sender. Tale soluzione non è tuttavia utilizzabile in applicazioni ad elevata criticità temporale in quanto una qualsiasi struttura gerarchica(quale è l’albero di ACKs) introduce un ritardo spesso inaccettabile nel processo di scoperta dei pacchetti persi [9,11]. Altro rimedio contro l’ACK implosion è l’utilizzo di riscontri negativi (NAKs,cfr 1.2.2) che prevede la segnalazione da parte dei receivers dei soli pacchetti mancanti,riducendo quindi drasticamente il numero di messaggi complessivamente inviati al sender. • Sender-based FEC:è l’applicazione più immediata dello schema FEC: la codifica è a carico del sender che genera un certo numero c di pacchetti di ridondanza per ogni r pacchetti-dato. 20 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Tale schema gode di una certa flessibilità in quanto il numero di pacchetti ridondanti può essere scelto in base alle esigenze specifiche. Sono possibili soluzioni miste in cui ad un approccio FEC di base si affiancano schemi ARQ per assicurare l’affidabilità anche in quelle situazioni in cui il solo FEC non abbia consentito la ricostruzione del dato. Nell’approccio sender-based l’efficienza temporale dello schema FEC dipende fortemente dalla frequenza di invio del sender stesso e dal codice usato per la protezione. Tale soluzione è comunque adatta soprattutto ad applicazioni in cui è presente un unico sender che trasmette ad tasso elevato e costante ad un singolo gruppo(in modo da poter scegliere in maniera opportuna il numero di pacchetti ridondanti)[9,11]. In generale i meccanismi sender-based presentano alcuni svantaggi[11]: • in molti casi il sender sarà probabilmente impegnato ed una richiesta di ritrasmissione potrebbe sovraccaricarlo; • il RTT introduce una latenza non necessaria nel processo di recupero dei pacchetti (si potrebbero infatti recuperare i dati da altri receiver “vicini” molto meno impegnati del sender;cfr.par.succ). • infine, il sender costituisce un single-point-of-failure per cui in assenza di meccanismi di replicazione un crash del sender si traduce nella perdita definitiva dei messaggi non ancora ricevuti. 1.2.2 Affidabilità basata sul receiver In questi schemi la responsabilità della fase di scoperta delle perdite ed il loro recupero è a carico dei receivers della comunicazione (si considera il caso di comunicazioni multicast). 21 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Come nel caso di affidabilità basata sul sender è possibile realizzare sia schemi basati su ARQ che su FEC [9]: • NAK/sender-based sequencing: il sender numera i messaggi multicast inviati ad un certo gruppo ed i receivers scoprono eventuali perdite quando arriva un messaggio successivo a quello atteso. Per effettuare il recovery inviano un riscontro negativo (NAK) al sender stesso o ad altri receivers ottenendo la ritrasmissione3(il NAK può essere inviato in unicast al sender o in multicast all’intero gruppo[11]). La latenza associata alla scoperta della perdita è dunque proporzionale al tempo che intercorre tra due invii successivi da parte del sender al gruppo,e dunque dipende anche in questo caso dal tasso di invio del sender stesso. Approcci misti prevedono l’invio di pacchetti di ridondanza codificati con tecniche FEC all’atto della ritrasmissione anziché dell’intero dato originario(cfr. par.1.3.3). • Receiver-based FEC: tra gli schemi illustrati precedentemente ,quelli basati su ACK sono intrinsecamente inadatti ad applicazioni multicast multisender mentre quelli basati su NAK con sender sequencing e FEC sender-based vincolano la latenza della scoperta delle perdite all’intervallo tra due invii successivi. Idealmente,la latenza dovrebbe essere indipendente da tale intervallo di tempo e si vorrebbe ottenere un meccanismo scalabile che però non perda la flessibilità del FEC.Tale combinazione è fornita dagli schemi FEC basati sui receivers: i receivers generano pacchetti FEC dai dati in ingresso e li scambiano con altri receivers scelti casualmente. Poiché i pacchetti codificati sono generati da dati in ingresso al receiver la latenza per 3 A rigore,il meccanismo NAK con sender sequencing si può considerare uno schema di affidabilità receiver-based nel caso in cui siano i receivers ad effettuare le ritrasmissioni,cioè se l’onere della fase di recovery non è a carico del sender. 22 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS il recupero delle perdite non dipenderà più dal tasso di invio del sender ma dal tasso di invio dell’intero gruppo multicast[9],cioè dalla velocità con cui i receivers scambiano informazioni tra loro,consentendo una maggiore scalabilità rispetto al numero di sender per gruppo. Gli schemi qui brevemente descritti costituiscono una classificazione comunque grossolana delle alternative possibili ma consentono di inquadrare con più chiarezza le soluzioni implementate nei protocolli multicast descritti nel seguito. 23 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 1.3 I protocolli multicast affidabili La proliferazione di applicazioni che necessitano di una distribuzione affidabile di dati ad un numero più o meno ampio di clients autonomi è stata la spinta principale allo sviluppo di nuovi protocolli multicast e broadcast[10,13]. La varietà di tali applicazioni e le diverse condizioni in cui esse operano (reti,numero ed eterogeneità dei componenti ,differenti requisiti temporali etc.) hanno portato alla progettazione,nel corso del decennio 1997-2007,di soluzioni più o meno valide in determinati contesti applicativi. Nel seguito si passano brevemente in rassegna le caratteristiche di alcuni di questi protocolli che costituiscono lo stato dell’arte delle comunicazioni affidabili. Di essi si analizzeranno i meccanismi di reliability (con riferimento alle classificazioni presentate nel paragrafo 1.2) ,il funzionamento complessivo e le principali scelte implementative operate dagli autori. Si consideri comunque che tipicamente un protocollo multicast affidabile è strutturato in 3 fasi logiche [9]: 1. Trasmissione dei pacchetti 2. Scoperta dei pacchetti persi 3. Recupero dei pacchetti persi 1.3.1 RMDP:un semplice protocollo basato su FEC Il Reliable Multicast data Distribution Protocol (RMDP) è il primo lavoro innovativo nell’ambito dei protocolli multicast basati su tecniche FEC per assicurare l’affidabilità[10]. 24 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Esso si presenta come protocollo per la distribuzione di files in multicast in una varietà di contesti (applicazioni operanti su LAN,applicazioni mobili/wireless). L’approccio FEC è del tipo sender-based con utilizzo di Erasure Codes di tipo ReedSolomon(cfr. cap 2) e con un limitato utilizzo di NAKs(approccio ibrido). Le assunzioni di base sono le seguenti: • La comunicazione avviene secondo un modello client-server • I dati da inviare hanno una dimensione nota e finita e sono suddivisi in L pacchetti di dimensione s • I clients hanno differenti velocità di ricezione,subiscono perdite differenti ed iniziano a ricevere pacchetti in momenti differenti Il principio di funzionamento è semplice: i dati vengono codificati con un ‘elevata ridondanza,utilizzando un (n,k)-codice (cfr.cap 2) con n>>k;la trasmissione dei dati inizia all’atto della richiesta del primo client e continua con un tasso fisso finchè ci sono clients attivi. In una prospettiva ideale k=L in modo che ,sfruttando le proprietà degli erasure codes, basti ricevere k pacchetti qualsiasi per ricostruire il dato. Questo significa che le perdite eventualmente occorse possono essere compensate semplicemente attendendo l’arrivo di ulteriori pacchetti in modo da arrivare a k. Il protocollo opera come segue: 1. Un client contatta il server richiedendo un file e specificando i parametri per il trasferimento (tasso di invio dati,dimensione blocchi) 2. Il server risponde con un set di parametri da utilizzare per ottenere il file richiesto:una session key,l’indirizzo utilizzato per inviare i pacchetti dato,la dimensione del file ed altre informazioni utili per il client. 25 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 3. Il server trasmette un numero sufficiente di pacchetti per consentire la ricezione del file anche in presenza di un certo numero di perdite(cioè,trasmette gli n pacchetti in cui sono stati codificati i k del dato) 4. Nel caso in cui il client rilevi un’interruzione nel flusso dei dati prima che la ricezione sia completa,è inviata al sender una richiesta di ulteriori pacchetti(continuation request,costituisce una sorta di NAK). Le prime due fasi del protocollo possono essere ripetute se una richiesta va persa in quanto sono entrambe idem potenti. L’ultima fase (che realizza in pratica un meccanismo ARQ mediante NAKs) spesso non è necessaria o perché la ridondanza iniziale consente la ricostruzione del dato oppure perché richieste parzialmente sovrapposte hanno provocato una maggiore durata del tempo di trasmissione del dato richiesto. Pur essendo il principio di funzionamento di RMDP molto semplice,gli autori sottolineano come siano importanti,in ottica implementativa, i parametri caratterizzanti il protocollo e di come si debba trovare un compromesso tra essi per costruire un’implementazione efficiente. Un primo parametro da dimensionare correttamente è la dimensione dei blocchi di codifica k :in un’implementazione reale k non può essere eccessivamente grande in quanto i tempi di codifica e decodifica rischiano di diventare eccessivi,tuttavia un valore elevato di k migliora le prestazioni in termini di protezione dagli errori. Inoltre k non dovrebbe essere fissato una volta per tutte ma dipendere dalla dimensione del file da inviare pur essendo più efficiente uno schema con k costante Una soluzione di compromesso proposta è la seguente:detta L la dimensione del file in numero di pacchetti,fissato k ad un valore tale da garantire un overhead di codifica/decodifica accettabile (“accettabile” secondo parametri che variano da contesto a 26 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS contesto) ,si suddivide il dato da inviare in B gruppi di k pacchetti ciascuno (con B= [L/k]) e poi si applica un (n,k)-codice ad ogni gruppo di k pacchetti. Infine,i gruppi vengono trasmessi in maniera interlacciata,un pacchetto per gruppo alla volta,come mostrato nella figura seguente: Figura 4 -Distribuzione dei dati nei gruppi ed ordine di invio del sender (RMDP) Questo adattamento rende il costo di codifica/decodifica indipendente dalla dimensione del file anche se introduce una condizione di ricostruzione leggermente più stringente: è necessario infatti ricevere non solo L differenti pacchetti ma essi devono includere almeno k pacchetti per gruppo;inoltre l’efficienza di codifica è in qualche modo ridotta,essendo pari ad 1 solo per k=L. L’implementazione di RMDP presentata dagli autori [10] si presenta come protocollo da utilizzare in aggiunta al multicast fornito da IP in reti wide-area per il trasferimento di files di media dimensione senza particolari requisiti temporali. Tuttavia nella fase iniziale del protocollo è possibile scegliere se utilizzare IP in unicast o in multicast,sia per garantirne l’usabilità anche in reti dove il multicast IP non è supportato,sia per consentire una superiore scalabilità del protocollo in contesti dove un client è interessato a ricevere un file senza avere un server preferenziale. Altro aspetto importante di RMDP è il limitatissimo utilizzo delle continuation requests da parte dei clients,che costituiscono la componente ARQ del protocollo. Tali messaggi vengono infatti utilizzati solo nel caso in cui una trasmissione sia interrotta. Il 27 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS limitato ricorso a tale meccanismo riduce sensibilmente il rischio di ACK implosion al sender. I limiti del protocollo RMDP sono da ricercarsi essenzialmente: • nella totale assenza di un meccanismo di controllo della congestione di rete, che può avere conseguenze drammatiche sulla perdita di pacchetti; • nella scarsa efficienza del codice Reed-Solomon utilizzato,che ne limita le performance in termini di codifica e decodifica di file di grosse dimensioni. 1.3.2 Digital Fountain: affidabilità sender-based mediante uso di Tornado Codes Il protocollo presentato in questo paragrafo utilizza un approccio FEC sender-based per assicurare la consegna certa dei dati[13]. Concepito per operare nel contesto della distribuzione in Internet di software e di contenuti multimediali, sfrutta le potenzialità di una particolare classe di codici (Tornado Codes,cfr. [13,15]) per risolvere problemi di overhead di codifica e decodifica (tipici dei codici Reed-Solomon utilizzati anche in RMDP) ed ottenere buone prestazioni complessive. L’idea alla base è quella di realizzare una “fontana digitale” mediante uso di un codice di protezione : i dati richiesti possono essere ricostruiti da un qualsiasi sottoinsieme di pacchetti codificati che abbia una dimensione totale pari alla dimensione del file richiesto. Dal punto di vista strettamente matematico questo è possibile mediante utilizzo di Erasure Codes (cfr.cap 2) che tuttavia consentono solo idealmente di realizzare tale astrazione. 28 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS I codici Reed-Solomon ,costituenti la classe standard di Erasure Codes,consentono infatti di codificare i k pacchetti contenenti i dati originari su n pacchetti-codice,con la possibilità di poter ricostruire i dati da un qualunque sottoinsieme di k pacchetti estratto dagli n totali. Pur sembrando questa una strada percorribile per la realizzazione di una “fontana digitale” non è ,dal punto di vista prestazionale, una soluzione valida: i codici Reed-Solomon soffrono di elevato overhead di codifica/decodifica dovuto alla densità del sistema lineare che definisce i codici stessi (cfr.par 2.2.2) ,overhead che diventa proibitivo anche per valori moderati di k ed n. La soluzione proposta in questo protocollo è dunque quella dell’approssimazione di una fontana digitale mediante utilizzo di Tornado Codes,una particolare classe di codici LDPC(cfr.par 2.2.3). Dal punto di vista implementativo il protocollo si presenta come livello sovrapposto al multicast IP. Per motivare questa scelta, gli autori sottolineano che l’obiettivo del protocollo è quello di dimostrare che l’utilizzo dei codici permette di ottenere benefici in sistemi reali (come appunto quello del multicast IP), non quello di realizzare un protocollo multicast funzionalmente completo da distribuire. Il protocollo aggiunge inoltre un controllo di congestione operato mediante layered multicast( per approfondimenti cfr [15]) .Questo approccio consente la convivenza di differenti gruppi multicast caratterizzati da diverse velocità di ricezione e si basa sulle due seguenti idee,qui brevemente riportate: • Il controllo di congestione avviene mediante Synchronization Points(SPs) che sono pacchetti speciali del flusso dati. Un receiver può sottoscrivere un diverso layer (cioè un diverso tasso di invio dati)solo subito dopo tali SP,ed ai receivers dei livelli più bassi è consentito più spesso di sottoscrivere i livelli più alti; • Invece di utilizzare sottoscrizioni esplicite il sender genera dei burst periodici in cui trasmette a velocità doppia per ogni livello. In tal modo si simula in pratica un 29 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS sorta di congestione: eventi,sperimentano se perdite i receivers, di mediante pacchetti,allora un meccanismo resteranno al ad layer corrente,altrimenti sottoscriveranno automaticamente il layer immediatamente superiore (la sottoscrizione avviene comunque al successivo SP); Altra fase fondamentale del protocollo è la ricostruzione dei dati da parte dei receivers, che segue un approccio molto semplice:anziché iniziare operazioni di decodifica preventiva ,che pure sarebbero parzialmente sovrapposte alla fase di ricezione dei pacchetti seguenti, si preferisce attendere che arrivi il numero di pacchetti necessario alla decodifica completa. Le operazioni preventive potrebbero infatti risultare inutili (i pacchetti decodificati preventivamente potrebbero poi arrivare intatti). Tale numero non è pari a k ma è leggermente superiore per via dell’inefficienza di codifica(cfr. par.2.2.3). Nell’implementazione finale del protocollo presentata dagli autori [13] è necessario attendere 1.055k pacchetti per decodificare il dato richiesto. In esecuzione il protocollo utilizza due threads lato server:uno per gestire un canale UDP unicast per l’invio di informazioni di controllo,l’altro per l’invio in multicast dei dati; i clients sui receiver richiedono prima le informazioni al porto UDP (noto) ed alla ricezione delle stesse effettuano la sottoscrizione al gruppo multicast appropriato. Tale protocollo ha il pregio di mostrare come soluzioni FEC sender-based possano comunque risultare valide in determinati contesti a patto di utilizzare codici che garantiscano buone prestazioni in termini di codifica e decodifica. 1.3.3 EC-SRM:un approccio ibrido NAK + FEC Uno dei primi protocolli multicast affidabili ad utilizzare tecniche FEC è stato ECSRM [16].Tale protocollo è stato realizzato mediante FEC enhancement del preesistente protocollo affidabile SRM (Scalable Reliable Multicast). 30 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS In questa sede si introdurranno solo gli aspetti principali del protocollo SRM,per una descrizione più dettagliata cfr.[18]. SRM realizza un meccanismo di recovery di tipo ARQ receiver-based con utilizzo di NAKs. SRM cerca però di ridurre il traffico dovuto alle fase di recovery mediante una tecnica detta duplicate avoidance,illustrata nel seguito. In SRM, tutti i receiver possono inviare un NAK in multicast all’intero gruppo multicast e rispondere ad un NAK con una ritrasmissione in multicast del pacchetto perso. Prima di trasmettere un NAK o effettuare una ritrasmissione, il sender resta in attesa per un certo intervallo di tempo durante il quale può decidere di sopprimere la trasmissione prevista se ne arriva una identica(cioè se arriva un NAK per lo stesso pacchetto o il pacchetto stesso ritrasmesso). L’intervallo di attesa è una funzione randomizzata del round trip time (RTT) misurato tra la sorgente del dato ed il sender del NAK(o della ritrasmissione). Questo processo di soppressione delle ritrasmissioni e dei NAKs va sotto il nome di duplicate avoidance (DA)[8]. Nonostante questo accorgimento SRM soffre comunque di[16]: 1. Ridotta scalabilità al crescere della dimensione del gruppo multicast 2. Mancanza di un meccanismo di controllo del traffico in ingresso ai nodi La scarsa scalabilità dipende da vari fattori. SRM ha necessità di stimare il RTT per applicare la DA e con n nodi nel gruppo sono necessari O(n2) messaggi[16]. Il calcolo dell’intervallo di attesa della DA inoltre è puramente basato su tale stima dell’RTT e non tiene conto della dimensione del gruppo. Se il gruppo cresce senza un corrispondente aumento del tempo di attesa,prima o poi si verificherà una implosione dei messaggi inviati[16]. Non è comunque possibile aumentare oltre un certo limite tale ritardo in quanto influenza ovviamente la latenza della fase di recovery. 31 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS SRM non esegue alcun controllo sul traffico in ingresso ad un nodo. In un certo istante alcuni nodi staranno inviando NAKs,altri ritrasmettendo pacchetti,altri ancora inviando nuovi dati. Anche imponendo ad ogni sender dei limiti al tasso di invio di dati nuovi le ritrasmissioni ed i NAKs possono condurre ad una quantità di traffico aggregato che potrebbe non essere gestibile per qualche nodo[16]. EC-SRM (Erasure Correcting SRM) cerca di superare i limiti di SRM. ECSRM mantiene la soppressione dei NAKs ed aggiunge una forma di controllo del traffico,consentendo solo ai sender di effettuare le ritrasmissioni. Il tasso di invio complessivo di ogni sender (comprensivo cioè di dati nuovi e ritrasmissioni) è limitato ad un certo valore. Restano comunque i NAKs,ma grazie alla loro ridotta dimensione ed al meccanismo di soppressione il loro impatto sul traffico è limitato[16]. Inoltre,essendo solo il sender ad effettuare ritrasmissioni ,rispetto ad SRM si elimina anche il traffico necessario alla stima del RTT4 che influenzava pesantemente la scalabilità. Il protocollo utilizza comunque un meccanismo di DA,impostando il ritardo di attesa in base a due parametri i cui valori vanno specificati per ogni sessione multicast(cfr.[16]). Un’altra modifica importante è dovuta chiaramente all’inserimento dei FEC. SRM rispondeva ad un NAK con la ritrasmissione del pacchetto perso. ECSRM invece manda un pacchetto di ridondanza generato tramite un opportuno (n,k)-codice (cfr.cap2). In ECSRM i NAKs indicano il numero di pacchetti persi per ogni gruppo di trasmissione5 ed il sender invia tanti pacchetti di ridondanza quanti sono quelli segnalati dal NAK. ECSRM opera la soppressione delle ritrasmissioni basandosi sul numero di pacchetti persi all’interno di un gruppo. Potrebbe infatti capitare di ricevere più NAKs relativi allo 4 In SRM ogni nodo stima l’RTT verso gli altri nodi per poter dimensionare il tempo di attesa della DA per l’eventuale ritrasmissione;in ECSRM è necessario solo un meccanismo di soppressione dei NAKs 5 Un gruppo di trasmissione (EC-group) in ECSRM è un gruppo di k pacchetti-dato sottoposti a codifica;i pacchetti sono identificati nell’EC-group mediante un indice. 32 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS stesso gruppo di trasmissione a breve distanza di tempo . Senza alcun meccanismo aggiuntivo questo comporterebbe l’invio di pacchetti di ridondanza già inviati poco prima. In ECSRM si adotta allora il seguente approccio: 1. Il sender memorizza l’istante di invio degli ultimi k pacchetti dei gruppi di trasmissione; 2. Quando il sender riceve un NAK che segnala m pacchetti persi per un certo gruppo,controlla se l’invio degli ultimi m pacchetti di quel gruppo è avvenuto entro la soglia di soppressione(cioè il tempo di attesa della DA); 3. Per ognuno dei pacchetti inviati entro la soglia,il sender decrementa di 1 il valore m,ritrasmettendo poi un numero di pacchetti pari al valore residuo. Supponiamo ad esempio arrivi al sender un NAK con m=3 al quale esso risponde ritrasmettendo 3 pacchetti. Se entro la soglia di soppressione arriva un nuovo NAK con m=5 il sender ritrasmetterà soltanto altri 2 pacchetti. L’assunzione alla base è che il sender riceva NAKs solo per gruppi inviati per intero. Sono tuttavia possibili scenari in cui un NAK arrivi prima che sia conclusa la trasmissione dell’intero gruppo. In tal caso il sender attende per un breve periodo che arrivino almeno k pacchetti al receiver che ha inviato il NAK. Se dopo tale periodo il gruppo non è ancora completo,allora effettua la ritrasmissione dei pacchetti mancanti. In conclusione,ECSRM è una modifica di SRM operata per incrementare la scalabilità. Il principale accorgimento adottato a tal fine è l’invio di pacchetti ridondanti in risposta ai NAKs. Questo provoca una riduzione del traffico di NAK e del traffico dovuto alle ritrasmissioni. Il primo diminuisce sia per il meccanismo di soppressione dei NAKs sia per la differente natura dei NAK stessi. In SRM un NAK è relativo al singolo pacchetto di cui si richiede la 33 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS ritrasmissione,mentre in ECSRM un NAK è relativo al numero di pacchetti necessario per raggiungere il valore k utile alla decodifica. La seconda componente di traffico diminuisce per il meccanismo di soppressione precedentemente analizzato. Anche in questo caso è l’aggiunta dello schema FEC ad essere decisiva: ogni pacchetto ritrasmesso può infatti rimpiazzare un qualunque pacchetto perso. Pur risolvendo molti problemi di SRM, ECSRM presenta alcuni limiti. Gli autori infatti assumono che le applicazioni che utilizzano ECSRM possano permettersi un compromesso tra latenza di recovery e scalabilità. I meccanismi con cui ECSRM raggiunge affidabilità e scalabilità sono infatti affetti da una elevata latenza intrinseca. L’utilizzo di un ritardo per garantire la soppressione di traffico di ritrasmissione è un limite spesso insuperabile in contesti real-time e/o time-critical. 1.3.4 Slingshot:un esempio di affidabilità mediante receiver-based FEC Il protocollo Slingshot [11] presenta un approccio innovativo nel contesto dei protocolli affidabili basati su tecniche FEC. Esso propone per la prima volta uno schema receiver-based con l’obiettivo di ridurre i tempi di recupero delle perdite. Il contesto applicativo di riferimento per Slingshot è quello del trasferimento dati nei moderni datacenters,costituiti da diverse migliaia di componenti soggetti a fallimenti ed interconnessi da canali di comunicazione LAN e ad elevata banda trasmissiva. In tali datacenters le applicazioni ad elevata criticità temporale convivono con applicazioni con requisiti di consegna meno stringenti, e quindi protocolli real-time si affiancano a protocolli meno soggetti a vincoli temporali. 34 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS I protocolli real-time tuttavia,pur garantendo la consegna certa in presenza del numero massimo di fallimenti previsti, per raggiungere tale obiettivo rallentano la consegna nel caso medio (cfr.[13]). L’obiettivo degli autori di Slingshot è dunque quello di realizzare un protocollo multicast che,in una prima fase, consegni la maggior parte dei dati molto velocemente,offrendo delle prestazioni che peggiorano gradatamente al crescere del numero dei fallimenti incontrati ed offrendo ,in una seconda fase, dei meccanismi opzionali di recupero dei dati mancanti con una latenza superiore a quella sperimentata nella prima fase. L’idea di base per assicurare la protezione dei dati dai fallimenti è quella di ricorrere ad un approccio FEC basato sui receivers: i dati ricevuti dai receivers di un certo gruppo multicast vengono codificati in pacchetti FEC e successivamente scambiati tra i receivers stessi per ricostruire i pacchetti mancanti. In pratica le due fasi del protocollo si possono brevemente descrivere come segue: 1. I dati sono inviati inizialmente mediante un servizio multicast best-effort (es. multicast IP). 2. I receivers effettuano delle comunicazioni unicast per scambiare i pacchetti FEC da essi stessi costruiti a partire dai dati ricevuti e ricostruiscono i dati mancanti mediante i pacchetti FEC ottenuti dagli altri receivers. La seconda fase si compone a sua volta di due sottofasi: I. I receivers costruiscono e scambiano velocemente tra loro i pacchetti FEC,realizzando una rapida scoperta dei pacchetti mancanti ed il recupero della maggior parte di essi. 35 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS II. I receivers opzionalmente inviano esplicite richieste ad altri receivers per ottenere i pacchetti mancanti effettuando un recupero completo dei dati mancanti. Le due sottofasi sono evidenziate in grigio nella figura seguente. Figura 5 - Funzionamento di Slingshot (NB: q ed r sono receivers,p è sia sender che receiver: Slingshot è infatti concepito come algoritmo distribuito simmetrico,per cui il sender opera anche da receiver,inviando i dati in multicast anche a sé stesso e partecipando poi alla fase di recupero dalle perdite). Dal punto di vista implementativo, Slingshot utilizza due tipi di pacchetti, data packets contenenti i dati inviati in multicast ed identificati da un ID del tipo (sender,numero di sequenza),e repair packets contenenti informazioni utili al recupero dei dati mancanti. 36 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Nella sottofase I i receivers generano un repair packet ogni r data packets ricevuti in multicast e lo inviano in unicast a c receivers selezionati casualmente. Slingshot utilizza la forma più semplice e veloce di FEC,cioè le funzioni XOR binarie,che consentono ad un singolo repair packet di permettere la decofica di diversi data packets. Per facilitare il recupero dei data packets a partire dai repair packets ogni nodo che esegue Slingshot utilizza un buffer dati dove conserva i data packets: all’atto della ricezione di un repair packet il nodo controlla se esso è utile alla decodifica dei data packets che non ha ancora ricevuto;se solo uno di questi pacchetti non ricevuti è decodificabile grazie al repair packet appena ricevuto,il nodo recupera dal buffer gli altri r-1 data packets che hanno contribuito alla costruzione del repair packet in questione e combinandoli con le XOR contenute in tale pacchetto opera la ricostruzione del pacchetto mancante. La natura probabilistica della sottofase I ha come conseguenza una percentuale di pacchetti persi non recuperati. Un nodo può quindi scegliere se attendere ulteriormente l’arrivo di altri pacchetti di riparazione oppure far partire la sottofase II di richiesta esplicita dei pacchetti mancanti. Per la sottofase II le realizzazioni possibili sono due: si può inviare la richiesta esplicita a qualche receivers arbitrario oppure al sender ,che deve dunque gestire un buffer dei pacchetti inviati. Slingshot è in pratica un protocollo configurabile che può operare sia garantendo una consegna certa di tutti i pacchetti( a prezzo di un degrado prestazionale imposto dalla fase di recupero esplicito)sia come protocollo real-time con garanzie di consegna offerte su base probabilistica. 37 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 1.3.5 Ricochet: la Lateral Error Correction Ricochet [9] è un protocollo multicast affidabile a bassa latenza concepito per applicazioni time-critical distribuite operanti su clusters. I protocolli di reliable multicast esistenti,che costituiscono il meccanismo di comunicazione principale in tali contesti, non offrono adeguate prestazioni in termini di scalabilità e criticità temporale ed è dunque obiettivo degli autori di Ricochet realizzare un protocollo che ,pur offrendo adeguate garanzie in termini di celerità di consegna, fornisca anche scalabilità al crescere dei gruppi di comunicazione multicast( ovvero ,in situazioni multisender e multigroup). Ricochet utilizza un innovativo schema di FEC receiver-based che va sotto il nome di LEC (Lateral Error Correction) .Tale schema sfrutta la sovrapposizione parziale di diversi gruppi di comunicazione multicast per rendere i tempi di latenza della fase di recupero perdite indipendenti dalla velocità di trasmissione del particolare gruppo. L’utilizzo di FEC lato receiver non è un’idea nuova (cfr.Slingshot ,par.prec),tuttavia è nuova l’idea di sfruttare la presenza di più gruppi di comunicazione per incrementarne le prestazioni. Le caratteristiche principali Ricochet si possono riassumere nei seguenti punti: • In Ricochet ogni nodo appartiene a più gruppi multicast e riceve dati da tutti i gruppi; • Ricochet utilizza due tipi di pacchetti,data packets e repair packets (come già visto in Slingshot,cfr. par. prec.),i primi contenenti i dati effettivi ed i secondi la ridondanza di codifica; • Ricochet utilizza come operazione di codifica la XOR binaria dei data packets ricevuti da un nodo (anche questo è già visto in Slingshot:la differenza è che in 38 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Ricochet i pacchetti che vanno a comporre il repair packets possono essere associati a differenti gruppi multicast,cfr.nel seguito). La seguente immagine mostra la struttura dei pacchetti utilizzati da Ricochet: Figura 6 - Strutttura pacchetti Ricochet La differenza principale tra la tecnica LEC ed una normale tecnica FEC receiver-based sta nella costruzione del repair packet: • come già visto in Slingshot,un repair packet è costruito dalla XOR di r data packets(di cui contiene gli IDs) e rende possibile la ricostruzione di un data packet mancante al receiver se esso ha già a disposizione gli altri r-1 data packets inclusi nel repair packet.Tale pacchetto è inviato a c destinatari selezionati casualmente. • Il principio operativo alla base della LEC(nonché differenza fondamentale rispetto alle tecniche già viste) è che un repair packet inviato da un nodo ad un altro può essere costruito a partire dai dati inviati a qualunque gruppo multicast in comune tra i due nodi. 39 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Questo permette di velocizzare la fase di recupero dei pacchetti persi in quanto non si è più vincolati al tasso di invio verso il singolo gruppo multicast. Dati ad esempio due gruppi A e B costituiti dai nodi n1,n2,n3,n4 (situazione rappresentata nella figura seguente) Figura 7 - LEC in 2 gruppi multicast con i nodi n1 ed n2 appartenenti ad entrambi i gruppi,è chiaro ,per quanto detto, che ognuno di essi potrà inviare all’altro repair packets composti dai dati provienti sia da A che da B,indifferentemente.Detto ad esempio r=5 ,n1 dovrà attendere solo 5 pacchetti in totale (indirizzati ad A o a B) prima di costruire il pacchetto da inviare ad n2. 40 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Il seguente schema permette di comprendere come questa soluzione consenta un recupero più veloce dalle perdite rispetto all’approccio basato sul singolo gruppo: Figura 8 - LEC(a destra) vs FEC receiver-based in singolo gruppo A parità di data packets ricevuti (identificati in figura da A1,A2… B1,B2… etc) n1 riesce a costruire con molto anticipo un repair packet da inviare ad n2,che può così iniziare il recupero dei dati molto prima che nel caso di FEC receiver-based in un singolo gruppo. Dal punto di vista algoritmico Ricochet si presenta come algoritmo simmetrico distribuito(cioè il medesimo algoritmo è eseguito in contemporanea da tutti i nodi)e si può quindi analizzare il suo comportamento dal punto di vista di un singolo nodo,nel seguito indicato con n1. La prima operazione che lo schema LEC prevede è la suddivisione dei vicini di n1 (un vicino di n1 è un nodo appartenente ad almeno uno dei gruppi di cui fa parte anche n1) in 41 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS regioni 6,utilizzando poi queste informazioni per la costruzione e distribuzione dei repair packets . Nell’esempio rappresentato nella figura seguente, n1 appartiene ai gruppi A,B e C e ne consegue la suddivisione nelle regioni abc,ab,bc,a,b e c (il gruppo D è ignorato da n1). Figura 9 - n1 appartiene ad A,B e C ;le regioni individuate sono abc,ab,ac,bc,a,b,c Le uniche regioni di interesse sono quelle derivanti dalle intersezioni non vuote (questo limita il numero massimo di regioni individuabili al numero di nodi presenti nel sistema). All’atto dell’invio di un repair packet lo schema LEC prevede la selezione casuale dei destinatari non dall’intero gruppo ,ma da ogni regione, in modo che: 1. Il numero di destinatari selezionati da una singola regione sia proporzionale alla dimensione di tale regione; 2. Il numero totale di destinatari selezionati tra tutte le regioni sia pari al numero c di destinatari previsti per quel gruppo. Per un dato gruppo A caratterizzato da un numero totale di destinatari cA il numero di destinatari selezionati da una certa regione di A sarà pari a cA *|x|/|A|, con |x| pari al numero di nodi nella regione in questione ed |A| pari al numero totale di nodi nel gruppo. 6 le regioni non sono altro che le intersezioni disgiunte dei gruppi a cui appartiene n1 42 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS La seguente immagine mostra la selezione dei destinatari per l’invio di un repair packet verso il gruppo A: Figura 10 - selezione dei destinatari dalle regioni di A (NB: cAx indica il numero di destinatari selezionati per la regione x) La selezione dei destinatari dalle regioni piuttosto che dai gruppi permette di costruire i repair packets a partire dai dati di più gruppi multicast: poiché il nodo n1 sa che i nodi della regione ab ricevono dati sia per il gruppo A che per il gruppo B,ad essi potrà inviare repair packets composti di dati inviati verso i due gruppi. La LEC è una declinazione innovativa delle tecniche FEC receiver-based ma è necessario settare opportunamente i parametri caratterizzanti il meccanismo ( r e c principalmente) per ottenere prestazioni adeguate ai requisiti richiesti dall’applicazione in termini di percentuale di recupero pacchetti persi e di overhead computazionale. Come osservato 43 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS sperimentalmente dagli autori di Ricochet, al crescere di c (numero di destinatari repair packets) per r fissato cresce la percentuale di recupero (tendendo al 100%) ma cresce corrispondentemente l’overhead computazionale al nodo. Il meccanismo LEC da solo non consente un recupero totale delle perdite per via della sua natura probabilistica (analogamente a quanto visto per gli schemi receiver-based in un singolo gruppo,cfr.par .prec.) e gli autori hanno dunque previsto un layer aggiuntivo al protocollo di base che implementa un meccanismo ARQ con riscontri negativi (NAKs). Così come visto in Slingshot[11], se dopo la fase di recupero LEC qualche pacchetto risultasse ancora mancante ,è possibile richiedere esplicitamente la ritrasmissione di tali pacchetti al sender. Questo meccanismo NAK ha il pregio di non allungare eccessivamente i tempi di recupero: la scoperta delle perdite avviene quasi per intero nella fase LEC,pertanto il ritardo tipico degli meccanismi ARQ “classici”(dovuto soprattutto alla latenza della scoperta) non è qui presente. Tale layer aggiuntivo è inoltre utilizzato opzionalmente (così come già visto in Slinghot)in quanto le applicazioni che utilizzano il protocollo possono anche ritenere sufficienti le garanzie (espresse in termini probabilistici) offerte dallo schema LEC di base. In definitiva il protocollo Ricochet raggiunge l’affidabilità con uno schema FEC innovativo che migliora le prestazioni in fase di rilevazione e recupero delle perdite Tuttavia il recupero completo è garantito al 100% solo con un layer NAK aggiuntivo. È inoltre necessario settare opportunamente i parametri della LEC per non incorrere in un eccessivo overhead. 44 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Capitolo 2 Tecniche di affidabilità basate su Erasure Codes in piattaforme DDS 2.1 Introduzione Nella prima parte di questo capitolo sarà presentata una classe di codici correttori d’errore, detti Erasure Codes, particolarmente adatti al recupero dei dati persi per cancellazione. Di essi si analizzeranno i principi di funzionamento e le caratteristiche principali delle due famiglie di codici più diffuse La trattazione qui presentata degli Erasure Codes ha il solo scopo di fornire gli elementi utili a comprendere i risvolti pratici derivanti dall’utilizzo di tali codici nel contesto delle comunicazioni affidabili.. Tale trattazione non ha dunque pretese di rigore matematico e non esaurisce la tematica. Approcci più rigorosi possono essere reperiti in [19][20] dove gli Erasure Codes vengono presentati nel contesto della Teoria dei Codici. Nella seconda parte del capitolo sarà introdotto uno schema di comunicazione affidabile per middleware DDS basato su tali codici. Dopo una breve introduzione degli aspetti fondamentali dello standard OMG, saranno analizzati i vantaggi e gli svantaggi derivanti 45 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS dall’utilizzo del DDS nel contesto dei MCS e, successivamente, le considerazioni da cui è scaturita l’idea di utilizzare gli EC per realizzare un meccanismo alternativo di recupero dei dati persi. 2.2 Gli Erasure Codes Gli Erasure Codes - EC nel seguito - offrono un sistema di protezione dei dati dalle cancellazioni7 (da cui l’Erasure del nome). Secondo la classificazione presentata nel capitolo 1 essi si inseriscono dunque nell’insieme delle tecniche FEC. Gli EC sono stati tuttavia già stati utilizzati con successo in una varietà di contesti,quali sistemi RAID fault-tolerant, sistemi di storage distribuiti,applicazioni peer-to-peer e distribuzione di contenuti multimediali[23][24][13]. Allo stato attuale le famiglie di EC più utilizzate sono : 1. Codici di Reed-Solomon 2. Low Density Parity Check (LDPC) Codes (lett.”codici a controllo di parità a bassa densità”). Esse presentano differenti modalità di costruzione dei codici e differenti caratteristiche prestazionali,pur operando secondo gli stessi meccanismi fondamentali. Dopo aver introdotto i concetti alla base del funzionamento degli EC si analizzeranno le caratteristiche specifiche delle due famiglie suddette . 7 Nel contesto delle telecomunicazioni , si definisce cancellazione la perdita di un pacchetto causata dal comportamento fallimentare di componenti di rete o dalla congestione della rete stessa. 46 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 2.2.1 Concetti di base L’idea alla base degli Erasure Codes è quella di codificare k blocchi8 di dati sorgenti generando n blocchi di dati codificati9, in modo che sia possibile ricostruire i dati sorgenti a partire da un qualunque sottoinsieme di blocchi di cardinalità k [22]. Un codice che presenta tali caratteristiche prende il nome di (n,k)-codice[19] e permette di ricostruire i dati sorgente nell’ipotesi in cui siano avvenute al massimo n-k cancellazioni in un gruppo di n blocchi codificati. Il rapporto k/n prende il nome di code rate e rappresenta una misura dell’efficienza del codice. La seguente figura[22] schematizza il processo di codifica/decodifica negli (n,k)-codici: Figura 11 - Rappresentazione grafica del processo di codifica/decodifica FEC Esempi notevoli sono costituiti da[19][21] : • Codici a ripetizione:cioè (n,1)-codici,in cui il dato sorgente viene semplicemente ripetuto n volte;permettono di recuperare fino ad n-1 perdite ma soffrono di scarsa efficienza. 8 9 Un blocco è qui inteso come un insieme di bit di dati sorgente n>k 47 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS • Codici a controllo di parità: cioè (k+1,k)-codici,in cui c’è un solo blocco di ridondanza calcolato come somma10 dei k blocchi sorgenti;permettono di recuperare una sola perdita ma hanno un elevato code rate; I due semplici codici appena presentati sembrano essere stati costruiti senza particolari basi teoriche. Tuttavia è facilmente dimostrabile che essi esibiscono il comportamento atteso[21].Per costruire codici con valori arbitrari di n e k è però necessario un approccio più sistematico. Da questo punto di vista un’interessante classe di EC è la classe degli EC lineari che possono essere analizzati tramite le proprietà dell’algebra lineare. Detto x=x0…xk-1 il vettore dei blocchi dato e detta G una matrice nxk tale che ogni sua sottomatrice G’ di dimensioni kxk risulti invertibile, un (n,k)-codice lineare si può rappresentare come: y=Gx Un codice lineare può cioè essere assegnato nella forma di un sistema di equazioni lineari. Se al receiver giungono almeno k componenti del vettore y ,i dati sorgenti possono essere ricostruiti usando le k equazioni corrispondenti alle componenti note di y. Detta G’ la matrice kxk rappresentativa di tali equazioni ,è possibile ricostruire i dati risolvendo il sistema: y’=G’x → x=G’-1y 10 La somma può essere definita in diversi modi a seconda di quale sia l’insieme dei simboli rappresentati dai blocchi;può essere una semplice XOR binaria così come una somma su un particolare campo. 48 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Nel caso in cui la matrice G includa una matrice identità di ordine k ,il codice risultante sarà un codice sistematico . Un codice sistematico permette una decodifica veloce dei dati in quanto inserisce una copia dei dati non codificati accanto ai blocchi di codifica[19][21]. Il processo di codifica e decodifica si può ora rappresentare anche in forma matriciale: Figura 12 - Rappresentazione matriciale di codifica e decodifica per un codice sistematico (y' e G' sono identificati dalle aree in grigio sulla destra) I codici Reed-Solomon ed i codici LDPC appartengono alla classe degli EC lineari e molte delle loro caratteristiche (e differenze) dipendono da quelle dei sistemi di equazioni lineari che li definiscono. 49 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 2.2.2 Codici Reed-Solomon I codici di Reed-Solomon costituiscono la classe di EC canonici. Essi prendono il nome dai due studiosi che nel 1960 pensarono ad una efficiente tecnica di codificadecodifica per una classe di codici lineari a blocco. I codici RS sono stati utilizzati già da tempo per realizzare meccanismi di fault-tolerance in una varietà di contesti,quali sistemi RAID,file systems distribuiti,p2p etc.[23][26][38]. Dal punto di vista algebrico, i codici Reed-Solomon operano sugli elementi del campo finito esteso di Galois GF(2L). I blocchi sono cioè rappresentati come interi in [0,…,2 L-1], quindi il generico elemento è composto da L bit di informazione[19][20][26]. La codifica avviene in due fasi: 1. I blocchi dato sono partizionati in words di dimensione fissata L ed un insieme di k words forma un vettore. 2. Gli m blocchi di codifica vengono generati mediante prodotto11 tabulare tra il vettore di blocchi dato ed una matrice di distribuzione B .Complessivamente saranno trasmessi n=k+m blocchi. La fase di decodifica è concettualmente semplice: 1. dati almeno k blocchi di codifica si deriva da essi una matrice di decodifica B’ analogamente a quanto visto nel paragrafo precedente; 2. si effettua l’inversione di tale matrice e si esegue il prodotto tabulare tra la matrice invertita ed il vettore dei k blocchi ricevuti. 11 Il prodotto è eseguito in GF(2L) 50 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS La seguente immagine riassume il processo di codifica/decodifica sopra descritto: Figura 13 - Il processo di codifica (in alto) e le due fasi di decodifica (in basso) dei codici Reed-Solomon La codifica/decodifica nei codici RS risulta essere particolarmente onerosa per una varietà di ragioni[24]: 1. il calcolo degli m blocchi di codifica richiede m prodotti che coinvolgono un vettore di k elementi. Con dimensioni dei blocchi pari ad L la complessità di tale operazione risulta pari a O(Lmk). 2. La decodifica include una inversione di una matrice di ordine k,cioè un’operazione di complessità O(k3) . 3. La decodifica prevede ,per ogni blocco da decodificare, anche un prodotto tabulare tra la matrice di decodifica ed il vettore dei k blocchi ricevuti. Tale operazione ha una complessità pari a O(k2L). 4. I prodotti sono eseguiti in GF(2L) e sono molto più dispendiosi rispetto ai prodotti tra semplici interi. 51 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Per queste ragioni, i codici RS si utilizzano in applicazioni in cui i valori di k ed m restano relativamente bassi ed in cui anche la dimensione L dei blocchi stessi è contenuta. Al crescere di tali parametri, infatti, i tempi di codifica/decodifica dei dati possono diventare insostenibili e si pone pertanto la necessità di trovare un’alternativa valida ai codici RS nelle situazioni in cui essi non sono utilizzabili. Esistono comunque decoder ad alte prestazioni per codici RS basati su architetture VLSI ed algoritmi specifici [38]. 2.2.3 Codici LDPC I codici LDPC (Low Density Parity Check) [27][28] costituiscono un’importante alternativa ai codici RS. I LDPC Codes sono codici lineari caratterizzati da una matrice generatrice con pochi elementi non nulli rispetto al numero di elementi nulli (da qui il nome). Grazie a tale caratteristica per essi è possibile realizzare schemi di decodifica che non necessitano di costose operazioni matriciali (decodifica iterativa). I LDPC furono introdotti da Gallagher nel 1960 nella sua tesi di dottorato. Tuttavia, a causa della difficoltà dell’epoca nell’implementare un codificatore efficiente e della successiva introduzione dei codici RS, essi sono stati ignorati fino alla metà degli anni ’90. Le differenze principali tra i LDPC e i codici Reed-Solomon sono le seguenti[13]: • I Reed-Solomon operano mediante l’algebra dei campi finiti mentre i LDPC utilizzano semplici XOR (OR esclusivo) binari; • I Reed-Solomon sono caratterizzati da un sistema di equazioni denso mentre le equazioni dei LDPC sono costruite con un numero di variabili di solito molto piccolo dando luogo ad un sistema sparso; • L’efficienza di decodifica dei LDPC è leggermente inferiore rispetto a quella dei Reed-Solomon, essendo necessari (1+ε) k pacchetti per ricostruire un 52 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS dato originariamente suddiviso in k pacchetti (ε maggiore di zero e di solito dipendente dal pattern di perdita dei pacchetti e dalle scelte operate per la costruzione delle equazioni). I codici LDPC possono essere rappresentati in due modi: 1. In forma matriciale (perché codici lineari). 2. Su grafo bipartito. Le due rappresentazioni sono equivalenti dal punto di vista algebrico, in quanto rappresentative dello stesso sistema di equazioni lineari. Tuttavia i grafi bipartiti aiutano a comprendere meglio sia il grado di densità sia il processo di decodifica iterativa. Nella rappresentazione su grafo bipartito i nodi dato costituiscono l’insieme dei nodi a sinistra mentre i nodi per il controllo di parità sono sulla destra12. Gli archi che connettono i due sottoinsiemi di nodi rappresentano operazioni di XOR binario (cfr. FIG seguente). Figura 14 - Grafo bipartito per codice LDPC con k=4 e m=3. (il simbolo + indica la XOR binaria) 12 In questa sede si prendono in considerazione LDPC binari,per cui ogni nodo rappresenta un bit-dato o un bit di parità. 53 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS La densità del codice può dunque essere valutata dal numero complessivo di archi del grafo. Un’ulteriore rappresentazione su grafo si ricava dalla precedente ponendo nodi dato e nodi di parità sulla sinistra e ricavando i vincoli sulla destra. Un grafo di questo tipo prende il nome di Grafo di Tanner. Figura 15 - Rappresentazione LDPC su grafo di Tanner. I grafi di Tanner permettono di analizzare il processo di decodifica e comprendere perché per i LDPC Codes possano essere necessari più di k blocchi per effettuare la decodifica completa. Per comprendere il meccanismo di decodifica è utile un esempio completo. Con riferimento al codice rappresentato nel grafo di Tanner della figura precedente: 1. i vincoli sono posti a zero; 2. ricevuto il bit #2 con valore 1;calcolo del nuovo valore dei vincoli ; 3. ricevuto il bit #7 con valore 1;calcolo del nuovo valore dei vincoli; 4. ricevuto il bit #4 con valore 0;calcolo del nuovo valore dei vincoli; 5. calcolo del bit #3 dal vincolo #3; il valore è 0; 6. ricevuto il bit #5 con valore 1;calcolo del nuovo valore dei vincoli; 54 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 7. calcolo del bit #1 dal vincolo 1;il valore è 1; 8. infine,calcolo del bit #6 a valore 0; Graficamente : 1 2 3 4 5 6 7 8 Figura 14: Esempio di decodifica LDPC su grafo di Tanner 55 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Nell’esempio appena presentato la decodifica completa risulta possibile dopo la ricezione di k=4 bit (al passo 7 i nodi dato sono infatti tutti noti),così come avviene nei codici RS. Tuttavia si è sottolineato come in generale per i LDPC Codes siano necessari più di k blocchi codice per effettuare la decodifica completa. Non è detto infatti che i k elementi ricevuti permettano di risolvere le equazioni da cui dipendono i nodi dato. Una situazione di questo tipo è visualizzata in figura: Figura 16:LDP - decodifica impossibile con k bit Il codice rappresentato è strutturato in maniera tale che ricevuti i bit 1,5,6 e 7 non sia possibile risolvere alcuna equazione vincolare. Non è possibile in definitiva effettuare la decodifica con k elementi ed è necessario attendere un ulteriore blocco. Nonostante questa piccola inefficienza di codifica ,i codici LDPC costituiscono un’alternativa importante ai codici RS nelle situazioni in cui i RS non forniscano prestazioni adeguate. Come tuttavia evidenziato in [24], in termini di codifica/decodifica i LDPC offrono prestazioni sensibilmente migliori rispetto ai RS soltanto quando k ed m assumono valori nell’ordine di 102. La scelta tra LDPC e RS dipende quindi dalle necessità specifiche. 56 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS La classe di LDPC che offre le migliori prestazioni complessive è quella dei Tornado Codes. Tali codici sono strutturati in maniera tale che l’arrivo di un singolo blocco inneschi la risoluzione di un elevato numero di equazioni (da qui il Tornado del nome). I Tornado Codes,introdotti nel 1997 [15], offrono le migliori prestazioni complessive in termini di codifica/decodifica, arrivando ad essere anche 10,000 volte più veloci dei codici RS per dati di grosse dimensioni. L’utilizzo dei Tornado Codes è tuttavia vincolato alle concessioni degli autori che ne detengono il brevetto. 2.3 I middleware di tipo publish/subscribe e l’OMG Data Distribution Service Dopo un’introduzione degli aspetti fondamentali dei middleware di tipo publish/subscribe ed in particolare del DDS, si analizzano i problemi derivanti dall’utilizzo di tali middleware nel contesto dei MCS considerato e, successivamente, si propone l’idea per uno schema di affidabilità alternativo basato su EC. Come accennato in precedenza, gli EC sono normalmente utilizzati per garantire protezione da cancellazioni dei dati in diversi contesti. In questo paragrafo sarà presentato invece un uso alternativo degli EC nel contesto delle tecniche FEC per la comunicazione affidabile. 2.3.1 Il modello di comunicazione publish/subscribe Il modello di comunicazione publish/subscribe [29][30][40] sta ricevendo negli ultimi anni un’attenzione crescente da parte degli sviluppatori in quanto gode di proprietà che facilitano la realizzazione di applicazioni dinamiche e distribuite su larga scala. 57 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS I componenti principali di un sistema basato sul modello publish/subscibe sono: ¾ il publisher: è il “produttore” dei messaggi di comunicazione ¾ il subscriber: riceve i messaggi a cui è interessato, comunicando il suo interesse mediante sottoscrizioni; ¾ Un Event Service : il modello di comunicazione publish/subscribe è ad eventi e l’Event Service è l’intermediario tra le parti. Il publisher invia messaggi (in questo modello dette pubblicazioni) all’event service mentre il subscriber comunica il suo interesse ad una determinata categoria di messaggi mediante un meccanismo di sottoscrizione. Quando un messaggio risulta disponibile presso l’event service, esso informa i subscribers interessati a quel particolare tipo di messaggio mediante notifiche. La seguente immagine schematizza l’interazione tra le parti : Figura 17 Interazione in un sistema Publish/Subscribe 58 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Il modello publish/subscribe offre dunque uno schema di interazione asincrono con un elevato grado di disaccoppiamento tra le parti. La potenza dei sistemi basati su tale modello risiede proprio nelle tre forme di disaccoppiamento che esso introduce[30]: ¾ Disaccoppiamento nello spazio ¾ Disaccoppiamento nel tempo ¾ Disaccoppiamento nella sincronizzazione Le tre forme di disaccoppiamento sono schematizzate in figura: Figura 18 - Forme di disaccoppiamento tra le parti nel modello publish/subscribe Analizziamo nel dettaglio ciascuna di esse: • Disaccoppiamento nello spazio: le parti della comunicazione non hanno bisogno di conoscersi in quanto l’interazione avviene solo tramite l’event service. Il publisher 59 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS non ha riferimenti dei subscribers e non ha informazioni sul numero di subscribers coinvolti nella comunicazione. Il subscriber, allo stesso modo, non ha alcun riferimento del publisher e non sa quanti pusblisher stiano intervenendo nella comunicazione. In altre parole, il modello publish/subscribe è intrinsecamente basato su uno schema di comunicazione di tipo molti-a-molti. • Disaccoppiamento nel tempo: le entità interagenti non devono necessariamente partecipare attivamente alla comunicazione negli stessi istanti di tempo. In particolare, il publisher potrebbe effettuare qualche pubblicazione mentre il subscriber è disconnesso oppure, viceversa, il subscriber potrebbe ricevere una notifica circa l’avvenuta pubblicazione di un evento di interesse mentre il publisher che l’ha pubblicata non è più attivo. • . Disaccoppiamento della sincronizzazione: i flussi di esecuzione delle parti sono disaccoppiati. I publishers non sono bloccati dopo l’invio di una pubblicazione ed i subscribers ricevono le notifiche in maniera asincrona mediante una callback mentre stanno effettuando altre elaborazioni. In effetti la produzione e la ricezione dei messaggi non avvengono nel flusso di controllo principale di publisher e subscriber, e pertanto non sono eventi sincroni. Disaccoppiare la produzione e l’utilizzo delle informazioni introduce un elevata scalabilità in quanto le dipendenze esplicite tra le entità partecipanti sono rimosse. Rimuovere tali dipendenze riduce la necessità di coordinazione e sincronizzazione tra le parti, e rende i sistemi publish/subscribe l’infrastruttura di comunicazione adatta ad ambienti distribuiti che sono asincroni per natura e che richiedono un pattern di comunicazione di tipo molti-a-molti, come ad esempio quello delle comunicazioni mobili o della distribuzione di dati. 60 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS In contesti in cui è necessario garantire anche un’elevata affidabilità della comunicazione, e dunque anche recupero dalle perdite, la scalabilità di tali sistemi risulta in qualche modo ridotta in quanto sorge la necessità di memorizzare gli eventi per poterne eventualmente effettuare la ritrasmissione[30]. 2.3.2 Introduzione allo standard OMG DDS Lo standard OMG Data Distribution Service[5] è una specifica per sistemi di distribuzione dei dati basati su un modello di comunicazione publish-subscribe topicbased13. Lo scopo di tale specifica è fornire un interfaccia comune di livello applicativo che definisca chiaramente il servizio di distribuzione dei dati . La specifica utilizza il linguaggio UML per descrivere il servizio, fornendo quindi un modello indipendente dalle particolari piattaforme hardware e dai particolari linguaggi di programmazione. Il modello può essere quindi istanziato su una qualunque piattaforma reale ed implementato in un qualunque linguaggio di programmazione. Lo standard fornisce altresì una definizione formale delle politiche di QoS(Quality of Service) che è possibile usare per configurare il servizio. In definitiva,l’obiettivo del DDS è di facilitare la distribuzione efficiente dei dati in sistemi distribuiti[4]. Le applicazioni distribuite basate sul modello publish-subscribe(descritto nel dettaglio nel paragrafo successivo) sono composte da processi ,detti “participants”,che possono ricoprire i ruoli sia di pulisher che di subscriber. Tali processi usando il DDS possono effettuare semplici operazioni di ‘read’ e ‘write’ in maniera efficiente e con un interfaccia tipizzata, e sarà poi il middleware DDS sottostante a distribuire i dati in modo che ogni participant possa accedere al valore più recente del dato. 13 Un sistema pub/sub è Topic-based quando i partecipanti pubblicano e sottoscrivono eventi individuali 61 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS In pratica il servizio crea uno spazio globale dei dati (global data space) che può essere letto e scritto da tutti i processi(comunicazione data-centrica,cfr fig seg.). Figura 19 - Il Global Data Space Per realizzare questa astrazione lo standard definisce due livelli di interfacce[4] : 1. Un livello inferiore,il DCPS (Data-Centric Publish-Subscribe) che è orientato alla distribuzione efficiente delle informazioni ai richiedenti le stesse; 2. Un livello superiore,facoltativo,il DLRL (Data-Local Reconstruction Layer) che consente una più semplice integrazione nel livello applicativo. Figura 20 - Livelli Interfacce OMG DDS Non tutte le implementazioni conformi allo standard implementano entrambi i livelli di interfacce. Tuttavia per assicurare conformità ed interoperabilità è obbligatoria la 62 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS realizzazione di un sottoinsieme di DCPS che prevede l’implementazione delle entità principali previste dallo standard (Minimum profile,crf[5]). 2.3.4 Modello di programmazione del DDS Il modello di programmazione del DDS è mostrato nella figura seguente: Figura 21 - Modello di programmazione del DDS [4]Le classi principali attraverso le quali si realizza la comunicazione sono: DomainParticipant,DataWriter,DataReader,Publisher,Subscriber e Topic. 63 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Tutte queste classi derivano dalla classe base Entity il che evidenzia la loro capacità di essere configurate attraverso politiche di QoS (cfr.par succ.),ricevere notifiche di eventi attraverso dei listeners e supportare condizioni di attesa dell’applicazione. Il Publisher è l’oggetto responsabile della pubblicazione dei dati. Un DataWriter è un interfaccia tipizzata del Publisher: i participants utilizzano i DataWriters per comunicare il valore di un certo tipo di dato o il cambiamento del valore del tipo stesso. Una volta che il dato è stato comunicato al Publisher, è sua responsabilità decidere quando inviare il corrispondente messaggio di pubblicazione. Il Subscriber riceve i dati pubblicati e li rende disponibili al participant che lo contiene. Un subscriber può ricevere dati di differenti tipi e per accedere a tali dati il participant deve usare un DataReader, che è l’interfaccia tipizzata attaccata al subscriber. L’associazione di un oggetto DataWriter (che rappresenta una pubblicazione) con oggetti DataReader è realizzata per mezzo del Topic. Un Topic associa un nome (unico nel sistema), un tipo di dato e politiche di QoS al dato stesso. La seguente immagine mostra gli le entità ora introdotte nell’architettura tipica di un’applicazione DDS: Figura 22 - Architettura di una tipica applicazione DDS 64 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Il “dominio DDS” è formato in questa immagine da tre DomainParticipants che comunicano su tre diversi Topics. Il primo participant contiene un Subscriber (contentente a sua volta un DataReader), ed un Publisher (contenente due DataWriter). Il secondo participant contiene un singolo subscriber che contiene a sua volta due DataReader associati a differenti Topics. Infine il terzo participant contiene un singolo Publisher con un singolo DataWriter. 2.3.4 Le politiche di QoS del DDS Il Data Distribution Service adotta una serie di politiche di qualità del servizio (QoS) in modo da poter adattare il servizio alle caratteristiche e ai requisiti dell’applicazione. Le QoS policies sono un insieme di proprietà che guidano il comportamento del servizio e sono realizzate a partire da una QoS Policy predefinita che viene specializzata per definire i diversi aspetti del funzionamento del servizio. In questa sezione vengono descritte le policies principali mentre per una descrizione esaustiva si rimanda alla specifica DDS [5]. Una QoS Policy può essere associata a ciascuna delle DCPSEntities descritte in precedenza(cfr.fig 20). Per realizzare un disaccoppiamento lasco tra Publisher e Subscriber, il livello DCPS prevede un meccanismo per stabilire quando le policy offerte tra le entità di pubblicazione e sottoscrizione sono ammissibili. In tal senso viene realizzato un pattern noto come RxO ( Requested versus Offered). Il Data Reader setta un valore “richiesto” per una particolare policy di QoS. Il Data Writer setta un valore “offerto” per quella policy di QoS. Quando il DDS realizza un associazione tra Data Reader e Data Writer, si stabilisce se le policy di QoS sono compatibili, ovvero se tutti i valori richiesti sono supportati da quelli offerti. Se ciò non avviene il Servizio DDS non 65 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS realizza l’associazione e solleva un’eccezione del tipo INCOMPATIBLE_QOS a ciascun lato della comunicazione. Di seguito sono descritte le QoS Policy rilevanti ai fini della costruzione del modello del sistema nei capitoli successivi. • Deadline: Questa policy è utilizzata se un Topic deve essere aggiornato periodicamente. Lato Publisher si stabilisce un contratto che l’applicazione dovrà rispettare. Lato Subscriber si stabilisce un requisito minimo di frequenza di aggiornamento. Identificato un DataWriter che corrisponda al DataReader, il servizio controlla se risulta OfferedDeadlinePeriod ≤ RequestedDeadlinePeriod. Se questo non accade i due endpoint vengono informati dell’incompatibilità creatasi attraverso i meccanismi di listener o condition. In caso di compatibilità il servizio opera comunque un controllo costante ed informa l’applicazione di qualsiasi violazione del contratto che possa essersi verificata. • Lifespan: Lo scopo di questa policy è di evitare la possibilità di consegnare all’applicazione dati ormai non più validi. Ciascun campione di dato verrà quindi marcato con un expiration time, oltre il quale verrà scartato e mai consegnato all’applicazione. L’istante di scadenza del dato viene calcolato aggiungendo il valore della lifespan al timestamp di sorgente, automaticamente settato dal servizio o fornito dall’applicazione write_w_timestamp. Questa sorgente politica attraverso di QoS una specifica naturalmente primitiva prevede una sincronizzazione tra i clock di sorgente e destinazione. Se ciò non fosse vero il servizio usare l’istante di ricezione piuttosto che il timestamp di sorgente per calcolare la scadenza. • Reliability: Indica il livello di affidabilità richiesta da un DataReader o offerta da un DataWriter. Sono possibili due livelli di servizio, best-effort e reliable. Un’offerta 66 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS di servizio reliable implicitamente comprende anche inferiore best-effort. Se la politica scelta è reliable i campioni di dato prodotti da un singolo DataWriter non saranno consegnati all’applicazione fino a che i campioni precedentemente originati non saranno stati consegnati. Il servizio naturalmente si farà carico di ritrasmettere eventuali campioni andati perduti. Nel caso best-effort questa limitazione non è presente, il campione più aggiornato verrà sempre consegnato all’applicazione `e non si effettua un recupero di campioni eventualmente persi. • Liveliness: Questa policy controlla il meccanismo ed i parametri usati dal servizio per assicurare che una data entità sia ancora viva. Ha diverse possibili combinazioni di valori che si adattano sia al caso di data-object aggiornati periodicamente che in modo aperiodico. Consente anche un minimo di personalizzazione per adattarsi a requisiti differenti in termini di tipologie di fallimento che si vogliono identificare. Il livello automatic è utile per applicazioni che necessitano solo un controllo a livello di processo, ma non consente di identificare problemi che riguardano la logica dell’applicazione. Se necessario è opportuno adottare una soluzione In questo caso la liveliness assert liveliness o manuale per identificare guasti e fallimenti. può essere dichiarata esplicitamente con la primitiva implicitamente pubblicando nuovi dati. E’ infine possibile specificare la granularità di questo processo, dalla più fine, ossia per ciascun topic, alla più grossa, un qualsiasi topic pubblicato garantisce la liveliness dell’intero partecipante. • Ownership: serve ad arbitrare l’aggiornamento dei DataReader in presenza di più DataWriter coinvolti nella pubblicazione di valori per lo stesso data-object. Sono possibili due tipi di ownership: shared ed exclusive. Nel caso di un possesso 67 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS shared, il servizio accetterà modifiche da ciascun DataWriter. Nel caso exclusive invece il servizio dovrà garantire che in ogni istante di tempo sia unico il DataWriter abilitato a realizzare aggiornamenti del data-object. Il possesso della risorsa si determina attraverso il valore di un’altra policy, OwnershipStrength. Essa da un valore di Ownership a ciascun DataWriter e la risorsa viene affidata al DataWriter con il valore più elevato, che sia vivo (come specificato dalla Liveliness Policy) e non abbia mancato la deadline (come specificato dalla Deadline Policy). Il possesso può quindi cambiare nei seguenti casi: ¾ nel sistema esiste un DataWriter con Ownership Strength più elevata; ¾ si verifica un cambiamento della Ownership Strength del possessore; ¾ si verifica un cambiamento nella Liveliness del possessore; ¾ il DataWriter possessore manca una deadline. E’ bene osservare che la determinazione del possesso viene operata in maniera indipendente da ciascun DataReader. Non è considerato un requisito l’agreement tra i DataReader riguardo al DataWriter che possiede l’istanza, come non è considerato un requisito che il DataWriter sia cosciente di possedere o meno la risorsa. Questa scelta è motivata dall’obiettivo di preservare il disaccoppiamento tra le entità e di consentire che questa politica sia implementata in maniera efficiente. E’ infine possibile che più DataWriter abbiano lo stesso valore di Ownership Strength, e in questo caso la specifica non fornisce indicazione sul criterio di scelta, impone però che questo debba dare risultato uguale per tutti i DataReader e non cambi a meno che non si verifichi uno dei casi precedenti (cambio nella Strength, nella Liveliness, mancata deadline). 68 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 2.3.5 Le problematiche nell’utilizzo del DDS nel contesto dei MCS I sistemi MCS, come evidenziato nel capitolo1, operano distribuzione di dati su reti WAN (Wide Area Network). Una soluzione architetturale interessante per la realizzazione di applicazioni orientate alla distribuzione dei dati in tali sistemi è costituita proprio dai sistemi publish/subscribe per le proprietà di scalabilità offerte. Il paradigma publish/subscribe offre infatti un elevato disaccoppiamento ed un naturale pattern di comunicazione molti-a-molti(cfr.par 2.3.1). Tra i sistemi publish/subscribe esistenti,il DDS rappresenta quello con le caratteristiche più adatte al contesto dei MCS. Diversi studi dimostrano infatti che i middleware DDS mostrano prestazioni superiori in termini di celerità di consegna rispetto ad altri sistemi basati sullo stesso paradigma. I middleware DDS inoltre offrono delle politiche di QoS configurabili secondo le esigenze specifiche delle applicazioni, con politiche specifiche per garantire opportuni upperbounds dei tempi di consegna e politiche atte a garantire la consegna certa dei messsaggi(cfr. par.2.3.4). Tuttavia i middleware DDS utilizzano soltanto soluzioni basate su schemi ARQ (cfr.par 1.2) per assicurare l'affidabilità nella consegna dei messaggi. Queste soluzioni offrono prestazioni dipendenti dal tasso di perdita dei pacchetti e dalla lunghezza media dei bursts di perdita(cfr.par.1.2). In reti ad estensione geografica, a causa della variabilità di tali parametri, questa dipendenza si traduce nell’impossibilità di offrire dei limiti superiori ed inferiori alla latenza di recovery. È chiaro quindi, come già osservato nel capitolo1, che schemi di tipo ARQ non risultano adatti al loro utilizzo in contesti mission critical su rete ad estensione geografica. 69 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 2.3.6 Una possibile soluzione: l’utilizzo di FEC Le tecniche FEC rappresentano una valida alternativa alle tecniche ARQ. Esse presentano le dipendenze dai patterns di perdita che affliggono gli ARQ non e questo comporta in generale una maggiore prevedibilità dei tempi di recupero (cfr. cap 1). Nel contesto considerato i guasti di rete si traducono in perdite dei pacchetti, cioè in cancellazioni degli stessi. Pertanto è logico considerare come strumento per la realizzazione di uno schema di affidabilità FEC gli Erasure Codes introdotti all’inizio di questo capitolo . Volendo quindi realizzare un servizio di distribuzione dei dati che rispetti al tempo stesso i requisiti di scalabilità, prevedibilità e tolleranza ai guasti (cioè,recupero dalle perdite) si è pensato di introdurre un meccanismo di codifica basato su EC in middleware di tipo DDS. L’utilizzo di FEC per la realizzazione di meccanismi affidabilità non è nuova. In letteratura esistono differenti protocolli multicast, alcuni dei quali presentati nel capitolo 1, che realizzano una consegna certa dei dati attraverso schemi FEC [13,12,10,11,9,16]. Tuttavia tali protocolli (ed i relativi schemi FEC) sono stati progettati con l’obiettivo di soddisfare requisiti di sistemi operanti in contesti differenti da quello in esame, pertanto ottengono prestazioni buone in termini di affidabilità e celerità della consegna in ipotesi differenti da quelle valide nel contesto dei sistemi mission-critical operanti su reti ad estensione geografica. È dunque necessario operare una valutazione sperimentale di schemi FEC nel contesto dei in esame per poterne confermare l’efficacia. È inoltre opportuno valutare anche l’opportunità di utilizzare una tecnica ibrida FEC+ARQ in quanto la difficoltà nella stima 70 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS dei parametri caratteristici delle reti wide-area potrebbe rendere impossibile la realizzazione di una consegna certa con uno schema FEC puro. Nel capitolo successivo sarà presentato lo studio sperimentale di tali soluzioni condotto a partire da un’applicazione DDS di benchmark modificata per integrare uno schema FEC ed uno schema FEC+ARQ. Successivamente si è passati ad un approccio di livello trasporto, iniziando la realizzazione di un protocollo integrato nel DDS che realizzi schemi di affidabilità FEC. I due approcci sono schematizzati nella figura seguente: Figura 23 - Integrazione di FEC in piattaforme DDS: i due approcci utilizzati 71 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Capitolo 3 Erasure Codes a livello applicativo e realizzazione di un protocollo di trasporto affidabile in OpenDDS 3.1 Integrazione degli Erasure Codes in piattaforme DDS L’introduzione degli EC in middleware DDS può avvenire in diversi modi. In questa sede si è inizialmente adottato un approccio di livello applicativo. Un blocco FEC si pone idealmente al di sopra del DDS fornendo all’applicazione dei servizi (opzionali) di protezione dei dati dalle perdite. Tale approccio è schematizzato in figura: Figura 24 - Inserimento FEC a livello applicativo 72 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS La codifica avviene mediante opportune librerie EC nel publisher dell’applicazione. Il publisher invia poi i messaggi ai subscribers tramite il DDS. La decodifica avviene lato subsciber sempre a livello applicativo. Ricevuti i messaggi codificati dal DDS, il decoder ricostruisce i messaggi originari e li passa all’applicazione subscriber. Questo approccio, per quanto semplice dal punto di vista implementativo, ha evidenziato in fase sperimentale dei limiti importanti. Il problema principale è che in tale approccio si è fortemente dipendenti dal DDS sottostante. In determinate condizioni questa dipendenza può manifestarsi in un comportamento inatteso dell’applicazione e del meccanismo di affidabilità, provocando perdite inattese e prestazioni inadeguate. Si è quindi reso necessario un cambio di approccio. L’inserimento degli EC avviene a livello trasporto, andandosi ad integrare ai meccanismi di trasmissione sottostanti il DDS. La seguente figura schematizza il nuovo approccio: Figura 25 - Inserimento FEC a livello trasporto 73 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS In questo modo è possibile realizzare un meccanismo di affidabilità in maniera completamente indipendente dalle problematiche del DDS. Questo approccio in linea teorica è quello vincente, tuttavia sono necessarie ulteriori sperimentazioni a conferma di ciò. 3.2 Erasure Codes a livello applicativo In questo paragrafo si presenta l’approccio di livello applicativo da un punto di vista implementativo, analizzando tutte le componenti che sono intervenute nella realizzazione dello schema. I FEC sono stati introdotti mediante una libreria di codici Reed-Solomon scritta in linguaggio C. La scelta dei codici Reed-Solomon è dettata dai risultati sperimentali presentati in [24]. La libreria è stata utilizzata per la realizzazione di strutture ad oggetti che si occupassero della codifica e della decodifica dei messaggi da pubblicare. Il middleware DDS utilizzato è la distribuzione commerciale RTI DDS, versione 4.1d. Tale middleware è stato scelto perché la soluzione ARQ da esso adottato per garantire la ritrasmissione è molto efficiente e presenta un buon termine di paragone per la soluzione proposta. 3.2.1 La piattaforma RTI DDS RTI DDS[1] è un’implementazione commerciale dello standard OMG per applicazioni real-time distribuite. In questo paragrafo si illustreranno gli aspetti della piattaforma RTI DDS di interesse per la comprensione dei test successivi. In particolare si illustrerà il protocollo affidabile realizzato da RTI DDS per garantire il recupero dalla perdite. 74 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS RTI DDS utilizza come servizio di consegna di default il best-effort:i DataReader settati con questa configurazione ignorano i messaggi persi. L’applicazione riceve soltanto una notifica se non riceve un nuovo messaggio entro un certo periodo di tempo( periodo settato tramite la policy DEADLINE). Il modello di consegna affidabile realizzato nel middleware RTI DDS garantisce invece la consegna certa ed in ordine dei messaggi inviati tra i partecipanti della specifica applicazione. In sostanza,il middleware realizza questo servizio mediante l’utilizzo di un protocollo di tipo ARQ con utilizzo di riscontri sia positivi che negativi . Esso inoltre si avvale dell’ausilio di due code di messaggi ,una per il DataWriter – send queue – ed una per il DataReader –receive queue - della pubblicazione in questione,fornendo ai primi le risorse necessarie a memorizzare gli ultimi X messaggi inviati ed ai secondi le risorse necessarie a memorizzare X messaggi consecutivi attesi(cioè a memorizzare messaggi giunti out-oforder in attesa di quelli mancanti). Il DDS rimuove i messaggi dalla send queue solo quando è certo che siano stati consegnati a tutti i subscribers interessati alla pubblicazione,mentre la rimozione dei messaggi dalla receive queue avviene solo quando è possibile effettuare la consegna ordinata degli stessi,cioè quando siano arrivati i messaggi mancanti (rispetto alla sequenza attesa). Il protocollo affidabile di RTI DDS utilizza 4 tipi diversi di messaggi : DATA e NOKEY_DATA:tali messaggi,inviati dal DataWriter, contengono il valore effettivo del dato inviato ed associano a tale valore un numero di sequenza progressivo usato dal DDS per reperire il dato all’interno della send queue associata a quel particolare DataWriter.Il numero di sequenza è generato automaticamente dal DataWriter ogni volta che l’applicazione invoca una write() 75 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS sul DDS.(NOKEY_DATA si usa nel caso in cui il tipo di dato non abbia una chiave) ACKNACK:come accennato in precedenza,RTI utilizza dei risconti positivi o negativi per comunicare al DataWriter che il DataReader interessato ha effettivamente ricevuto il dato e che il dato è stato salvato nella coda di ricezione,oppure per comunicare i dati mancanti rispetto alla sequenza attesa. Per questi scopi si utilizza un unico tipo di messaggio,ACKNACK appunto,che ha la seguente semantica: o ACKNACK(<first_missing>) : indica che tutti i messaggi con numero di sequenza minore (strettamente) di first_missing sono stati ricevuti con successo e consegnati all’applicazione in ordine(cioè,ack positivo dei messaggi fino a first_missing-1),e dunque il prossimo atteso è first_missing(ack negativo del messaggio first_missing); o ACKNACK(<first_missing>-<last_missing>): indica l’intervallo di messaggi mancanti ,dunque nel senso di ack negativi; HB:messaggio di HeartBeat;è utilizzato dal DataWriter per segnalare al DataReader che dovrebbe aver ricevuto i dati contrassegnati dai numeri di sequenza indicati come intervallo nel messaggio,e può opzionalmente richiedere un riscontro a questa segnalazione; I messaggi di cui sopra non devono necessariamente essere inviati in singoli pacchetti di rete,bensì è possibile (e consigliabile per migliorare le prestazioni superiori)inserirne più d’uno in un singolo pacchetto(piggyback). Il comportamento del protocollo può essere meglio compreso mediante l’analisi di uno scenario elementare così caratterizzato: abbiamo: • Perdita messaggio dati 76 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS • Nessuna perdita messaggio di riscontro In breve lo scenario prevede l’invio di 3 messaggi dati contrassegnati da numeri di sequenza 1,2 e 3 con perdita del messaggio numero 1;il diagramma è il seguente: Figura 26 - Protocollo affidabile di RTI DDS Lo scenario evolve come segue: 1) lato Publisher l’applicazione invoca una write(A) sul DDS tramite l’oggetto DataWriter per inviare il dato A;il DataWriter associa il numero di sequenza ‘1’ a tale dato prima di inviarlo e lo memorizza nella send queue(cache(A,1)); 2) il protocollo invia due messaggi insieme(piggyback),un DATA(A,1) ed un HB(1),cioè effettua l’invio effettivo del dato e segnala (con l’HeartBeat) che il DataReader dovrebbe aver ricevuto tale dato;la coppia di messaggi si perde; 3) il Publisher invoca una nuova write per l’invio del secondo dato,B,contrassegnato dal numero di sequenza 2,insieme all’HeartBeat per i messaggi da 1 a 2;prima 77 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS dell’invio effettivo si salva il dato nella send queue:cache(B,2);DATA(B,2);HB(12); (si noti che a questo punto ,non avendo ancora ricevuto alcun ACKNACK dal DataReader, entrambi i dati A e B sono contrassegnati come non eliminabili nella send queue); 4) ricevuto il dato (B,2) il DataReader effettua la memorizzazione nella receive queue (cache(B,2)),ma poiché manca il dato con numero di sequenza 1 riserva ad esso un posto nella coda e salva B;entrambi i messaggi vengono segnalati come non disponibili(X) per la read o la take sul DataReader(mancando (A,1) non è possibile una consegna ordinata); 5) avendo ricevuto l’HB(1-2) ed avendo riscontrato la perdita del messaggio 1,il DataReader invia l’ACKNACK(1),richiedendo in pratica la ritrasmissione del messaggio (A,1); 6) ricevuto l’ACKNACK(1)(che significa che i dati fino ad 1 ESCLUSO sono stati ricevuti,ovvero che 1 si è perso) il DataWriter inizia la fase di ritrasmissione,prima recuperando il dato dalla send queue ( get(1) ),poi reinviando il dato mancante(DATA(A,1));(NB:l’Heartbeat NON viene reinviato!) 7) ricevuto il dato (A,1) il DataReader può contrassegnare come disponibili per la read o take entrambi i dati in coda; 8) il DataWriter effettua l’invio del terzo dato (DATA(C,3)) insieme ad un HeartBeat da 1 a 3(da 1 a 3 perché ha inviato i dati contrassegnati da questi numeri di sequenza);i dati salvati finora nella send queue sono ancora impossibili da eliminare in quanto non sono stati ricevuti ACKNACK con numeri di sequenza superiori ad 1(cioè nessun messaggio,dal punto di vista del Publisher) è stato memorizzato nella receive queue; 78 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 9) ricevuto il terzo dato lo memorizza in coda e lo segnala come disponibile(avendo già ricevuto 1 e 2) e poiché ha ricevuto l’HB(1-3) il DataReader effettua il controllo sui dati ricevuti e trovandoli tutti in coda può inviare l’ACKNACK(4),che segnala al DataWriter l’avvenuta memorizzazione dei messaggi fino a 3 e l’attesa del quarto; 10) ricevuto tale ACKNACK(4) il DataWriter può finalmente contrassegnare come eliminabili i dati fino a 3(incluso)e proseguire con le altre eventuali operazioni. Una sottile ma importante caratteristica del protocolo che è opportuno segnalare è la seguente: i messaggi ACKNACK sono inviati dai DataReader esclusivamente in risposta diretta ai messaggi di HeartBeat.Questo permette ai DataWriter di controllare in qualche modo l’overhead dovuto a tali messaggi di servizio,ad esempio inviando un unico HB per una lunga sequenza di DATA() ,e ricevendo pertanto un unico ACKNACK per tutta la sequenza. 79 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 3.2.2 Libreria Jerasure per codici Reed-Solomon Jerasure è una libreria in C/C++ è una implementazione degli Erasure Code: ReedSolomon (RS) e Liberation. Tratteremo solo i primi, per i codici Liberation si rimanda al riferimento [32] dove è disponibile la libreria e la relativa documentazione. Jerasure si compone dei seguenti file: ¾ galois.h e galois.c: contengono procedure per l’aritmetica nel campo di Galois (2w ) GF per 1 δ w δ 32 ¾ jerasure.h e jerasure.c: contengono procedure di codifica/decodifica e procedure di supporto a queste ¾ reed-sol.h e reed-sol.c: implementano procedure per la generazione di matrici di distribuzione di Vandermonde [19] e routine per i codici Reed-Solomon ottimizzati per RAID-6 [15], tecnica nella quali i blocchi ridondanza sono al massimo due (m =2) ¾ cauchy.h e cauchy.c: implementano procedure per la generazione di matrici di distribuzione di Cauchy e routine di supporto a queste Vengono presentate adesso le routine di generazione delle matrici di distribuzione e di codifica messe a disposizione dalla libreria Jerasure. Routine di generazione delle matrici di distribuzione: ¾ galois_single_divide(): Effettua una divisione fra elementi singoli di (2w ) GF , ma usata opportunamente serve a generare una matrice di Cauchy ¾ galois_single_multiply(): Effettua una moltiplicazione fra elementi singoli 80 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS di (2w ) GF , ma usata opportunamente serve a creare delle matrici RAID-6 ¾ reed_sol_vandermonde_coding_matrix(): Genera una matrice di Vandermonde ¾ reed_sol_r6_coding_matrix(): Genera una matrice per RAID-6 ¾ cauchy_original_coding_matrix(): Genera una matrice di Cauchy ¾ cauchy_good_general_coding_matrix(): Genera una buona matrice. A seconda dei parametri che gli vengono passati, genera una matrice ottimale per RAID-6, altrimenti genera una buona matrice chiamando rispettivamente ¾ cauchy_original_coding_matrix() e cauchy_improve_coding_matrix() che migliorala matrice con un metodo euristico Routine di codifica: ¾ jerasure_matrix_encode(): effettua la codifica sfruttando una delle matrici generate dalle routine di generazione delle matrici di distribuzione ¾ reed_sol_r6_encode(): può essere usata solo nel caso m = 2 ed effettua una codifica ottimizzata, non necessita di matrice di distribuzione poiché implicita ¾ jerasure_bitmatrix_encode(): effettua la codifica sfruttando una delle matrici generate dalla routine di generazione delle matrici di distribuzione estesa secondo l’isomorfismo fra il campo di Galois (2w ) GF e lo spazio delle matrici binarie L ⋅ L. La matrice viene estesa mediante la routine jerasure_matrix_to_bitmatrix() ¾ jerasure_schedule_encode(): effettua la codifica sfruttando una schedule che è una struttura derivata dalla bitmatrix atta a rappresentare le operazioni di codifica. Queste ultime vengono infatti pre-elaborate anziché fatte scorrendo ogni volta la bitmatrix aumentando l’efficienza. La bitmatrix viene convertita in una schedule tramite jerasure_dumb_bitmatrix_to_schedule() o meglio jerasure_smart_bitmatrix_to_schedule()[32]. 81 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Si noti che per la decodifica esistono funzioni complementari a quelle di codifica qui introdotte, pertanto esse non verranno presentate esplicitamente. Per approfondimenti si rimanda al riferimento [32]. La libreria Jerasure è stata utilizzata per la realizzazione delle fasi di codifica e decodifica nell’applicazione benchmark. In particolare sono state utilizzate le seguenti funzioni: ¾ cauchy_original_coding_matrix(): per la generazione della matrice di Cauchy ¾ jerasure_matrix_to_bitmatrix():per la conversione della matrice di Cauchy in matrice binaria ¾ jerasure_bitmatrix_encode(): per la codifica dei dati in ingresso mediante la matrice binaria ¾ jerasure_bitmatrix_edecode(): per la decodifica dei dati ricevuti mediante la matrice binaria 82 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 3.2.3 L’applicazione benchmark L’applicazione benchmark utilizzata è stata realizzata a partire da un’applicazione di test scritta in linguaggio C++ inclusa nella distribuzione commerciale di RTI DDS versione 4.1d. Le funzioni della libreria Jerasure per la codifica/decodifica sono wrappate all’interno di una gerarchia di classi che gestisce i messaggi da codificare e decodificare mediante una struttura dati linkata. Il diagramma UML è il seguente: Figura 27 – Classi del layer FEC introdotto tra applicazione e DDS 83 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS L’applicazione opera come segue: ¾ un publisher emette un certo numero di pubblicazioni di dimensione scelta da riga di comando all’atto dell’avvio dell’applicazione; ¾ le pubblicazioni vengono suddivise in k blocchi (con k dipendente dalla dimensione totale del messaggio) che vengono poi codificati con il grado di ridondanza indicato da riga di comando ¾ per ogni blocco così ottenuto si inserisce un timestamp associato alla pubblicazione e lo si invia tramite il DDS configurato in modalità best-effort ¾ lato subscriber,appena si ricevono almeno k blocchi per una pubblicazione si tenta la decodifica;appena ¾ nella versione del benchmark che realizza lo schema misto FEC+ARQ, se il subscriber riceve meno di k blocchi per una certa pubblicazione,provvede ad effettuare la richiesta di ritrasmissione indicando i blocchi mancanti per arrivare a k Per ogni pubblicazione si registrano,lato publisher, il timestamp di invio del messaggio ed il tempo di arrivo dell’echo,calcolando in pratica la latenza di messaggio come RTT/2. 84 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 3.3 La campagna sperimentale Per valutare le prestazioni della soluzione FEC ed operare un confronto con la soluzioni FEC+ARQ ed ARQ del DDS in modalità reliable è stata condotta una campagna sperimentale in ambiente controllato, allo scopo di ottenere risultati che fossero riproducibili. 3.3.1 Descrizione del testbed L’approccio scelto per operare i test è quello della network emulation. Un publisher ed un subscriber sono stati istanziati su due macchine fisiche differenti collegate ad un emulatore di rete (Shunra Virtual Enterprise). Tale emulatore ha permesso di simulare il comportamento della rete reale in base a specifici parametri estratti sperimentalmente e ad un opportuno modello matematico. Figura 28 - Il simulatore di rete utilizzato L’emulazione, rispetto alla simulazione, si presenta come uno schema ibrido[37] in cui, accanto ad elementi simulati in base a modelli matematici governati da opportuni parametri (in questo caso è la rete ad essere simulata mediante modello), si utilizzano anche elementi reali, come sono le due macchine fisiche collegate all’emulatore utilizzate in questa campagna. La differenza principale tra simulazione ed emulazione è la seguente: mentre la prima utilizza una dimensione temporale virtuale (cioè,anche il tempo è 85 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS simulato), la seconda deve avvenire in una dimensione temporale reale, data la presenza di elementi reali. Figura 29 - Il testbed utilizzato per le sperimentazioni 3.3.2 Caratterizzazione del comportamento di rete Per valutare correttamente le prestazioni degli schemi FEC e FEC+ARQ è necessario modellare il comportamento della rete nella maniera più realistica possibile. Lo studio di Internet mediante un suo modello consiste nel semplificare e ridurre la rete ad un prototipo in scala che ne riproduca le caratteristiche essenziali e ne restituisca una rappresentazione semplice anche se non completamente corrispondente alla rete reale. In quest’ottica sono stati utilizzati parametri precedentemente estratti da sperimentazioni effettuate su alcuni paths europei. I dati sperimentali hanno permesso una caratterizzazione di tali paths in termini di : ¾ latenza di rete (Delay) ¾ percentuale pacchetti persi( PLR-Packet Loss Rate) ¾ n.medio pacchetti perdi di fila (ABL- Average Burst Length) 86 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Figura 30 - I paths presi in esame per simulare la Internet I risultati mostrano un andamento del PLR dipendente dall’intervallo di pubblicazione dei messaggi, mente l’ABL si mostra sostanzialmente dipendente dal path: Figura 31 - Andamento dell'Average Burst Length nei paths esaminati 87 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Figura 32 - L'andamento del Packet Loss Rate nei paths esaminati Tra i sei paths totali sono stati selezionati, in base ai dati a disposizione, i seguenti 3 scenari: Figura 33 - I parametri degli scenari selezionati Gli scenari sono stati selezionati in modo da garantire una caratterizzazione di rete che fosse statisticamente significativa. I tre scenari presentano pertanto differenti ritardi introdotti, sono caratterizzati da dispersioni statistiche dei ritardi differenti (la dispersione statistica è misurata in termini di IQR) e differenti percentuali di perdita dei pacchetti (PLR). I valori di ABL medi risultano compresi tra un minimo di 1,26 ed un massimo di 1,59. 88 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 3.3.3 Emulazione di rete: il modello di Gilbert Simulare un canale con perdite mediante emulatore di rete comporta la scelta di un modello matematico che permetta all’emulatore, attraverso parametri rappresentativi della rete, di ricrearne il comportamento in maniera realistica. La rete da simulare in questo contesto è Internet, con le caratteristiche di variabilità della latenza e, soprattutto, della correlazione tra le perdite. Per testare correttamente l’affidabilità degli schemi in esame, è infatti necessario che il modello delle perdite sia simulato nella maniera più prossima possibile a quanto avviene sulla rete reale. È intuitivo che per simulare una rete con tali caratteristiche ( o almeno, scenari rappresentativi tale rete) non è sufficiente un modello semplicistico di canale con perdite, come ad esempio un canale BEC (Binary Erasure Channel) in quanto privo di informazioni di stato. Non è ovviamente possibile simulare delle perdite correlate mediante un modello che non abbia memoria dell’esito dell’invio del dato precedente. Figura 34 - Binary Erasure Channel (BEC) 89 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS In un canale BEC il dato (binario) è inviato correttamente oppure cancellato, ed ogni invio è indipendente dal precedente e dal successivo. La probabilità di cancellazione è cioè sempre la stessa per ogni invio. È dunque necessario utilizzare un altro modello, che tenga memoria dell’andamento degli invii precedenti. La scelta è caduta sul modello di Gilbert[36]. Il modello di Gilbert è basato su una catena di Markov a due stati ed aggiunge quindi memoria rispetto ad un canale BEC. In breve, la memoria della catena di Markov permette di definire una probabilità che un pacchetto venga perso se è stato perso anche quello precedente e di generare quindi perdite a burst. Il modello si presenta come segue: Figura 35 - Rappresentazione del modello di Gilbert Esso consiste di due stati del canale: LOSS e NON-LOSSI. Le probabilità di transizione da uno stato ad un altro sono p e q. Una transizione dallo stato NON-LOSS allo stato LOSS avviene con probabilità p mentre la transizione opposta con probabilità q. Nello stato NON-LOSS la probabilità di perdite è nulla,mentre nello stato LOSS è pari ad 1. Le probabilità di restare nei due stati sono rispettivamente 1-p ed 1-q. Il modello è dunque completamente caratterizzato dai due parametri p e q, e tali parametri possono essere calcolati, ai fini della simulazione, a partire dai dati estratti sperimentalmente dai paths da simulare secondo le seguenti formule: 90 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 3.3.4 Risultati e valutazione delle prestazioni I parametri dei test eseguiti sono: ¾ Dimensione messaggi : 100 KB ¾ Periodo di pubblicazione : 20 msec ¾ Numero di pubblicazioni : 200 ¾ Numero di pacchetti di ridondanza: m= {1,….,12} I test sono stati eseguiti sia per lo schema FEC che per FEC+ARQ. Essi miravano a valutare l’affidabilità degli schemi, misurata in termini di percentuale di pacchetti correttamente giunti a destinazione, e la prevedibilità degli stessi, misurata in termini di InterQuartileRange(IQR) sulla latenza di consegna. I grafici seguenti mostrano l’andamento della percentuale di consegna al variare di m nei tre scenari. FEC+ARQ mostra una affidabilità superiore rispetto a FEC fin dai primi livelli di ridondanza grazie alle ritrasmissioni. Tuttavia FEC mostra una consegna pari al 100% nel primo scenario per m=8 (FEC+ARQ raggiunge il 100% per m=4). L’andamento di entrambi gli schemi diventa comunque decrescente da un certo valore di m in poi in quanto la codifica e la decodifica dei messaggi tendono a diventare maggiori del periodo di pubblicazione, portando alla saturazione delle code del DDS ed al conseguente drop dei messaggi. 91 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Figura 36 - Percentuale di successo per FEC+ARQ al variare di m nei 3 scenari Figura 37 - Percentuale di successo di FEC al variare di m nei 3 scenari 92 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Il grafico successivo mostra invece l’andamento di FEC sovrapposto a quello di FEC+ARQ nel primo scenario in modo da poter operare un confronto immediato Figura 38 - Confronto tra le percentuali di successo di FEC e FEC+ARQ nel primo scenario Il grado di ridondanza m influenza non solo il grado di affidabilità, ma anche le prestazioni degli schemi in termini di latenza. Come osservabile nei grafici successivi, relativi al primo scenario, FEC mostra un andamento crescente della latenza con m, mentre FEC+ARQ presenta un grado elevato di latenza con valori piccoli di m (che provocano aumento delle ritrasmissioni) decrescente con m fino ad un certo punto, quando poi l’aumento di m provoca un aumento complessivo dei pacchetti inviati soggetti a perdite, provocando l’aumento del numero di ritrasmissioni necessarie. Inoltre già in questo scenario si nota come la variabilità dello schema FEC molto inferiore rispetto a quella dello schema FEC+ARQ. 93 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Figura 39 - Andamento della latenza di FEC e FEC+ARQ nel primo scenario al variare di m Figura 40 - IQR della latenza nel primo scenario 94 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Le osservazioni relative alla latenza del primo scenario si estendono anche agli altri, come mostrato dai grafici che seguono (tali grafici sono normalizzati rispetto ai valori del primo scenario): Figura 41 - Latenza mediana dei 3 scenari con valori ottimali di m Figura 42 - IQR della latenza nei 3 scenari con valori ottimali di m 95 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS I grafici precedenti mostrano l’andamento della latenza degli schemi FEC e FEC+ARQ nei 3 scenari con il valore di m ottimale determinato negli esperimenti precedenti. Inoltre si è operato in questi grafici un confronto con l’ARQ del DDS sia in termini di latenza mediana che di variabilità della latenza stessa. I risultati mostrano chiaramente che FEC e FEC+ARQ esibiscono la stessa latenza mediana nei 3 scenari (esattamente gli stessi valori in tutti e tre i casi) mentre la variabilità, e dunque l’imprevedibilità dello schema, è molto superiore per FEC+ARQ. Tale variabilità dipende dal numero di ritrasmissioni variabile che tende a far aumentare la dispersione della latenza. Questo fenomeno è illustrato nell’immagine seguente che mostra l’andamento della latenza degli schemi FEC e FEC+ARQ nel primo scenario al variare delle pubblicazioni. Figura 43 - Andamento della latenza nel primo scenario al variare delle pubblicazioni I picchi presenti nell’andamento di FEC+ARQ provocano l’aumento della dispersione statistica dei tempi di latenza, cioè una maggiore imprevedibilità. 96 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Un ulteriore test mirava a valutare la stabilità dell’ARQ del DDS al variare del periodo di pubblicazione. I risultati di tale test sono mostrati nel grafico che segue: Figura 44 - Instabilità del meccanismo di ritrasmissione del DDS al variare del periodo di pubblicazione Il DDS mostra un andamento della latenza crescente quando il periodo di pubblicazione diventa troppo breve. La coda di invio del publisher cresce indefinitamente al crescere delle pubblicazioni diventando instabile e provocando ritardi nella trasmissione (e ritrasmissione dei messaggi). 97 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 3.3.5 Considerazioni Nonostante i risultati della campagna mostrino la sostanziale efficacia dello schema FEC in termini sia di prevedibilità che di affidabilità della consegna, l’approccio complessivo si è mostrato troppo dipendente dal DDS sottostante. Nel prosieguo del lavoro si è dunque adottato un cambio di approccio, passando allo sviluppo di uno schema FEC operante a livello trasporto. Con lo spostamento del layer FEC/FEC+ARQ al di sotto del DDS l’idea è di ottenere un maggiore disaccoppiamento tra il middleware e lo schema di affidabilità, favorendo nel contempo l’integrazione nella piattaforma stessa. Lo svantaggio di tale approccio è la maggiore complessità: operare al livello trasporto implica la sostanziale ridefinizione di tutti i meccanismi ed algoritmi di invio e ricezione dei messaggi che nell’approccio al livello applicativo erano offerti dal DDS sottostante. 3.4 Erasure Codes a livello trasporto Il cambio di approccio operato a valle delle considerazioni sui risultati della fase sperimentale ha comportato anche un cambio della piattaforma middleware utilizzata. Si è passati dall’utilizzo di RTI DDS ad OpenDDS [2][3]. La scelta di OpenDDS è stata dettata da vari fattori: ¾ è open-source:il codice C++ è liberamente consultabile e modificabile secondo le esigenze; ¾ è portabile: OpenDDS è realizzato sulla piattaforma ACE (Adaptive Communication Environment [33]) che si occupa della comunicazione e del controllo; 98 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS ¾ offre un pluggable transport framework che consente la realizzazione di protocolli di trasporto adatti alle proprie esigenze Realizzando dunque uno schema di affidabilità FEC nel contesto di un protocollo di trasporto, è possibile poi effettuarne il plug-in nella piattaforma, in maniera trasparente al DDS stesso ed alle applicazioni che interagiscono solo con il transport layer. 3.4.1 La piattaforma OpenDDS OpenDDS è, come detto, una implementazione OpenSource dello standard OMG DDS. Allo stato attuale implementa solo il livello DCPS dello standard. Dal punto di vista architetturale si presenta come in figura seguente: Figura 45 - L'architettura di OpenDDS OpenDDS è realizzato al di sopra di ACE [33] per assicurare la portabilità della piattaforma ed utilizza anche alcune funzionalità del middleware CORBA TAO quali ad esempio le funzionalità del compilatore idl e come base per il DCPSInfoRepository. Le entità DCPS accedono alle funzionalità del trasporto mediante il transport layer che assicura trasparenza alle applicazioni rispetto al protocollo utilizzato. Le applicazioni 99 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS accedono alle funzioni offerte dall’interfaccia del layer e le implementazioni specifiche dei protocolli restano nascoste. Allo stato attuale OpenDDS include 4 protocolli di trasporto built-in: una implementazione UDP,una TCP,un multicast affidabile ed un multicast non affidabile. Dal punto di vista implementativo OpenDDS utilizza un thread per la comunicazione con l’ORB mentre le comunicazioni di I/O non dirette verso l’ORB avvengono in threads separati. OpenDDS utilizza inoltre il DCPSInfoRepository come processo separato che gestisce la comunicazione nei domini DDS. Tutti i partecipanti devono interagire attraverso il DCPSInfoRepository (istanziato su un determinato nodo) che tuttavia resta al di fuori del flusso dei dati. Figura 46 - OpenDDS : DCPSInfoRepository 100 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 3.4.2 Il Pluggable Transport Layer di OpenDDS OpenDDS utilizza il Pluggable Transport Layer come “collante” tra le applicazioni DDS ed il particolare protocollo di trasporto scelto per l'applicazione stessa. Questo permette di utilizzare il servizio di distribuzione dei dati con una varietà di protocolli di trasporto senza apportare modifiche all'applicazione poichè essa “vede” solo il Pluggable Transport Layer. Figura 47 - Pluggable transport layer di OpenDDS Allo stato attuale OpenDDS fornisce delle semplici implementazioni del protocollo TCP,del protocollo UDP e di due protocolli di trasporto multicast,uno reliable ed uno non reliable. Il Pluggable Transport Layer consente agli sviluppatori di applicazioni di realizzare i propri protocolli di trasporto personalizzati. L'implementazione di un protocollo personalizzato consiste in breve nella specializzazione di un insieme di classi definite nella 101 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS cartella del Transport Framework,$DDS_ROOT/dds/DCPS/transport/framework. Come è possibile intuire anche dall'immagine precendente,i protocolli di Trasporto (cioè gli oggetti che permettono di accedere alle funzionalità protocolli di trasporto) sono generati da un oggetto factory e vengono successivamente associati ai publishers ed ai subscribers. Il Pluggable transport layer ( o meglio,il transport framework) fornisce, come detto in precedenza, l'insieme di classi da specializzare per la realizzazione di un proprio protocollo di trasporto in OpenDDS. Il TransportFramework di OpenDDS non è standard in quanto allo stato attuale non è stata effettuata alcuna richiesta di standardizzazione da parte degli sviluppatori di OpenDDS. Questo ha tuttavia un impatto minimo sugli sviluppatori di applicazioni DDS poiché le problematiche di trasporto risultano trasparenti ad essi. Si è inoltre accennato al fatto che i protocolli di trasporto siano generati da un oggetto Factory che si occupa di istanziare gli oggetti che forniscono accesso ai servizi del particolare protocollo di trasporto usato. All'interno del framework è dunque presente una particolare classe astratta,la TransportImplFactory, specializzando la quale è possibile definire delle factory concrete preposte alla creazione delle istanze dei propri oggetti di protocollo. Il codice delle applicazioni utilizzerà poi i metodi forniti da questi ultimi per accedere alle funzionalità del protocollo. In realtà le applicazioni sono trasparenti ai differenti protocolli di trasporto in quanto esse fanno riferimento,per l'utilizzo dei servizi di trasporto, ad un' interfaccia unica definita anch'essa nel transport framework mediante la classe astratta TransportImpl. Da essa infatti devono derivare i particolari protocolli realizzati, cioè gli oggetti concreti che la factory dovrà istanziare. 102 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Di fatto quindi la realizzazione di un nuovo protocollo in OpenDDS avviene mediante un Abstract Factory pattern ,cioè mediante un particolare schema di programmazione secondo il quale un certo oggetto(concreto),derivante da un oggetto astratto che fa da interfaccia, viene creato dalla corrispondente Factory che a sua volta deriva dalla Factory astratta: Figura 48 - Abstract Factory Pattern Nel caso del framework di OpenDDS il diagramma presentato nella figura precedente si particolarizza come segue: 103 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Figura 49 - Abstract Transport Factory in OpenDDS L'mmagine precedente riporta come classi concrete d'esempio le implementazioni di TCP e di UDP presenti in OpenDDS;le corrispondenti Factory sono istanziate mediante una classe concreta del framework,la TransportFactory. In pratica nel file TheTransportFactory.h del framework è definito un oggetto di tipo TransportFactory(chiamato “TheTransportFactory” )mediante il metodo statico instance(); tale oggetto costituisce il punto di accesso dell'applicazione alle funzionalità di creazione degli oggetti concreti di TransportImplFactory e TranportImpl: ............... namespace OpenDDS { namespace DCPS { 104 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS #define TheTransportFactory OpenDDS::DCPS::TransportFactory::instance() } /* namespace DCPS */ } /* namespace OpenDDS */ ................................................................. Qualora un publisher (o un subscriber) voglia ad esempio istanziare un proprio oggetto di trasporto procederà come segue: Figura 50 - Creazione di un oggetto concreto di trasporto Il primo metodo invocato è un metodo di TheTransportFactory, create_transport_impl();le operazioni successive sono invocate al suo interno e permettono di restituire al chiamante un oggetto di tipo astratto TranportImpl associato però ad una particolare implementazione concreta che deve essere stata precedentemente realizzata. 105 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 3.5 Il prototipo di un protocollo di trasporto FEC-based per OpenDDS In questo paragrafo sarà presentata il prototipo del protocollo di trasporto di cui si è iniziata la realizzazione. Tale prototipo ha lo scopo principale di aprire una direzione di sviluppo nuova per lo studio di schemi FEC in piattaforme DDS e non è, allo stato attuale, un protocollo completo in ogni sua parte. 3.5.1 Scelte di progetto Il prototipo è stato concepito come strato FEC sovrapposto al multicast non affidabile dello stack TCP/IP (overlay FEC). Tale scelta è stata dettata dalla volontà di utilizzare come supporto all’invio ed alla ricezione dei messaggi un’infrastruttura di rete reale. Il prototipo è orientato al suo utilizzo su rete Internet, e non su una infrastruttura dedicata, pertanto ha senso utilizzare un protocollo realmente implementato dai dispositivi di rete come il protocollo IP multicast. Soluzioni analoghe sono state adottate da protocolli precedentemente analizzati per le stesse motivazioni[13]. La stratificazione risultante è la seguente : Figura 51 - FEC sovrapposto al multicast IP 106 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Il prototipo è scritto in linguaggio di programmazione C++ e compilato come librerie a collegamento dinamico (shared object in ambiente Linux[34]) alla stregua degli altri protocolli di OpenDDS. Il collegamento dinamico permette alle applicazioni che utilizzano i protocollo di non includere all’interno del proprio eseguibile il file oggetto della libreria, ma solo un riferimento ad essa. La libreria(cioè il file oggetto della libreria) sarà poi caricata dinamicamente durante l’esecuzione dell’applicazione[34]. Lo schema di funzionamento di base prevede che la codifica avvenga prelevando la sequenza di bytes componenti la pubblicazione dalla struttura dati restituita dalle classi del transport layer di OpenDDS. La codifica avviene immediatamente prima dell’invio su rete in multicast IP. Calcolata la dimensione in byte dei dati della pubblicazione, essi vengono suddivisi in k blocchi (il valore di k dipende dalla dimensione complessiva dei dati e dai parametri di codifica impostati). Ad essi è applicato un Erasure Code di tipo Reed-Solomon (lo stesso utilizzato nel benchmark) con grado di ridondanza selezionato in precedenza. In fase di ricezione, una volta ricevuti nel buffer dati almeno k blocchi si effettua la decodifica. Se 3.5.2 Architettura complessiva Nella sua versione definitiva, il prototipo dovrebbe presentare come punto di accesso alle funzionalità di invio e ricezione la classe ErasureProtocolIF: Figura 52 - Classe ErasureProtocolIF 107 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Tale classe dovrà offrire due semplici primitive, send() e receive, che nascondano all’applicazione utente la complessità del protocollo. In pratica la realizzazione sarebbe quella di un pattern façade. Le classi derivate dalla classe EventHandler,attualmente clase astratta, dovrebbero poi definire delle specifiche logiche di invio e ricezione lato publisher e lato subscriber. Allo stato attuale tali classi risultano non implementate o astratte. 108 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Figura 53 - Il diagramma delle classi del prototipo 109 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS In questa versione del prototipo la logica di invio è gestita dalla sola classe ErasureProtocolSocket, in cui avvengono anche le fasi di codifica e decodifica dei dati, rispettivamente nei metodi send_bytes() e receive_bytes(). La classe che incapsula i meccanismi di codifica e decodifica è la classe Packet, il cui diagramma è mostrato nell’immagine seguente: Figura 54 - classe Packet per la gestione della codifica e decodifica dei dati Il costruttore della classe Packet crea un oggetto che si occupa della codifica del blocco di byte, inizializzando tutti i parametri necessari alla codifica e decodifica. In base ai parametri inseriti come parametri all’atto della creazione dell’oggetto, il costruttore alloca delle aree di memoria i cui verranno memorizzati i blocchi dato ed i blocchi di codifica. Il costruttore lavora su un buffer di dati linearizzati che deve essere 110 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS opportunamente riempito dal blocco di byte dei dati da codificare mediante il metodo addStream(). Esso costruisce inoltre le matrici che saranno utilizzate per la codifica e la decodifica. La classe Packet utilizza le funzioni delle libreria Jerasure analizzata in precedenza per realizzare i metodi encode() e decode(). Il metodo encode() utilizza la matrice binaria generata dal costruttore tramite la funzione di libreria apposita. Esso genera k+m blocchi di dati codificati che vengono memorizzati separatamente in due array, uno di dimensione k contenente i dati originari (il codice utilizzato è un codice sistematico) e l’altro di dimensione m contente i blocchi di parità. Il metodo decode() suppone di avere a disposizione almeno k blocchi disponibili nella struttura dati tra blocchi dato e blocchi di parità. Nel caso in cui siano disponibili meno di k blocchi risulterà impossibile realizzare la decodifica. Il metodo canDecode() si occupa di verificare questa condizione. I metodi getData() e getCoding() sono utilizzati nella fase post-codifica per il prelievo dei blocchi da inviare sulla rete, mentre i metodi addData() e addCoding() sono utilizzati successivamente alla ricezione lato subscriber per effettuare poi la decodifica. La classe che incapsula le logiche di invio e ricezione (nonché le fasi di codifica e decodifica dei dati) è, come detto, ErasureProtocolSocket. La classe ErasureProtocolSocket presenta nella struttura dati un oggetto di tipo Ace_Sock_Dgram fornito dalla piattaforma ACE che mette a disposizione metodi di invio e ricezione tipici delle socket di sistema[34](è sostanzialmente un wrapper). La realizzazione del FEC overlay sul multicast IP avviene proprio in questa classe : la fase di codifica, gestita mediante un oggetto di classe Packet, è immediatamente precedente all’invio dei dati sulla socket a datagrammi, cui sarà passato come indirizzo di rete quello del gruppo multicast utilizzato. Viceversa la fase di decodifica è immediatamente successiva alla ricezione dei dati dalla socket da parte del subscriber. 111 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Il metodo send_bytes() elabora la struttura dati iovec iov[] (è l’array di puntatori ai buffer dati contenenti i bytes della pubblicazione passato dal livello applicativo) effettuando il conteggio dei bytes, inserendoli nella struttura dati di un oggetto Packet ed applicando poi la codifica Reed-Solomon. I blocchi dato ed i blocchi codice vengono poi utilizzati per riempire una struttura di tipo iovec che sarà inviata mediante il metodo send() della ACE_Dgram_Socket_Mcast all’indirizzo IP multicast settato da file di configurazione (NB:anche il numero di porto è settato tramite il medesimo file di configurazione). Il metodo receive_bytes() effettua la ricezione dei dati dalla socket multicast tramite un buffer dati. Il contenuto di questo buffer è successivamente elaborato per estrarre i pacchetti dato ed i pacchetti codice che saranno utilizzati per riempire la struttura dati di un oggetto di classe Packet. Se sono stati ricevuti almeno k blocchi in totale, è possibile effettuare la decodifica. Una volta decodificati i dati, essi vengono inseriti nella struttura iovec iov[] data come parametro di ingresso/uscita alla funzione receive_bytes: tale struttura permette di passare i dati alla classe del frame work TransportReceiveStrategy che poi effettuerà una call-back sull’oggetto di trasporto per segnalare la ricezione di un messaggio di cui effettuare il delivery (metodo delivery_sample() di TransportImpl) 3.5.3 Integrazione in OpenDDS Oltre alle classi che includono la logica specifica del protocollo è stato necessario definire un insieme di classi derivate da classi del transport framework di OpenDDS per realizzare l’operazione di plug-in nella piattaforma. 112 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Le classi realizzate sono mostrate nel diagramma in fig. 53 e sono essenzialmente quelle indicate nell’appendice, A dove è descritto il procedimento generale per la realizzazione di un plug-in di trasporto. Le classi sono : ¾ ErasureProtocolConfiguration: si occupa della configurazione dell’oggetto protocollo mediante lettura dei parametri dai files di configurazione di publisher e subscriber; nella sua versione definitiva si occuperà dell’inizializzazione di tutti i parametri dei codici e degli indirizzi di rete; ¾ ErasureProtocolLoader: definisce l’oggetto preposto al caricamento della libreria di trasporto da parte delle applicazioni; ¾ ErasureProtocolFactory: è la factory specializzata allo scopo di istanziare oggetti di trasporto di tipo ErasureProtocolTransport; ¾ ErasureProtocolTransport: deriva dal TransportImpl e definisce un oggetto concreto di trasporto che utilizza gli oggetti DataLink per l’invio e la ricezione dei dati;esso si occupa inoltre di recuperare i parametri ¾ ErasureProtocolDataLink:si occupa di gestire il set di link dell’applicazione che usa il protocollo mediante gli oggetti di Send e ReceiveStrategy; ¾ ErasureProtocolSendStrategy/ReceiveStrategy: derivano dalle classi astratte del framework con lo stesso nome e ne implementano i metodi astratti di send_bytes e receive_bytes meccanismo di trasporto;includono necessari al funzionamento del un puntatore alla classe ErasureProtocolSocket; ¾ ErasureProtocolSocket: in questa versione del prototipo l’EventHandler preposto alla gestione degli eventi di invio e ricezione è realizzato da questa 113 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS classe derivata da ACE_Event_Handler[34] che realizza i metodi di send_bytes e receive_bytes utilizzati dalle classi Send e Receive Strategy. In particolare, in questa versione iniziale del prototipo l’EventHandler inizialmente concepito è stato momentaneamente accantonato, realizzando una logica di invio più semplice basata su una socket a datagrammi. 114 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Conclusioni e sviluppi futuri I risultati ottenuti in sede sperimentale circa l’utilizzo di schemi di affidabilità FEC in middleware di tipo DDS mostrano come tali schemi, in determinate condizioni di funzionamento della rete, possano fornire una tolleranza alle perdite ed una prevedibilità dei tempi di consegna in grado di soddisfare i requisiti dei sistemi mission-critical operanti su scala geografica. La prevedibilità dello schema FEC si è mostrata superiore sia a quella della soluzione ibrida che a quella del protocollo basato su ARQ utilizzato dal DDS. L’approccio inizialmente utilizzato prevedeva l’utilizzo dei FEC a livello applicativo, sovrapposti cioè allo strato del DDS. Tale approccio, pur offrendo il pregio della semplicità implementativa, ha esibito una elevata dipendenza dal DDS stesso. Inoltre, operando al di sopra dello strato DDS non è stato possibile realizzare una reale integrazione della soluzione FEC con il middleware. Si è dunque operato un cambio di approccio, iniziando la realizzazione di un protocollo di trasporto integrante schemi FEC per garantire l’affidabilità. Operando al livello trasporto è possibile definire l’algoritmo di recupero dalle perdite in maniera completamente indipendente dal DDS. 115 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Utilizzando il supporto offerto dalla piattaforma OpenDDS è stato possibile realizzare un plug-in per l’integrazione del prototipo nella piattaforma stessa. Le evoluzioni future del presente lavoro riguardano lo sviluppo del prototipo del protocollo che dovrebbe portare alla realizzazione di un protocollo di trasporto completo FEC-based per middleware DDS. In tale protocollo dovrebbero inoltre essere integrate differenti librerie di codici FEC (es. ReedSolomon,LDPC) per offrire capacità di adattamento alle necessità delle differenti applicazioni. Resta inoltre da testare la scalabilità della soluzione FEC al crescere del numero dei subscriber, avendo effettuato in questa sede test basati su un unico publisher ed un unico subscriber. 116 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 117 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Appendice A Realizzazione di un plug-in di trasporto in OpenDDS A.1 Utilizzo del Transport Framework di OpenDDS In questo paragrafo si illustreranno i passaggi fondamentali per la realizzazione di un plug-in per un protocollo di trasporto mediante le classi fornite dal transport framework. A tal scopo saranno utilizzati gli esempi del protocollo Simple Udp di Open DDS e del plugin C++ per il protocollo Ricochet[9]. La classe astratta TransportImpl definisce le funzionalità che un oggetto concreto di trasporto deve offrire alle applicazioni. Il diagramma della classe è il seguente: 118 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Figura 55 - La classe TransportImpl La classe include metodi per l'invio e la ricezione dei dati,la configurazione del trasporto,la gestione dei datalinks e delle associazioni tra oggetti locali e remoti. I metodi astratti fondamentali che devono essere implementati dalle classi derivate allo scopo di realizzare un oggetto trasporto concreto sono: z find_or_create_datalink(): é un metodo protetto richiamato dal metodo pubblico reserve_datalink,il quale restituisce un puntatore ad un oggetto DataLink(si anticipa brevemente che gli oggetti DataLink sono gli oggetti che incapsulano le logiche di invio e ricezione dei messaggi e che si fanno carico di stabilire la 119 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS connessione tra le entità remote dell'applicazione);tale metodo deve reperire(parte find del metodo)un datalink esistente oppure,se necessario,crearne uno(parte create) tenendo presente il valore del paramentro di ingresso connect_as_publisher: se tale parametro ha valore '1' allora sarà necessario creare una connessione attiva per conto di un publisher verso un subscriber remoto,mentre se ha valore '0' sarà necessario creare una connessione passiva lato subscriber . (Es:per Ricochet e SimpleTcp la parte find è realizzata mediante il metodo find(ACE_INET_Addr) richiamato sulla struttura dati AddrLinkMap che altro non è che una tabella hash che utilizza come chiave l'ACE_INET_Addr associato al particolare DataLink,che costituisce dunque il value della struttura hash). (NB : si noti che nella parte create(),che viene eseguita solo se la parte find non restituisce DataLinks , dopo la creazione del DataLink bisogna effettuare il binding con l'indirizzo IP-nel caso di Ricochet ad esempio è l'indirizzo del gruppo-tramite il metodo bind(key,value) invocato sulla struttura hash) z configure_i():è un metodo protetto invocato dal metodo pubblico configure();consente di effetturare delle operazioni aggiuntive all'atto della configurazione del protocollo(si noti che non è possibile eseguire l'attachment di alcun oggetto di trasporto non configurato da parte di publishers o subscribers,dunque l'operazione di configurazione è da invocare appena dopo la creazione dell'oggetto di trasporto concreto). z shutdown_i/connection_info_i/release_datalink_i: sono metodi invocati dai quasi-omonimi (non presentano la “i”) metodi pubblici che permettono allo sviluppatore di aggiungere ulteriori operazioni ritenute necessarie. Un oggetto fornente un servizio di trasporto deve dunque derivare da questa classe,TransportImpl, deve implementarne i metodi astratti(principalmente 120 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS find_or_create_datalink) e può poi fornire ulteriori metodi specifici del protocollo implementato. Ad esempio,il plug-in del protocollo Ricochet per OpenDDS aggiunge il metodo deliver_sample per gestire i dati in arrivo dalla rete. Le applicazioni utilizzano poi i servizi di trasporto senza tener conto delle particolari implementazioni poiché accedono ad oggetti della classe base. Inoltre è necessario eseguire l'attachment dell'oggetto di trasporto ad un oggetto di tipo TransportInterface. Tale classe definisce i metodi effettivamente accedere ai servizi del livello trasporto e costituisce il usati dalle entità del DCPS per meccanismo attraverso il quale l'applicazione invia i dati ai sottoscrittori e principale gestisce le associazioni tra pubblicazioni e sottoscrizioni. La classe fornisce metodi per eseguire l'attachment ed il detachment degli oggetti concreti di protocollo(attach_trasport è quello invocato dall'applicazione per collegare il trasporto alla particolare entità DCPS) , metodi per gestire l'invio di data samples e di messaggi di controllo( send() e send_control() ) e per gestire pubblicazioni e sottoscrizioni(add_subscriptions()/add_publications()). Figura 56 - La classe TransportInterface 121 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Vale la pena notare che in OpenDDS le implementazioni delle entità DCPS Publisher e Subscriber,definite nello standard DDS mediante le omonime interfacce, derivano anche da TransportInterface,ed è dunque tramite esse che si effettua l'attachment del protocollo di trasporto all'applicazione. Figura 57 - Publisher, Subscriber e TransportInterface All'interno dell'oggetto di trasporto è necessario implementare una classe derivata da DataLink,classe del framework che incapsula le logiche di invio e ricezione dei messaggi ,definite a loro volta tramite le classi TransportSendStrategy e TransportReceiveStrategy. Gli oggetti di tipo DataLink delegano in sostanza l'invio dei data samples agli oggetti di tipo TransportSendStrategy e la loro ricezione, nonché il delivery dei messaggi all'applicazione, agli oggetti di tipo TransportReceiveStrategy. 122 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Un oggetto DataLink è sempre creato da un oggetto di tipo TransportImpl il cui puntatore è passato come argomento al costruttore del DataLink. Figura 58 - Classe DataLink L'oggetto derivato da DataLink costituisce, accanto agli oggetti TransportSendStrategy e TransportReceiveStrategy, il “cuore” della logica di qualsiasi protocollo di trasporto: è in queste classi che vanno definite le dinamiche comportamentali del protocollo rispetto all'invio e la ricezione dei messaggi,alla eventuale ritrasmissione,alla eventuale necessità di effettuare una connessione (Es: il plug-in per TCP di OpenDDS utilizza un oggetto SimpleTcpConnection per gestire la connessione e 123 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS le disconnessioni,tale oggetto inoltre concettualmente sostituisce l'astrazione della Socket; Ricochet incapsula l’oggetto RicochetIF, che è l’interfaccia reale del protocollo, all’interno del RicochetDataLink). Le classi derivate utilizzeranno il metodo protetto start() della classe base DataLink per comunicare alla classe base che l'oggetto datalink concreto è ora “connesso” e per invocare l'attivazione delle strategie di invio e ricezione. Normalmente l'invocazione del metodo start (i cui argomenti sono proprio i puntatori alle strategie di invio e ricezione)avviene all'interno di un metodo connect() opportunamente definito dalla classe derivata. Ad es. nel caso di Ricochet: int OpenDDS::DCPS::RicochetDataLink::connect(bool is_publisher) {...................................... start (this->send_strategy_, this->receive_strategy_); …………… } (NB:RicochetDataLink deriva ovviamente da DataLink). Anche i protocolli TCP ed UDP implementati in OpenDDS aggiungono una funzione connect() alle proprie implementazioni del DataLink per effettuare l'attivazione della Send e Receive Strategy. Oltre al già citato connect, i metodi fondamentali degli oggetti di tipo DataLink sono: z make_reservation(): questo metodo,esistente in due versioni diverse a seconda sia il publisher o il subscriber ad essere remoto,è invocato dagli oggetti TransportImpl per assegnare un certo DataLink ad una coppia publisher-subscriber; z send_start(),send(),send_stop(): questi metodi sono invocati dall'oggetto 124 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS TransportInterface che referenzia il particolare DataLink per inviare un data sample o un messaggio di controllo ; z remove_sample(): è una sorta di undo_send() in quanto rimuove dal DataLink ogni traccia del messaggio passato come primo argomento; Per definire le strategie di invio e ricezione dei messaggi è necessario effettuare l'overriding di alcuni metodi delle classi TransportSendStrategy e TransportReceiveStrategy. Definita una classe derivata da TransportReceiveStrategy (ad es., SimpleUdpReceiveStrategy) ridefiniamo: z receive_bytes (): metodo da definire per prelevare i bytes in ingresso. z deliver_sample (): metodo di call-back invocato per effettuare la consegna dei messaggi all’oggetto TransportImpl. z start_i (): metodo per attivare la ricezione dei dati. z stop_i (): metodo per fermare la ricezione dei dati. Definita una classe derivata da TransportSendStrategy(Ad es,SimpleUdpSendStrategy),ridefiniamo: z stop_i (): metodo per arrestare l'invio dei dati. z send_bytes () :metodo da implementare per gestire l'invio dei dati. z get_handle () :metodo che restituisce un handle z send_bytes_i (): metodo invocato da send_bytes() : effettua il lavoro reale di invio dei bytes. É inoltre necessario implementare una classe del tipo MySocket(Ad es. 125 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS SimpleUdpSocket) che derivi da ACE_Event_Handler [33](cioè un gestore degli eventi) e che offra i seguenti metodi: z get_handle (): metodo di cui effettuare l'ovverride perchè ritorni un handle appropriato del gestore eventi z handle_input ():metodo di cui effettuare l'ovverride per passare il controllo alla receive strategy z handle_close ():metodo di cui effettuare l'override per gestire la chiusura della socket z set_receive_strategy ():aggiunta di questo metodo per settare la receive strategy. z remove_receive_strategy ():aggiunta di questo metodo per rimuovere la receive strategy z open_socket ():aggiunta di questo metodo per aprire la socket z close_socket ():aggiunta di questo metodo per chiudere la socket z send_bytes():aggiunta di questo metodo per l'invio dei bytes dei dati. Inoltre l'oggetto MySocket normalmente conterrà nella struttura dati una socket vera e propria fornita dall'ACE sottostante(ad es,SimpleUdpSocket ha una variabile membro private del tipo ACE_SOCK_Dgram,cioè una socket a datagrammi incapsulata in una struttura ad oggetti dell'orb). Più in generale, è necessario implementare un gestore degli eventi di invio e ricezione dei bytes di dati che fornisca tali servizi ai metodi receive_bytes e send_bytes delle Receive e Send Strategy. Le relazioni tra le classi si possono così schematizzare(anche se sono possibili variazioni di questo schema ): 126 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Figura 59 - DataLink,SendStrategy ,ReceiveStrategy e Socket L'implementazione dei suddetti metodi dipende dal protocollo che si intende realizzare. Ad esempio, il SimpleUDP di OpenDDS implementa il metodo send_bytes() della SendStrategy semplicemente richiamando il metodo della TransportSendStrategy non_blocking_send()(il quale a sua volta richiama il classe base metodo send_bytes_i(),da implementare nella classe derivata,e che risulta essere quindi ,in ultima istanza,l'unico metodo che realizza l'invio effettivo dei dati;esso infatti è invocato da tutti i metodi di invio definiti nella TransportSendStrategy): ssize_t OpenDDS::DCPS::SimpleUnreliableDgramSendStrategy::send_bytes(const iovec iov[], int n, int& bp) { ............................ return this->non_blocking_send (iov, n, bp); } 127 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Mentre la send_bytes_i() è implementata semplicemente richiamando il metodo di invio dell'oggetto SimpleUdpSocket: ssize_t OpenDDS::DCPS::SimpleUnreliableDgramSendStrategy::send_bytes_i (const iovec iov[], int n) { //socket_ è il puntatore all'oggetto SimpleUdpSocket contenuto nell'oggetto SimpleUnrealiableDgramSendStrategy return this->socket_->send_bytes(iov, n, this->remote_address_); } La send_bytes della socket è in sostanza una send() richiamata sull'oggetto ACE_SOCK_Dgram incapsulato dalla SimpleUdpSocket(ACE_SOCK_Dgram è in sostanza la struttura dell'orb ACE sottostante che wrappa la socket del sistema operativo): ACE_INLINE ssize_t OpenDDS::DCPS::SimpleUdpSocket::send_bytes(const iovec iov[], int n, const ACE_INET_Addr& remote_address) { ........................................ return this->socket_.send(iov,n,remote_address); } La struttura iovec iov[] passata come parametro di ingresso contiene i riferimenti all’array di buffer istanziati dalla classe astratta del framework TransportSendStrategy e contengono la sequenza di bytes dei dati della pubblicazione dell’applicazione publisher. 128 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Nel caso del protocollo Ricochet invece la send_bytes della RicochetSendStrategy non utilizza la RicochetSocket(,utilizza invece il metodo di invio definito dall'oggetto RicochetIF ,che all'algoritmo di trasporto implementato da Ricochet: rappresenta il punto di accesso ssize_t OpenDDS::DCPS::RicochetSendStrategy::send_bytes(const iovec iov[], int n, int& bp) {.......................... this->ricochet_->send (byte_ptr, bytes_len); ..................... } Dove “ricochet” è il puntatore all'oggetto di tipo RicochetIF utilizzato dalla RicochetSendStrategy; Quindi il diagramma delle classi di cui sopra nel caso del protocollo Ricochet è leggermente diverso,includendo anche la classe RicochetIF che effettua le reali operazioni di invio e ricezione secondo la logica definita dall'algoritmo: Figura 60 - Ricochet :classi per l'invio e la ricezione dei dati 129 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Le RicochetSocket non vengono dunque utilizzate in quanto l'invio e la ricezione dei messaggi sono gestiti tramite l'oggetto RicochetIF(NB:nella libreria che implementa l’algoritmo di Ricochet è comunque presente un gestore degli eventi di invio e ricezione che è funzionalmente analogo agli EventHandler degli altri protocolli). L'invio avviene ,come detto in precedenza, tramite il metodo send() dell'oggetto RicochetIF usato dalla RicochetSendStrategy,mentre per la ricezione ed il delivery dei messaggi si utilizza un meccanismo di callback: 1. la RicochetReceiveStrategy invoca il metodo join() di RicochetIF per inserire nel gruppo multicast di Ricochet l'oggetto RicochetCallback a cui è associato(tale oggetto è un MessageHandler) ; 2. Quando ci sarà un messaggio di cui effettuare il delivery,RicochetReceiveStrategy invocherà il deliverSample() dell'oggetto RicochetCallback che attiverà le operazioni di ricezione e delivery da parte dell'oggetto RicochetReceiveStrategy cui è associato. Riepilogando,un oggetto concreto che fornisca un servizio di trasporto per OpenDDS deve essere un oggetto di una classe derivata da TransportImpl,la quale necessita a sua volta di oggetti DataLink ,Receive e Send Strategy e gestori degli eventi ( opportunamente specializzati a seconda del protocollo. Resta da chiarire come avvenga il passaggio dei dati dall’applicazione DDS al livello di trasporto. Il diagramma di sequenza illustrato nella figura 62 ricostruisce tale passaggio. L’interazione tra le classi avviene nelle seguenti fasi: 130 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 1) All’atto della pubblicazione l’applicazione publisher invoca una write() sull’oggetto DataWriter specializzato per il particolare Topic passando come argomento di ingresso un puntatore all’oggetto che rappresenta la publlicazione; tale DataWriter è generato automaticamente dalla pubblicazione del file .idl in cui si definisce la struttura dati della pubblicazione. 2) Il DataWriter utilizza il metodo dds_marshal() per costruire un oggetto di tipo DataSample a partire dall’oggetto della pubblicazione passato come parametro di ingresso(NB: il DataSample è un alias che individua un Ace_Message_Block, la classe per la gestione dei messaggi in ACE) 3) Il DataWriter invoca poi una write() sull’oggetto di tipo DataWriterImpl (implementazione dell’interfaccia DataWriter dello standard DDS) in esso incapsulato passando un puntatore all’oggetto DataSample creato al passaggio precedente; 4) Il DataWriterImpl invoca il proprio metodo create_sample_data_message() per creare un oggetto DataSample a partire dai dati individuati dal riferimento avuto in ingresso al passaggio precedente; 5) Il DataWriterImpl accoda l’oggetto appena creato alla struttura dati dell’oggetto WriterDataContainer (oggetto contenuto nel DataWriterImpl che gestisce le strutture dati dei samples inviati e da inviare)mediante invocazione del metodo enqueue(); 6) Il DataWriterImpl segnala la disponibilità di un nuovo sample al livello di trasporto,invocando il metodo data_available() dell’oggetto TransportInterface (NB: poiché, come visto, in OpenDDS le entità DCPS Publisher e Subscriber derivano anche da TransportInterface, tale invocazione avviene sull’oggetto Publisher che contiene il DataWriter stesso che invoca il metodo); 131 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS 7) L’oggetto TransportInterface richiede il DataSample segnalato all’oggetto DataWriterImpl che ne ha segnalato la disponibilità mediante il metodo get_unsent_data(); 8) Il DataWriterImpl a sua volta recupera tale DataSample dall’oggetto WriterDataContainer invocando il metodo omonimo e lo restituisce all’oggetto TransportInterface (NB: la restituzione del DataSanoke non è raffigurata per non appesantire eccessivamente il diagramma); 9) L’oggetto TransportInterface invoca il proprio metodo protetto send() per effettuare l’invio del DataSample; 10) Il metodo send() a sua volta invoca il metodo send() dell’oggetto DataLink riferito da TransportInterface; 11) Il DataLink, come detto in precedenza, delega l’invio dei dati alla classe TransportSendStrategy, di cui invoca il metodo send(), passando come argomento di ingresso il DataSample contenente i dati della pubblicazione; 12) Nel metodo send() di TransportSendStrategy viene aggiunto un header di livello trasporto al DataSample ed invocato il metodo send_packet() della classe stessa; 13) Il metodo send_packet() costruisce una struttura dati di tipo iovec* contenente i dati del DataSample ricevuto in ingresso rappresentati mediante un semplice array di bytes;esso invoca successivamente per l’invio di tale array il metodo send_bytes() della classe TransportSendStrategy passando la struttura iovec appena creata come paramentro di ingresso; 14) come visto in precedenza,il metodo send_bytes() della classe TransportSendStrategy invoca il metodo omonimo della classe derivata dello specifico protocollo, nel quale devono essere implementati i meccanismi di invio effettivo dei dati al destinatario. 132 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS La ricezione dei messaggi avviene con una sequenza di operazioni analoga, partendo dalla ricezione dei dati come sequenza di bytes acquisiti dalla rete, risalendo fino alle classi di livello trasporto ed applicativo. 133 Tecniche per l’affidabilità delle comunicazioni basate su codici FEC in piattaforme middleware OMG DDS Figura 62 - Passaggio dei dati dall'applicazione al trasporto 134 135 Ringraziamenti Questo è per me il paragrafo più bello ed insieme difficile da scrivere. In questi lunghi anni di università (adesso non stiamo lì a contare quanti…) la mia vita ha incrociato quella di numerosissime persone, così tante che sarebbe un’impresa davvero ardua ricordarle tutte e descrivere nello spazio di poche righe il significato dei momenti che con esse ho condiviso ed il contributo che esse hanno realmente dato alla crescita dell’uomo Angelo prima che dello studente Angelo. Altrettanto arduo sarebbe evitare di stilare una sorta di graduatoria, una classifica che renda più merito a qualcuno piuttosto che ad altri, magari basata sul numero di parole da me spese per ognuno. Pertanto, non troverete tanti nomi tra queste parole, e sono sicuro che le poche eccezioni mi saranno perdonate dai numerosissimi “assenti”. Sono altrettanto sicuro del fatto che, pur non trovando il proprio nome, le persone che leggeranno queste parole riusciranno a ritrovarsi in esse, nel modo più intimo possibile, come piace a me. Un ringraziamento particolare va ad un’eccezione, la mia famiglia, cui questo lavoro è dedicato. In questi anni mio padre, mia madre, Maria e Luciano sono stati un punto di riferimento insostituibile, un sostegno continuo sia dal punto di vista economico (principalmente mamma e papà :-) ) che morale. Difficilmente sarei arrivato a questo 136 risultato senza anche uno soltanto di loro, nonostante in questi anni non abbia fatto troppo per dimostrare l’importanza che per me hanno avuto durante questo percorso. Molto di quel che sono ora (e che sembra piacere!) è merito loro, e questo è un contributo che nessuna dedica o nessun ringraziamento potrà mai ripagare abbastanza. Ovviamente anche il resto della mia famiglia rientra in questi ringraziamenti, ma nonni, zii, cugini e tutti i familiari che mi hanno sempre stimato e appoggiato durante le mie avventure/sventure universitarie costituiscono, per numero, una sorta di grande tribù che non riuscirei mai ad incastrare in queste poche pagine. Grazie, a tutti voi. Come ulteriore eccezione, vorrei ringraziare chi mi ha seguito da vicino nello sviluppo di questo lavoro, i miei correlatori Ing. Christian Esposito e Ing. Generoso Paolillo, per me semplicemente Chris e Gene, per la fiducia che hanno continuato a mostrarmi fino alla fine, per il sostegno offertomi e per il contributo finale che hanno dato alla mia crescita come studente. Mi preme poi ricordare i due docenti che più hanno contribuito alla mia formazione. Ringrazio dunque il prof. Cotroneo per la stima incondizionata mostratami in questi anni e per aver reso, con la sua simpatia, più sopportabili le lunghe giornate trascorse in laboratorio durante il lavoro di tesi. Un ringraziamento sentito va al prof. Russo, soprattutto per aver aiutato quella matricola un po’ spaesata che iniziò questa avventura a capire che il corso di studi scelto poteva esser quello giusto, e per aver contribuito in maniera decisiva, nel corso degli anni successivi, alla mia maturazione come studente. Un pensiero va poi a tutti coloro che, conosciuti all’università, hanno affrontato insieme a me almeno una parte del mio percorso di studente. Tra questi è incluso anche chi con me ha soltanto preso un caffè, scambiato una chiacchiera, giocato a pallone o in altro modo contribuito a rendere più piacevole questo percorso di per sé denso di 137 difficoltà, regalandomi momenti di allegria e di confronto intellettuale. Durante questi anni ho spesso dato l’impressione, a tanti, di non dare importanza eccessiva a tutto questo, e mi piace pensare che qualcuno potrà finalmente avere il riconoscimento che merita leggendo queste parole. Allo stesso modo mi hanno aiutato tutti gli extra-ingegneri (mi metto anche ad inventare parole ora…), alcuni dei quali fanno parte della mia vita da tempo immemore, e che hanno avuto il merito unico di tenere sempre vive parti di me importanti quanto la “parte ingegnera”. Sarebbe per me impossibile immaginare la mia vita senza di voi, siete importanti già ora e posso ben sperare che lo sarete anche in futuro. Qualcuno di voi forse storcerà un po’ il naso all’inizio non leggendo il proprio nome, ma conto, come ho fatto in tutti questi anni (e per qualcuno, soprattutto negli ultimi mesi ;-) ), sulla vostra capacità di sopportare il mio carattere particolare. Un pensiero agrodolce va infine a tutte le persone che hanno fatto parte della mia vita anche solo per brevi periodi e che ora, per un motivo o per un altro, sono su binari paralleli. Probabilmente esse non leggeranno mai queste parole, ma so bene che senza alcune di loro non sarei qui ora e non sarei la persona che sono. Grazie. 138 139 Bibliografia [1] RTI 2006 “RTI Data Distribution Service - The Real-Time Publish-Subscribe Middleware User’s Manual” [2] Object Computing Inc. 2007 “TAO Developers guide Excerpt : chapter 31-Data Distribution Service ” [3] OCIWeb 2008 www.opendds.org [4] G. Pardo-Castellote 2003 “OMG Data-Distribution Service:Architectural Overview”,In Proceedings of the 23rd International Conference on Distributed Computing System,5 2003 [5] Object Management Group 2007 “Data Distribution Service for Real Time Systems”,OMG Specification version 1.2, http://www.omg.org/technology/documents/dds_spec_catalog.htm [6] A.Corsaro,L.Querzoni,S,Scipioni,S.Tucci Piergiovanni e A.Virgillito, 2006 “Quality of service in Publish/Subscribe Middleware”. Global Data Management , 5 2006, . [7] L.Rizzo, 1997 “Effective Erasure Codes for Reliable Communication Protocols”. 140 ACM SIGCOMM Computer Communication Review, 27(2):24–36, Aprile 1997 [8] D.Li e D.R.Cheriton 1999 “Evaluating the Utility of FEC with Reliable Multicast” In Proceedings of Seventh International Conference on Network Protocols (ICNP), pp. 97-105, Ottobre-Novembre, 1999. [9] M. Balakrishnan, K.P. Birman, A.Phanishayee, S.Pleisch 2007 “Ricochet: Lateral Error Correction for Time-Critical Multicast”. In NSDI 2007: Fourth Usenix Symposium on Networked Systems Design and Implementation, 2007. [10] L.Rizzo,L. Vicisano 1997 “A Reliable Multicast data Distribution Protocol based on software FEC techniques (RMDP)”,ACM SIGMOBILE Mobile Computing and Communications Review, 2(2):23–31, Aprile 1998 [11] M. Balakrishnan, S. Pleisch, K. Birman. 2005 ” Slingshot: Time-critical multicast for clustered applications.” In IEEE Network Computing and Applications [12] J. Nonnenmacher, E. Biersack, and D. Towsley. 1997 “Paritybased loss recovery for reliable multicast transmission”. In Proceedings of the ACM SIGCOMM ’97 conference, pg. 289–300, New York, NY, USA, 1997. ACM Press. [13] J. W. Byers, M. Luby, M. Mitzenmacher, A. Rege. 1998 “A digital fountain approach to reliable distribution of bulk data”. In ACM SIGCOMM ’98 Conference, pp. 56–67,New York, NY, USA,1998. ACM Press [14] M. Luby,M. Mitzenmacher,M. A. Shokrollahi, D. Spielman, V. Stemann, 1997 “Practical loss-resilient codes,” in Proc. 29th Annu. ACM Symp. Theory of Computing, 1997, pp. 150–159., 141 [15] L. Vicisano, L. Rizzo, J. Crowcroft. 1998 “TCP-like congestion control for layered multicast data transfer.” In Proc. of INFOCOM ’98, San Francisco, Aprile 1998 [16] Jim Gemmell 1997, “Scalable Reliable Multicast Using Erasure-Correcting Resends”, Microsoft Research Technical Report, MSR-TR-97-20, 30 giugno 1997. [17] M. Luby, L. Vicisano, J. Gemmell, L. Rizzo, M. Handley, J. Crowcroft.2002” The Use of Forward Error Correction (FEC) in Reliable Multicast”. RFC Editor ref:RFC3453, 2002. [18] S. Floyd, V. Jacobson, C. Liu, S. McCanne, L. Zhang, 1997 "A Reliable Multicast Framework for Light-weight Sessions and Application Level Framing", IEEE/ACM Transaction on Networking, Dic.1997 vol.5 no.6 p.784-803 [19] L.Berardi 1994 “Algebra e teoria dei codici correttori”,Franco Angeli ed. [20] J.H. van Lint 1992 “Introduction to Coding Theory”,2nd ed. Springer-Verlag [21] L.Rizzo 1997 “On the feasibility of software FEC”,DEIT Technical Report LR970131 [22] L. Rizzo. 1997 “Effective Erasure Codes for Reliable Computer Communication Protocols”. ACM SIGCOMM Computer Communication Review, 27(2):24–36, Aprile1997 [23] J.S. Plank and Y. Ding. 2005 “Note: Correction to the 1997 tutorial on ReedSolomon Coding”. Software Practice & Experience, 35(2):189194,Febbraio 2005 142 [24] R.L. Collins and J.S. Plank. 2005 “Assessing the Performance of Erasure Codes in the Wide-Area”. Proceedings of the IEEE International Conference on Dependable Systems and Networks (DSN 2005), pp. 182–187, Giugno-Luglio 2005. [25] Northrop, L., Feiler, P., Gabriel, R. P., Goodenough, J., Linger, R., Longstaff, T., et al. 2006 “Ultra-Large-Scale Systems: The Software Challenge of the Future”. Pittsburgh, PA: Software Engineering Institute, Carnegie Mellon University. http://www.sei.cmu.edu/uls/uls.pdf [26] J. S. Plank. 1997 “A tutorial on Reed-Solomon coding for fault-tolerance in RAID-l ike systems.” Software – Practice & Experience, 27(9):995–1012, Settembre 1997. [27] Bernhard M. J. Leiner 2005 "LDPC codes - a Brief Tutorial", Aprile 2005. [28] Gordon McDonald 2006 “Low Density Parity Check Codes”,21 Aprile 2006 [29] R. Baldoni, R. Beraldi, S. Tucci Piergiovanni, A. Virgillito 2004 “Measuring notification loss in publish/subscribe communication systems” In Proceedings of the 10th International Symposium Pacific Rim Dependable Computing (PRDC ’04) [30] P.Th. Eugster, P. A. Felber, R. Guerraoui, and A. Kermarrec. 2003 “The many faces of publish/subscribe.” ACM Computing Surveys (CSUR), 35(2):114–131, Gennaio 2003. [31] R. Joshi , G. Pardo-Castellote 2006 “OMG's Data Distribution Service Standard: An overview for real-time systems”, http://www.ddj.com/architect/194900002 143 [32] J.S. Plank 2007 “Jerasure: A Library in C/C++ Facilitating Erasure Coding for Storage Applications.” Technical Report UT-CS-07-603, Department of Computer Science,University of Tennessee, Settembre 2007, http:/www.cs.utk.edu/~plank/plank/papers/CS-07-603.html [33] D. Schmidt, ACE – the Adaptive Communication Environment http://www.cse.wustl.edu/~schmidt/ACE.html [34] M. Mitchell, J. Oldham, Alex Samuel 2001 “Advanced Linux Programming”, ed. Sams Publishing [35] D.C. Schmidt, S.D. Huston 2002 “C++ Network Programming: Mastering Complexity Using ACE and Patterns”, ed. Addison-Wesley Longman [36] E. N. Gilbert, 1960 “Capacity of a Burst-Noise Channel,” Bell System Technical J Journal, vol. 39, pp. 1253–265,Sep 1960. [37] S.Guruprasad, R. Ricci, J. Lepreau 2005 “Integrated Network Experimentation using Simulation and Emulation”, In Proceedings of the First International Conference on Testbeds and Research Infrastructures for the DEvelopment of NeTworks and COMmunities (TRIDENTCOM’05) [38] Dilip V. Sarwate, Naresh R. Shanbhag 2001 “High-Speed Architectures for Reed– Solomon Decoders”,In IEEE Transactions on Very Large ScaleIintegration (VLSI) systems, vol. 9, no. 5, Ottobre 2001 144 [39] J. P. Macker 1997 “Reliable multicast transport and integrated erasure-based forward error correction”, In Proceedings IEEE MILCOM, p. 973-7 vol.2, Novembre 1997 [40] G. Coulouris, J. Dollimore , T. Kindberg 2005 "Distributed Systems: Concept and Design" 4th ed. 145