31.05.2013 Views

UNIVERSITA' DEGLI STUDI DI ROMA TOR VERGATA - TECA ELIS

UNIVERSITA' DEGLI STUDI DI ROMA TOR VERGATA - TECA ELIS

UNIVERSITA' DEGLI STUDI DI ROMA TOR VERGATA - TECA ELIS

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

UNIVERSITA’ <strong>DEGLI</strong> <strong>STU<strong>DI</strong></strong> <strong>DI</strong> <strong>ROMA</strong><br />

<strong>TOR</strong> <strong>VERGATA</strong><br />

FACOLTA’ <strong>DI</strong> INGEGNERIA<br />

Corso di Laurea Specialistica in Ingegneria Informatica<br />

Tesi di Laurea<br />

“SATSQUID: UN SISTEMA <strong>DI</strong> PROXY CACHING<br />

SATELLITARE”<br />

Relatore:<br />

Chiar.mo Prof.<br />

Salvatore Tucci<br />

Correlatore:<br />

Ing.<br />

Valeria Cardellini<br />

Laureando:<br />

ANNO ACCADEMICO 2004/2005<br />

Marco Crucianelli


Alla mia famiglia, che più di tutti mi ha aiutato e sostenuto<br />

nei momenti difficili, ma soprattutto ha sempre creduto in me.<br />

Alla mia Giorgia, grazie di avermi fatto sentire che c’eri.<br />

“La teoria è quando si sa tutto e niente funziona. La pratica è<br />

quando tutto funziona e nessuno sa il perchè. In questo<br />

caso abbiamo messo insieme la teoria e la pratica: non c'è<br />

niente che funziona...e nessuno sa il perchè!”<br />

Albert Einstein


Sommario<br />

Sommario<br />

Indice delle figure...........................................................................................................4<br />

Indice delle tabelle..........................................................................................................8<br />

Introduzione....................................................................................................................9<br />

1 Caching.................................................................................................................12<br />

1.1 Localizzazione di un proxy server..................................................................13<br />

1.1.1 Reverse proxy........................................................................................13<br />

1.1.2 Interception proxy..................................................................................14<br />

1.2 Politiche di rimpiazzamento...........................................................................15<br />

1.2.1 Algoritmi di rimpiazzamento deterministici...........................................16<br />

1.2.2 Algoritmi di rimpiazzamento casuali......................................................20<br />

1.3 Caching di contenuti multimediali.................................................................20<br />

1.3.1 Segmentazione e prefix caching.............................................................21<br />

1.3.2 Caching dinamico..................................................................................22<br />

1.3.3 Codifica a livelli....................................................................................23<br />

1.4 Caching cooperativo......................................................................................24<br />

1.4.1 Internet Cache Protocol (ICP)................................................................24<br />

1.4.2 Cache Array Resolution Protocol (CARP)..............................................25<br />

1.4.3 Cache Digest Protocol (Digest)..............................................................26<br />

1.4.4 Web Cache Coordination Protocol (WCCP)...........................................26<br />

2 Connessioni satellitari...........................................................................................27<br />

2.1 Problematiche di una connessione satellitare..................................................27<br />

2.2 Soluzioni possibili.........................................................................................28<br />

2.2.1 AI3 Network: Adaptive WWW Caching................................................28<br />

2.2.2 Hughes Network Systems: Cumulative Caching.....................................31<br />

2.2.3 INTELSAT Internet Delivery System (IDS)...........................................33<br />

2.2.4 SatCAST: multicast via satellite per applicazioni web............................36<br />

2.3 Considerazioni sulle soluzioni proposte.........................................................40<br />

3 Progettazione e architettura del sistema SatSquid..................................................42<br />

1


Sommario<br />

3.1 Le scelte progettuali.......................................................................................42<br />

3.1.1 La scelta del proxy: Squid......................................................................44<br />

3.1.2 Due livelli di caching.............................................................................45<br />

3.1.3 Due istanze di Squid..............................................................................46<br />

3.1.4 Pushing vs. prefetching..........................................................................48<br />

3.1.5 Gestione del prefetching ........................................................................50<br />

3.1.6 Indirizzamento delle richieste.................................................................50<br />

3.1.7 Dimensionamento hardware...................................................................52<br />

3.2 Le possibili architetture.................................................................................54<br />

3.2.1 Pushing vs. prefetching..........................................................................55<br />

3.2.2 Indirizzamento delle richieste.................................................................59<br />

3.2.3 Mirroring separato.................................................................................65<br />

3.3 Architettura scelta: vantaggi e limiti..............................................................66<br />

4 Strumenti per la realizzazione di SatSquid.............................................................69<br />

4.1 Squid.............................................................................................................69<br />

4.1.1 Configurazione iniziale..........................................................................69<br />

4.1.2 ACL.......................................................................................................71<br />

4.1.3 File di log..............................................................................................74<br />

4.1.4 Configurazioni varie..............................................................................78<br />

4.2 SNMP...........................................................................................................80<br />

4.3 MRTG e RRDTOOL.....................................................................................83<br />

4.4 Calamaris......................................................................................................87<br />

5 Progettazione e implementazione dei moduli software di SatSquid........................89<br />

5.1 Architettura software di SatSquid..................................................................89<br />

5.2 SPD (Satelitte Prefetching Daemon)..............................................................92<br />

5.2.1 Funzionamento......................................................................................93<br />

5.2.2 Implementazione....................................................................................96<br />

5.3 MMI (Mirroring Management Interface) .....................................................103<br />

5.3.1 Funzionamento....................................................................................103<br />

5.3.2 Implementazione..................................................................................105<br />

6 Testing e analisi dei risultati................................................................................130<br />

6.1 Architettura di testing..................................................................................130<br />

2


Sommario<br />

6.1.1 IRCache e Web log..............................................................................132<br />

6.1.2 Log_stripper, log_player e log_cleaner................................................132<br />

6.1.3 Netem..................................................................................................134<br />

6.2 Test e risultati..............................................................................................135<br />

6.2.1 Dimensione della cache pari a 4GB......................................................135<br />

6.2.2 Dimensione della cache pari a 300MB.................................................138<br />

6.3 Analisi dei risultati......................................................................................140<br />

Conclusioni.................................................................................................................146<br />

Appendice A...............................................................................................................149<br />

Squid.conf (Calamaro)............................................................................................149<br />

Squid.conf (Andromeda).........................................................................................154<br />

Appendice B...............................................................................................................158<br />

Configurazione MRTG ...........................................................................................158<br />

Appendice C...............................................................................................................169<br />

calamaris.conf.........................................................................................................169<br />

Appendice D...............................................................................................................196<br />

Spd.cfg....................................................................................................................196<br />

Glossario.....................................................................................................................198<br />

Bibliografia.................................................................................................................204<br />

3


Indice delle figure<br />

Indice delle figure<br />

Fig. 1-1 - Classificazione delle politiche di rimpiazzamento a seconda delle informazioni<br />

considerate.................................................................................................................16<br />

Fig. 1-2 - Esempio di segmentazione e prefix caching......................................................22<br />

Fig. 1-3 - Funzionamento del caching dinamico...............................................................23<br />

Fig. 2-1 - AI3 Testbed Network.......................................................................................29<br />

Fig. 2-2 - Architettura della soluzione AI3 per il web caching..........................................31<br />

Fig. 2-3 - Hughes Network Systems SPACEWAY...........................................................32<br />

Fig. 2-4 - Architettura INTELSAT IDS...........................................................................35<br />

Fig. 2-5 - Uso del pushing in una catena di proxy.............................................................36<br />

Fig. 2-6 - Topologia dei core-link della rete Mercure........................................................37<br />

Fig. 2-7 - Archietettura della SatCAST con Squid e agenti MCast....................................39<br />

Fig. 3-1 - Sistema di proxy/caching su due livelli.............................................................46<br />

Fig. 3-2 - Doppia istanza di Squid per ogni livello di caching...........................................46<br />

Fig. 3-3 - Istanza di Squid dedicata ai file multimediali: basso traffico e hit rate...............48<br />

Fig. 3-4 - Layer 7 switching dedicato...............................................................................51<br />

Fig. 3-5 - Layer 7 Switching tramite Squid e ACL...........................................................51<br />

Fig. 3-6 - Grafico della tipologia di traffico della rete Elis................................................54<br />

Fig. 3-7 - Sottoscrizione di un contenuto da parte agente esterno......................................56<br />

Fig. 3-8 - Memorizzazione della richiesta di sottoscrizione e risposta alla GET................57<br />

Fig. 3-9 - Aggiornamento del contenuto da parte di un agente di PUSHING....................57<br />

Fig. 3-10 - Aggiornamento del contenuto di L2 tramite PUT HTTP.................................58<br />

Fig. 3-11 - Architettura Virtual Server tramite IP Tunneling.............................................62<br />

Fig. 3-12 - Flusso di incapsulamento/decapsulamento tra il forntend (LinuxDirector) e il<br />

backend (Real Server)................................................................................................63<br />

Fig. 3-13 - Comandi per disabilitare le risposte ARP per una interfaccia di loopback.......64<br />

Fig. 3-14 - Architettura del sistema di caching satellitare SatSquid...................................66<br />

Fig. 3-15 - Architettura finale "alternativa": mirroring dedicato........................................67<br />

4


Indice delle figure<br />

Fig. 4-1 - Script di configurazione di Squid......................................................................71<br />

Fig. 4-2 - Esempi di elementi di ACL...............................................................................72<br />

Fig. 4-3 - Esempi di elementi ACL con valori multipli.....................................................73<br />

Fig. 4-4 - Esempi di regole di ACL..................................................................................73<br />

Fig. 4-5 - Esempi di regole ACL con valori multipli.........................................................73<br />

Fig. 4-6 - Insieme di ACL usate per effettuare l’indirizzamento delle richieste.................74<br />

Fig. 4-7 - Esempio di file cache.log..................................................................................75<br />

Fig. 4-8 - Esempio di file store.log...................................................................................76<br />

Fig. 4-9 - Esempio di access.log nel formato nativo di Squid............................................76<br />

Fig. 4-10 - Formato del file di logging access.log proprietario di Squid............................78<br />

Fig. 4-11 - Esempio di impostazione cache_peer usata per i test.......................................79<br />

Fig. 4-12 - Esempio di impostazioni del parametro refresh_pattern..................................80<br />

Fig. 4-13 - Pseudocodice per il controllo della freschezza di un oggetto di Squid.............80<br />

Fig. 4-14 - Albero gerarchico degli OID nel MIB.............................................................82<br />

Fig. 4-15 - Esempio di ACL per l'accesso SNMP su Squid...............................................83<br />

Fig. 4-16 - Impostazioni per l'utilizzo di RRDTOOL all'interno di un .cfg di MRTG........85<br />

Fig. 4-17 - Dimensione della cache in un giorno di utilizzo..............................................86<br />

Fig. 4-18 - Numero di oggetti in cache in un giorno di utilizzo.........................................86<br />

Fig. 4-19 - Distribuzione della dimensione e del numero dei file richiesti.........................88<br />

Fig. 5-1 - Funzionamento dell'architettura software nel caso di richiesta di tipo WD.........90<br />

Fig. 5-2 - Funzionamento dell'architettura software nel caso di richiesta di tipo MM........91<br />

Fig. 5-3 - Funzionamento dell'architettura software alternativa.........................................92<br />

Fig. 5-4 - Esempio di istruzioni all'interno del crontab......................................................93<br />

Fig. 5-5 - Diagramma di flusso del funzionamento del demone SPD................................95<br />

Fig. 5-6 - Funzionamento delle varie istanze di SPD in una architettura base....................96<br />

Fig. 5-7 - Funzionamento delle varie istanze di SPD in una architettura alternativa..........97<br />

Fig. 5-8 - Una sezione del file di configurazione spd.cfg ..................................................98<br />

Fig. 5-9 - Parsing di valori del file spd.cfg........................................................................98<br />

Fig. 5-10 - Inizializzazione del logging su file di testo per il demone SPD......................100<br />

Fig. 5-11 - Codice per l'invio di una mail di notifica in caso di errore.............................101<br />

Fig. 5-12 - Codice necessario al matching delle richieste nel file di log di Squid............103<br />

5


Indice delle figure<br />

Fig. 5-13 - Funzionamento della MMI nell’architettura base..........................................104<br />

Fig. 5-14 - Funzionamento MMI nell’architettura alternativa.........................................105<br />

Fig. 5-15 - Relazioni tra le tabelle del database di MMI in configurazione base..............107<br />

Fig. 5-16 - Relazione tra le tabelle del database di MMI in configurazione alternativa....108<br />

Fig. 5-17 - Interfaccia di autenticazione..........................................................................109<br />

Fig. 5-18 - Codice per il controllo dei diritti di accesso...................................................110<br />

Fig. 5-19 - Diagramma di flusso del funzionamento di MMI..........................................111<br />

Fig. 5-20 - Interfaccia di inserimento utente...................................................................112<br />

Fig. 5-21 - Interfaccia di inserimento utente in configurazione alternativa......................113<br />

Fig. 5-22 - Diagramma di flusso dell'inserimento utente.................................................114<br />

Fig. 5-23 - Codice relativo all'inserimento utenti............................................................115<br />

Fig. 5-24 - Interfaccia di modifica utente........................................................................116<br />

Fig. 5-25 - Diagramma di flusso della modifica utenti....................................................117<br />

Fig. 5-26 - Codice per la modifica di un amministratore in un utente..............................117<br />

Fig. 5-27 - Codice per la modifica di un amministratore.................................................118<br />

Fig. 5-28 - Codice per la modifica di un utente in amministratore...................................118<br />

Fig. 5-29 - Codice per la modifica di un utente...............................................................118<br />

Fig. 5-30 - Codice per la rimozione di un amministratore...............................................119<br />

Fig. 5-31 - Codice per la rimozione di un utente.............................................................119<br />

Fig. 5-32 - Interfaccia per l'inserimento di un sito mirror................................................120<br />

Fig. 5-33 - Interfaccia per l'inserimento di un sito mirror in configurazione alternativa...121<br />

Fig. 5-34 - Diagramma di flusso dell'inserimento di un sito mirror.................................122<br />

Fig. 5-35 - Codice per l'inserimento di una URL non presente nel database....................123<br />

Fig. 5-36 - Codice per l'inserimento delle ACL in squid.conf nel caso di architettura<br />

alternativa................................................................................................................123<br />

Fig. 5-37 - Diagramma di flusso della modifica di un sito mirror....................................124<br />

Fig. 5-38 - Codice per la modifica di una URL associata a più L2 con campi identici.....125<br />

Fig. 5-39 - Codice per la modifica di una URL con una unica associazione, ma associazioni<br />

multiple a seguito della modifica..............................................................................125<br />

Fig. 5-40 - Codice per la modifica di una URL associata a più L2 con campi diversi......126<br />

Fig. 5-41 - Codice per la modifica di una URL con una unica associazione....................126<br />

6


Indice delle figure<br />

Fig. 5-42 - Diagramma di flusso della rimozione di un sito mirror..................................127<br />

Fig. 5-43 - Codice per la rimozione di un sito in mirroring.............................................128<br />

Fig. 5-44 - Codice per la rimozione delle operazioni nel crontab....................................128<br />

Fig. 5-45 - Codice per la rimozione di un sito in mirroring nel caso di configurazione<br />

alternativa................................................................................................................129<br />

Fig. 6-1 - Architettura di testing.....................................................................................131<br />

Fig. 6-2 - Comando per impostare un ritardo fisso di 500msec con Netem.....................135<br />

Fig. 6-3 - Valori di HIT, MISS ed ERROR per cache a 4GB senza SPD.........................136<br />

Fig. 6-4 - Valori di HIT, MISS ed ERROR per cache a 4GB con SPD............................137<br />

Fig. 6-5 - Valori di HIT, MISS ed ERROR per cache a 300MB senza SPD....................138<br />

Fig. 6-6 - Valori di HIT, MISS ed ERROR per cache a 300MB con SPD.......................139<br />

Fig. 6-7 - Hit rate al variare della dimensione della cache e della presenza di SPD.........141<br />

Fig. 6-8 - Byte/hit rate al variare della dimensione della cache e della presenza di SPD..142<br />

Fig. 6-9 - Distribuzione dei tempi di risposta nel caso di connessione LAN....................144<br />

Fig. 6-10 - Distribuzione dei tempi di risposta nel caso di connessione satellitare...........145<br />

7


Indice delle tabelle<br />

Indice delle tabelle<br />

Tab. 3-1 - Tabella per il dimensionamento di un proxy server Squid................................53<br />

Tab. 6-1 - Valori di HIT, MISS ed ERROR per cache a 4GB senza SPD........................136<br />

Tab. 6-2 - Valori di HIT, MISS ed ERROR per cache a 4GB con SPD...........................137<br />

Tab. 6-3 - Valori di HIT, MISS ed ERROR per cache a 300MB senza SPD...................138<br />

Tab. 6-4 - Valori di HIT, MISS ed ERROR per cache a 300MB con SPD......................139<br />

8


Introduzione<br />

Introduzione<br />

Il lavoro di tesi qui presentato nasce come progetto aziendale, svolto presso la<br />

società di consulenza Junior Consulting e con committente Telespazio.<br />

Telespazio, una delle realtà più importanti in Italia in ambito satellitare, ha nella<br />

propria offerta di servizi anche la connettività dati attraverso connessione satellitare. In<br />

particolare, la propria offerta è sia di tipo Business-to-Consumer, rivolta direttamente<br />

all’utente finale, sia di tipo Business-to-Business, rivolta quindi ad altri fornitori di servizi.<br />

Proprio queste realtà sono quelle di maggiore interesse, poiché, coinvolgono direttamente<br />

quegli ISP (Internet Service Provider) che, per motivi legati ad un posizionamento<br />

geografico “poco fortunato” (quindi impossibilitati all’utilizzo di connessioni terrestri) o per<br />

ragioni riguardanti la sicurezza (necessità di utilizzare dei link di back-up), necessitano di<br />

una connessione dati satellitare. A tali realtà vanno ad aggiungersene altre più recenti, frutto<br />

degli ultimi sviluppi nel campo delle connessioni senza fili, che vedono l’impiego<br />

contemporaneo di connessioni satellitari e di connessioni con tecnologia Wi-Max al fine di<br />

coprire rapidamente un vasto territorio. E’ questo il caso di aziende in forte espansione, con<br />

una vasta presenza sul territorio e che necessitano di collegare tra loro le sedi periferiche con<br />

la sede centrale, evitando così di transitare sulla rete pubblica, sia per questioni di sicurezza<br />

dei dati in transito, sia per ridurre la possibilità di ritardi o difficoltà di connettività non<br />

direttamente controllabili.<br />

Attualmente, tuttavia, le connessioni satellitari soffrono di un problema che le rende<br />

poco “appetibili” e che è insito nella natura stessa di queste connessioni, la latenza. I satelliti<br />

impiegati in questa tipologia di connessioni sono, nel caso di Telespazio, geostazionari,<br />

viaggiano quindi ad una distanza dalla terra di circa 36 mila kilometri. Questa distanza ha<br />

come conseguenza un ritardo dovuto alla propagazione stessa del segnale, quantificabile<br />

nell’ordine dei 500msec, divisi in 250msec nella tratta di uplink e 250msec nella tratta di<br />

downlink. E’ evidente come un siffatto ritardo determini una latenza riscontrabile durante la<br />

navigazione assai “fastidiosa”, soprattutto se si considerano le numerose interazioni<br />

normalmente necessarie per la visualizzazione di una semplice pagina Web: dalla risoluzione<br />

del nome del sito contenuto nella URL, fino alle richieste per i singoli oggetti “embedded”<br />

nella pagina stessa. Ogni richiesta subisce così un ritardo di 500msec, che sommato a quello<br />

9


Introduzione<br />

delle altre porta a diversi secondi di attesa per la visualizzazione di una semplice pagina Web,<br />

nonostante l’utilizzo di una connessione satellitare veloce (nell’ordine dei megabit/sec).<br />

A questo problema della latenza va ad aggiungersi una necessità del committente: la<br />

possibilità di utilizzare un meccanismo di mirroring dei contenuti. Il motivo di tale bisogno è<br />

da ricondursi ai vantaggi offerti dal mirroring, sia dal punto di vista tecnologico (riduzione<br />

dei tempi di caricamento dei contenuti), sia dal punto di vista commerciale (possibilità di<br />

stipulare accordi mirati per il mirroring selettivo di contenuti).<br />

Questo lavoro di tesi è stato quindi svolto tenendo sempre ben in mente il problema<br />

della latenza insita nella natura del canale e la necessità di un meccanismo di mirroring e<br />

traducendo tali problematiche nei due obiettivi principali: il mascheramento della latenza del<br />

canale satellitare e il mirroring di contenuti Web. A tal proposito è stato così studiato,<br />

progettato e realizzato un sistema di proxy caching e mirroring di contenuti fruibili<br />

attraverso una connessione satellitare, con il fine di rendere la navigazione una esperienza<br />

“piacevole” per l’utente finale e quanto più vicina possibile a quella riscontrabile nel caso di<br />

utilizzo di una connessione cablata.<br />

Per il conseguimento di questi due obiettivi, durante tutto il corso del lavoro, sono<br />

state attentamente prese in considerazione e, dove possibile, sfruttate due ipotesi di partenza,<br />

direttamente fornite da Telespazio: il basso costo delle capacità di storage e la disponibilità<br />

di una banda satellitare pressoché infinita. Allo stato attuale, infatti, è abbastanza economico<br />

costruire macchine con capacità di storage elevata, nell’ordine dei terabyte (considerando<br />

che attualmente un disco S-ATA da 200GB costa all’incirca 90€), analogamente, la velocità<br />

delle connessione satellitari supera ormai facilmente i 30 megabit/sec (a tal proposito<br />

Telespazio ha espresso la volontà di creare eventualmente un satellite dedicato con<br />

connessione nell’ordine dei 50 megabit/sec).<br />

Il risultato finale è stato quindi SatSquid, un sistema di proxy caching satellitare<br />

basato su Squid, uno dei più noti e affermati programmi proxy server. SatSquid, tramite<br />

l’ausilio di due moduli di supporto opportunamente creati, SPD (Squid Prefetching Daemon)<br />

e MMI (Mirroring Management Interface), consente di raggiungere gli obiettivi sopra<br />

accennati: attraverso l’utilizzo di tecniche di prefetching che prevedono l’analisi del traffico<br />

e il prelevamento anticipato del contenuto (prima ancora che venga richiesto), unitamente ad<br />

un meccanismo di mirroring di siti web, è possibile sia ridurre la latenza percepita<br />

10


Introduzione<br />

dall’utente finale durante la navigazione, sia effettuare il mirroring selettivo di contenuti<br />

Web, specificandone una frequenza di refresh e un livello di profondità.<br />

Lo sviluppo del lavoro di tesi è così articolato: inizialmente vengono presentati<br />

alcuni studi effettuati sugli algoritmi di caching più diffusi (Cap.1), elementi fondamentali di<br />

un buon sistema di caching e base di partenza per valutazioni relative all’architettura del<br />

sistema. Successivamente, vengono analizzate alcune architetture di proxy caching satellitari<br />

e soluzioni già presenti sul mercato (Cap.2), sottolineandone di volta in volta le<br />

caratteristiche salienti e gli elementi distintivi. A seguito di questa analisi, viene presentata<br />

una fase di studio e progettazione del sistema SatSquid (Cap.3), evidenziando in dettaglio i<br />

passaggi, le scelte e le motivazioni che hanno guidato tale fase, risultante nella presentazione<br />

dell’architettura finale e dei propri pregi e difetti. Vengono quindi descritti gli strumenti<br />

necessari all’implementazione di tale architettura (Cap.4), così come di quelli che sono stati<br />

utilizzati nella fase di progettazione al fine di effettuare determinate scelte architetturali.<br />

Segue poi una accurata presentazione delle caratteristiche dei moduli di supporto SPD e<br />

MMI (Cap.5) e delle rispettive implementazioni. Il lavoro si conclude con la presentazione<br />

della fase di sperimentazione condotta sul prototipo realizzato, dell’architettura e degli<br />

strumenti utilizzati durante il testing e dell’analisi dei risultati raccolti durante tale fase<br />

(Cap.6). Alla fine del testo, sono riportate in appendice le configurazioni di alcuni degli<br />

strumenti utilizzati durante tutto il lavoro di tesi, nonché un glossario dei termini tecnici e<br />

degli acronimi utilizzati in questo testo.<br />

11


1 Caching<br />

1. Caching<br />

Il caching assume particolare rilevanza nell’ambito delle reti. E’ indubbio che, con la<br />

continua crescita di Internet, sempre più documenti e contenuti di varia natura vengono<br />

scambiati ogni giorno in ogni parte del globo. Alcuni di questi documenti hanno maggiore<br />

rilevanza rispetto ad altri e per questo sono maggiormente acceduti. Di conseguenza, diventa<br />

evidente la necessità di velocizzare l’accesso a tali risorse altamente utilizzate, tramite<br />

l’ausilio del caching.<br />

Il caching di contenuti web, quindi, ha lo scopo principale di rendere più rapido<br />

l’accesso ai documenti maggiormente acceduti, riducendo la latenza percepita dagli utenti.<br />

Per raggiungere tale risultato è possibile agire sia lato server (chi fornisce i documenti) sia<br />

lato utente (chi fruisce di tali documenti).<br />

Lo strumento maggiormente utilizzato in tal senso è il proxy server: una macchina,<br />

spesso posizionata in prossimità di un Internet gateway, che fornisce una cache condivisa per<br />

un insieme di client. Le richieste effettuate da tali client pervengono al proxy<br />

indipendentemente dal server web che ospita i documenti richiesti. Il proxy può così<br />

rispondere a tali richieste con una copia di questi documenti conservata nella propria cache,<br />

oppure prelevarli direttamente dall’origin server ed effettuarne una copia in cache prima di<br />

restituirli al client.<br />

Un proxy quindi ha un triplice scopo:<br />

• ridurre la latenza d’accesso ad un documento;<br />

• limitare il traffico Internet, favorendo la circolazione di documenti all’interno<br />

della rete di appartenenza del client richiedente;<br />

• ridurre il carico sugli origin server.<br />

In questo primo capitolo verranno trattati quegli elementi del caching che saranno<br />

fondamentali nello sviluppo del lavoro di tesi. Il primo di tali elementi fondamentali è<br />

rappresentato dalla strategia di posizionamento di un server di proxying/caching e quindi<br />

dalle caratteristiche che ne derivano (1.1), rappresentabili attraverso due tipologie di proxy<br />

server: reverse proxy (1.1.1) e interception proxy (1.1.2). In seguito vengono trattate le<br />

politiche di rimpiazzamento di un elemento all’interno della cache (1.2). Sono quindi<br />

12


1. Caching<br />

evidenziati gli accorgimenti necessari al caching di contenuti di tipo multimediale (1.3).<br />

Infine viene fatto un breve accenno al caching cooperativo (1.4).<br />

1.1 Localizzazione di un proxy server<br />

I proxy server vedono il loro massimo sviluppo e notorietà nella metà degli anni<br />

novanta, allorquando, con il continuo crescere dei collegamenti ad Internet, era necessario<br />

sfruttare al meglio le connessioni disponibili, vista la loro banda ridotta e il costo elevato.<br />

Per tale motivo, inizialmente, il posizionamento dei proxy server è stato pensato in<br />

prossimità degli utenti finali, proprio al fine di risparmiare banda e ridurre la latenza<br />

percepita durante la navigazione. Con il passare del tempo però e l’aumentare della<br />

popolarità di alcuni siti Web, il traffico generato verso tali siti assumeva dimensioni<br />

considerevoli. Si è quindi pensato di spostare il proxy e di posizionarlo vicino all’origin<br />

server, al fine di alleggerirne il carico.<br />

1.1.1 Reverse proxy<br />

Parlando di un proxy server quindi il suo posizionamento costituisce un elemento<br />

distintivo, in quanto, proprio in base ad esso è possibile distinguere tra un semplice proxy<br />

server e un reverse proxy server [Rab01]. Il termine reverse proxy server viene appunto<br />

usato in contrapposizione al semplice proxy server, proprio per evidenziarne la particolare<br />

posizione assunta all’interno della catena richiesta-risposta, in cui normalmente il proxy è<br />

posizionato in prossimità del client. I motivi di un posizionamento siffatto sono<br />

principalmente da ricondurre, come precedentemente accennato, alla volontà di ridurre il<br />

carico di quei server molto popolari, soggetti quindi ad un traffico intenso. Un reverse proxy<br />

infatti viene visto dai client come un origin server che provvede a rispondere alle richieste di<br />

quest’ultimi, eventualmente reindirizzando tali richieste al proprio origin server, nel caso<br />

non in sia grado di soddisfarle (richiesta non presente in cache o scaduta). Inoltre, il ruolo di<br />

un reverse proxy è anche quello di fornire un primo livello di protezione per l’origin server.<br />

Grazie al proprio posizionamento, esso costituisce una protezione per l’origin server, in<br />

quanto assicura a quest’ultimo di non essere direttamente visibile ai client e ne impedisce<br />

13


1. Caching<br />

così l’esposizione ad attacchi diretti dall’esterno. Attualmente, proprio per la funzionalità di<br />

snellire il traffico per l’origin server, tali proxy vengono anche chiamati accelerator proxy,<br />

in quanto contribuiscono a accelerare lo snellimento del traffico e quindi la velocità di<br />

risposta di un orgin server.<br />

1.1.2 Interception proxy<br />

Un altro elemento determinante nella definizione di un proxy server è la propria<br />

“visibilità” rispetto ai client. Generalmente un proxy posizionato in prossimità dei client si<br />

prende carico di gestire tutte le richieste e le risposte generate e dirette verso questi ultimi. A<br />

volte, specialmente nel caso di grandi compagnie, per un amministratore di rete risulta<br />

difficoltoso impostare un numero elevato di client al fine di utilizzare un proxy. In tal caso<br />

l’utilizzo di un interception proxy diventa la soluzione ottimale. Come indica il termine<br />

stesso, una tale tipologia di proxy, tramite l’ausilio di apparecchiature che lavorano ad un<br />

livello generalmente più basso della pila ISO/OSI (switch e router), è in grado di intercettare<br />

il traffico generato dai client, senza che questi ne siano al corrente. Non è richiesta infatti<br />

alcuna configurazione lato client. Inoltre tale soluzione viene sempre più spesso adottata<br />

dagli Internet Service Provider (ISP), poiché, oltre a non richiedere configurazione per i<br />

client, risulta di facile gestione in caso di guasti o problemi al sistema: è sufficiente<br />

“spegnere” l’apparato di rete che intercetta il traffico per direzionarlo al proxy server, per<br />

eliminare il problema.<br />

L’intercettazione del traffico può avvenire a differenti livelli, di seguito ne vengono<br />

elencate le caratteristiche salienti.<br />

• livello 2: il traffico viene indirizzato dall’apparato di rete (generalmente<br />

switch) che si occupa dell’intercettazione direttamente alla macchina proxy<br />

server, utilizzando l’indirizzo MAC di quest’ultima. L’unico inconveniente in<br />

una tale soluzione è dovuto alla necessità per l’apparato intercettore e il proxy<br />

server di risiedere nello stesso segmento di rete.<br />

• Livello 3: in questo caso il traffico di rete viene, tramite la tecnica di IP-<br />

tunnelling indirizzato al proxy server. Il meccanismo di IP-tunnelling prevede<br />

l’incapsulamento di un pacchetto IP in un altro pacchetto IP, in cui quello più<br />

14


1. Caching<br />

esterno contiene l’indirizzo IP del proxy server. In tal modo, l’elemento<br />

intercettore e il proxy server possono risiedere in reti differenti.<br />

• Livello 4: utilizzando uno switching di livello 4 è possibile indirizzare il<br />

traffico di rete in base alle porte utilizzate verso il proxy server. Infatti,<br />

generalmente il traffico web transita sulla porta 80, di conseguenza,<br />

indirizzando il traffico diretto verso tale porta al proxy server è possibile<br />

intercettare tutto o quasi il traffico web.<br />

• Livello 7: uno switching di livello 7, lavorando al livello applicazione,<br />

intercetta anch’esso le richieste di connessione verso un web server<br />

(generalmente attraverso i pacchetti SYN diretti verso la porta 80), ma, al<br />

contrario di uno switch di livello 4, non si limita ad indirizzare direttamente i<br />

pacchetti verso il proxy, piuttosto esegue un handshake TCP (meccanismo<br />

utilizzato nel protocollo TCP per stabilire una connessione tra un client ed un<br />

server) con il client, impersonando l’origin server. Solo in seguito, dopo<br />

l’analisi della richiesta, indirizza il pacchetto verso il proxy, potendo basare la<br />

propria scelta su una serie di informazioni recuperabili solamente al livello 7,<br />

quali, per esempio, l’estensione del file richiesto.<br />

Spesso una tale tipologia di proxy viene indicata erroneamente con il termine di<br />

transparent proxy, con l’intenzione di riferirsi al fatto che questi proxy risultano<br />

completamente trasparenti all’utente finale. Tuttavia, in letteratura, la trasparenza di un<br />

proxy è riferita alle modifiche e all’adattamento del contenuto effettuate, non alla propria<br />

visibilità verso l’utente finale.<br />

1.2 Politiche di rimpiazzamento<br />

L’elemento caratterizzante ogni algoritmo di caching è la politica di rimpiazzamento<br />

dei documenti in cache, utilizzata per individuare il (o i) documento(i) che deve essere<br />

eliminato dalla cache quando questa è piena ed occorre inserire un nuovo documento.<br />

I tre parametri decisionali maggiormente presi in considerazione nelle diverse policy<br />

sono informazioni di:<br />

• recency, quanto recentemente un documento è stato acceduto;<br />

15


• frequency, quanto frequentemente un documento è stato ecceduto;<br />

• size, quanto “pesa” un documento in termini di dimensione.<br />

1. Caching<br />

Alcune politiche di rimpiazzamento (Fig.1-1) prendono in considerazione l’una o<br />

l’altra informazione, altre ancora tutte e tre le informazioni, insieme ad altri parametri come<br />

il costo associato ad ogni documento, al fine di prendere le proprie decisioni.<br />

Fig. 1-1 - Classificazione delle politiche di rimpiazzamento a seconda delle informazioni considerate<br />

Una classificazione possibile di tali algoritmi di rimpiazzamento, oltre che per queste<br />

tre informazioni prese in considerazione, è quella che li divide in algoritmi deterministici e<br />

casuali, in base alla casualità adottata nei criteri di selezione, al fine di ridurre la complessità<br />

di calcolo [Bal04]. Tale casualità è spesso basata su parametri quali il tempo dall’ultimo<br />

accesso, il numero di referenze di un documento o la dimensione del documento stesso.<br />

1.2.1 Algoritmi di rimpiazzamento deterministici<br />

A partire dalla metà degli anni novanta, vista la sempre maggiore espansione di<br />

Internet, il caching è stato uno dei maggiori temi di ricerca da parte della comunità<br />

scientifica che si occupa di sistemi Web, da qui il fiorire di numerose proposte.<br />

16


1. Caching<br />

Di seguito sono descritti alcuni degli algoritmi di rimpiazzamento [Bal04] di tipo<br />

deterministico più comuni.<br />

LRU (Least Recently Used): algoritmo, insieme l’LFU, tra i più utilizzati. Elimina<br />

per primi i documenti acceduti meno di recente, sulla base del presupposto che il traffico<br />

web è soggetto a località temporale. Di conseguenza più tempo è trascorso da quando il<br />

documento è stato richiesto l’ultima volta e meno probabilmente verrà richiesto nel prossimo<br />

futuro.<br />

LFU (Least Frequently Used): algoritmo molto diffuso che elimina per primi i<br />

documenti acceduti meno frequentemente, sulla base del presupposto che i documenti più<br />

frequentemente acceduti hanno un profilo di popolarità a lungo termine. Tale algoritmo,<br />

insieme l’LRU precedentemente descritto, è anche un algoritmo di rimpiazzamento per la<br />

gestione della cache in un calcolatore. Tuttavia, mentre nel caso di un calcolatore la<br />

dimensione dell’oggetto da rimpiazzare è fissa, nel caso dei documenti Web vi è una elevata<br />

variabilità delle dimensioni.<br />

SIZE: algoritmo che prevede l’eliminazione prima di tutto dei documenti di<br />

dimensioni maggiori, presupponendo che, proprio a causa delle loro dimensioni, tali<br />

documenti abbiano scarsa probabilità di essere acceduti di nuovo, visto l’elevato ritardo di<br />

accesso.<br />

LOG2-SIZE: analogo al precedente, tuttavia non utilizza solo le dimensioni del<br />

documento, ma anche la data dell’ultimo accesso come elemento decisionale. Da notare<br />

inoltre che tale algoritmo risulta meno sensibile del precedente ai piccoli cambiamenti di<br />

dimensioni, in quanto prende in considerazione log2 (SIZE).<br />

LRU Threshold: lavora in maniera analoga all’algoritmo LRU, introducendo però un<br />

limite massimo oltre il quale i documenti non vengono memorizzati in cache. Tale approccio<br />

cerca di prevenire il rimpiazzamento di numerosi file di piccole dimensioni con uno solo di<br />

grandi dimensioni . Quindi tende ad assumere implicitamente che un utente non sia portato a<br />

richiedere nuovamente file con dimensioni maggiori di un certo limite.<br />

LRU-Min: questa politica lavora in maniera analoga alla precedente, cercando<br />

tuttavia di essere meno discriminante nei confronti dei documenti di grandi dimensioni. Ogni<br />

volta che un documento di dimensione S deve essere memorizzato, vengono rimossi<br />

documenti che hanno dimensione maggiore di S. Se tali documenti non sono presenti,<br />

17


1. Caching<br />

l’algoritmo viene ripetuto con S/2, quindi S/4 e così via. In questa maniera LRU-Min tende a<br />

rimuovere documenti di grandi dimensioni meno frequentemente di LOG2-SIZE.<br />

Hyper-G: combina LFU, LRU e SIZE. Il suo funzionamento si basa sul rimuovere<br />

prima il documento usato meno di frequente, nel caso di indecisione tra più di un documento<br />

viene quindi preso in considerazione quello acceduto meno di recente e come ultima risorsa<br />

viene considerata la dimensione.<br />

Pitkow/Recker: è una politica LRU che opera su cicli di un giorno, documenti<br />

acceduti nello stesso giorno sono assunti avere la stessa informazione di recency. Per gli<br />

accessi di uno stesso giorno il documento più grande viene rimosso. Questa politica sembra<br />

implicitamente assumere che gli interessi di un client cambino da un giorno all’altro e che<br />

questo tenda a concentrare le proprie richieste su un insieme stabilito di documenti.<br />

All’interno degli algoritmi deterministici, un ruolo particolare lo svolgono le<br />

function-based policy (politiche basate su una funzione di costo). Queste infatti sono<br />

anch’esse basate su parametri decisionali. Tuttavia, tali parametri non sono applicati in<br />

maniera sequenziale, ma sono combinati tra loro e considerati con diversi pesi in una<br />

funzione di costo. Questi algoritmi quindi mirano a tenere in cache i documenti di “maggior<br />

valore”, ma possono differire a seconda della definizione della funzione di costo. Di seguito<br />

vengono elencate alcune politiche di rimpiazzamento tra le più significative appartenenti a<br />

questa categoria.<br />

GD-LRU (Greedy-Dual LRU): questa politica assegna per ogni documento p un<br />

valore H(p) pari al costo necessario per memorizzare tale documento in cache. Ogni volta<br />

che un documento viene acceduto, il suo valore H viene assegnato pari al costo necessario<br />

per portare tale documento in cache. Qualora ci sia necessità di memorizzare un nuovo<br />

documento, viene rimosso dalla cache quello che ha il valore di Hmin minimo, quindi il<br />

valore H di tutti gli altri documenti viene diminuito di Hmin.<br />

GDS: questa politica estende la precedente, aggiungendo una informazione relativa<br />

alla dimensione del documento nel valore H(p) e anche una informazione relativa al tempo.<br />

In questo modo, tale algoritmo consente sia di favorire la presenza di file di piccole<br />

dimensioni in cache, sia, tramite l’ausilio della informazione temporale, di evitare di<br />

mantenere in cache documenti delle “giuste” dimensioni ma poco acceduti.<br />

18


1. Caching<br />

LRV (Least Relative Value): tale algoritmo, frutto di studi e analisi statistiche su<br />

numerose tracce di traffico web, prende in considerazione per la propria funzione di costo<br />

informazioni quali la probabilità che un documento venga nuovamente richiesto a partire<br />

dall’ora in cui verrà rimpiazzato e un valore che riflette il guadagno ottenuto dal rimuovere<br />

tale documento dalla cache.<br />

LNC-R-W3-U (Least Normalized Cost Replacement for the Web with Update): questa<br />

politica considera i file come costituiti di tante piccole parti, ognuna di una dimensione<br />

fissata ed ognuna con un costo assegnato pari al costo del documento diviso per la sua<br />

dimensione. Partendo da questo principio viene definito quindi un valore di profitto per ogni<br />

documento e si procede quindi alla sostituzione del documento con il valore di profitto<br />

minore.<br />

SLRU (Size-Adjusted LRU): tale algoritmo di rimpiazzamento estende LRU<br />

attraverso informazioni relative alle dimensioni dei documenti. Il “semplice” LRU<br />

considerava tutti i documenti come delle stesse dimensioni, limitandosi a rimuove quello<br />

acceduto meno di recente. SLRU invece, tramite la propria funzione di costo calcola ad ogni<br />

passo e per ogni documento un valore dipendente sia dall’ora dell’ultimo accesso sia dalle<br />

dimensioni del documento stesso, rimuovendo il file con il valore più basso.<br />

Hybrid: politica di rimpiazzamento che prende in considerazione nella propria<br />

funzione di costo informazioni quali il round trip time dell’origin server e la larghezza di<br />

banda tra il proxy e il server.<br />

Inoltre, tiene in considerazione anche il numero di volte che un documento è stato<br />

richiesto nonché, le sue dimensioni.<br />

LR (Logistic Regression): algoritmo che usa un modello di regressione logistica per<br />

acquisire informazioni sui documenti web in una determinata traccia al fine di predire la<br />

distanza del prossimo accesso per ogni documento in cache. Questo algoritmo “predice” la<br />

distanza attesa per il prossimo accesso, pesandola con la dimensione del documento stesso,<br />

quindi, al momento opportuno, rimpiazza il documento la cui distanza attesa e pesata è<br />

maggiore degli altri.<br />

Static[Rou97]: politica di rimpiazzamento che basa il proprio funzionamento sul<br />

presupposto che il traffico che ci si aspetta in un determinato giorno è lo stesso del giorno<br />

precedente. Di conseguenza ogni giorno, tramite l’analisi dei log del traffico del giorno<br />

19


1. Caching<br />

prima, considera i documenti maggiormente visitati e li assume come unici candidati ad<br />

essere mantenuti in cache per la giornata in corso.<br />

1.2.2 Algoritmi di rimpiazzamento casuali<br />

Generalmente, le politiche di rimpiazzamento deterministiche basate su funzioni di<br />

costo richiedono complesse strutture dati e sono soggette ad un alto carico computazionale,<br />

che ne limita quindi la scalabilità. L’alternativa è quella di utilizzare un approccio che si basi<br />

su algoritmici di tipo casuali.<br />

SLRU- Random: variante casuale dell’algoritmo SLRU, attraverso l’introduzione di<br />

un indice di “randomicita”, calcolato in base al costo e alle dimensioni del file che determina<br />

la probabilità con la quale un documento appena acceduto viene messo “in testa” alla cache.<br />

Di conseguenza, al momento della selezione del candidato alla rimozione, dal momento che<br />

il documento rimosso è sempre quello in fondo allo stack della cache, può anche capitare che<br />

il documento nuovo venga direttamente rimosso e quindi non inserito in cache del tutto.<br />

RANDOM: un algoritmo che cerca di approssimare un qualsiasi algoritmo esistente<br />

implementandone la casualità. Per raggiungere lo scopo lavora selezionando<br />

randomicamente un insieme di N documenti e selezionando tra questi il candidato alla<br />

rimozione in base alla politica di rimpiazzamento utilizzata.<br />

1.3 Caching di contenuti multimediali<br />

Gli algoritmi di rimpiazzamento finora considerati vengono utilizzati soprattutto nel<br />

caso di caching di tipo tradizionale, ovvero di contenuti web statici. Ormai, è però sempre<br />

più frequente trovare contenuti multimediali che vengono veicolati sulla rete, siano essi<br />

musica, video o streaming degli stessi. Questa tipologia di informazioni necessita tuttavia di<br />

trattamenti particolari, che i semplici algoritmi di caching con le proprie politiche di<br />

rimpiazzamento non prendono minimamente in considerazione.<br />

Per tali motivi sono possibili una serie di “aggiunte” ai sistemi di caching tradizionali,<br />

atte a facilitare il trattamento di contenuti multimediali, con particolare attenzione ai<br />

contenuti veicolati in streaming [Hof99].<br />

20


1. Caching<br />

I sistemi di caching “tradizionale” non considerano due informazioni molto<br />

importanti nel caso di contenuti multimediali in streaming:<br />

• la dimensione di un file in streaming (che può raggiungere notevoli<br />

dimensioni, basti pensare che un film in MPEG-2 di due ore può raggiungere<br />

senza troppi sforzi i 6GB);<br />

• il numero di stream contemporanei possibili.<br />

Per questi motivi, tali sistemi di caching tenderebbero, per esempio, a non<br />

memorizzare affatto in cache un file multimediale di grandi dimensioni e a saturare la rete,<br />

rispondendo alle varie richieste di stream in unicast invece che in multicast.<br />

Al fine di risolvere questi ed altri problemi si possono utilizzare tecniche quali:<br />

segmentazione, prefix caching, caching dinamico e la codifica a livelli.<br />

1.3.1 Segmentazione e prefix caching<br />

La tecnica della segmentazione ed il prefix caching sono strettamente legate. La<br />

prima consente di suddividere uno stream multimediale di grandi dimensioni in più parti:<br />

immaginando di avere l’unità minima di allocazione su un disco pari a S, allora ogni stream<br />

può essere visto con una dimensione pari ad un multiplo di S. Questo consente di salvare in<br />

cache in maniera indipendente i segmenti più popolari di uno stream, diminuendo anche la<br />

contesa per lo spazio necessario al caching su disco. La seconda risolve un problema<br />

introdotto dalla prima, consentendo di memorizzare in cache solo determinati segmenti di<br />

uno stream multimediale. Il problema infatti che si viene a creare con la segmentazione è<br />

dovuto al fatto che, a seguito di una richiesta di uno stream, il risultato può essere solo un<br />

hit parziale, dal momento che soltanto alcuni segmenti dei dati richiesti sono presenti in<br />

cache. Quindi, sarà necessario reperire altrove i segmenti mancanti, con il rischio di avere<br />

perdite di sincronizzazione nel flusso multimediale.<br />

A tal fine, si è pensato ad una unità logica di segmentazione dello stream, il chunck.<br />

Esso scompone uno stream in una serie consecutiva di chunk, dove ognuno è composto da<br />

un numero prefissato di segmenti (Fig. 1-2). In tal modo, variando la dimensione del chunk e<br />

tramite l’ausilio del prefix caching, vengono memorizzati preventivamente un certo numero<br />

21


1. Caching<br />

di segmenti per ogni chunk, in modo da consentire il recupero dei segmenti mancanti senza<br />

incorrere nel rischio di ritardi o perdite di sincronia.<br />

Fig. 1-2 - Esempio di segmentazione e prefix caching<br />

1.3.2 Caching dinamico<br />

La tecnica del caching dinamico consente invece lo sfruttamento ottimale di una<br />

trasmissione di dati in streaming multicast. Tale accorgimento inoltre risulta particolarmente<br />

efficace nel caso di video on demand e consiste nel mascherare la distanza temporale<br />

presente tra due richieste successive di uno stesso streaming. Come mostrato in Fig.1-3, il<br />

richiedente R1 ha richiesto un determinato stream al server S al tempo t1. In seguito, al tempo<br />

t2, il richiedente R2 richiede lo stesso oggetto. Al tempo t2 quindi i primi ∆=t2-t1 secondi<br />

dello stream saranno già stati ricevuti da R1. A questo punto, tramite l’ausilio di un buffer<br />

circolare che memorizza una finestra temporale mobile di ∆ secondi a partire dal tempo t2, i<br />

dati inviati ad R1 potranno servire anche per soddisfare la richiesta di R2 ∆ secondi più tardi.<br />

Il buffer circolare quindi nasconde la distanza temporale tra le due richieste, di conseguenza<br />

R2 dovrà solamente limitarsi a richiedere il ∆ di stream mancante tramite una operazione<br />

detta di patching.<br />

22


1.3.3 Codifica a livelli<br />

Fig. 1-3 - Funzionamento del caching dinamico<br />

1. Caching<br />

Parlando del caching di contenuti multimediali non è da sottovalutare l’impatto della<br />

rete sulla trasmissione dei contenuti medesimi. Sono molte infatti le variabili che<br />

influenzano la qualità di un collegamento e che ne provocano un andamento altalenante.<br />

Possono esserci picchi improvvisi di traffico sia sul server fornitore di contenuti che sulla<br />

rete stessa tali da provocare una perdita di sincronia o addirittura una interruzione. Tali<br />

problematiche risultano ancora più evidenti in quelle tipologie di collegamento soggette per<br />

natura a fenomeni di disturbo, come i collegamenti wireless. Per ovviare a tali inconvenienti,<br />

è necessario quindi tenere in considerazione la qualità del collegamento ed eventualmente<br />

adattare dinamicamente la comunicazione.<br />

Una tecnica possibile è quella di codificare a livelli di differente qualità lo stream che<br />

si intende trasmettere, così da potersi adattare dinamicamente ad un cambio di qualità del<br />

collegamento riducendo la qualità dello stream inviato, ovvero trasmettendolo ad un livello<br />

di qualità inferiore. Questo consente di evitare perdite di sincronia o addirittura interruzioni<br />

delle stream, sebbene a scapito della qualità percepita. Inoltre, per non incorrere in ritardi<br />

dovuti al sovraccarico introdotto dalla codifica multilivello dello stream, si può pensare di<br />

adoperarsi [Zha04] al fine di tenere in cache preventivamente lo stream codificato nei vari<br />

livelli di qualità, così da essere pronti a rispondere alle esigenze trasmissive del momento.<br />

23


1.4 Caching cooperativo<br />

1. Caching<br />

Quando i proxy furono introdotti generalmente veniva utilizzato un solo proxy nel<br />

percorso tra il client e l’origin server. Con il passare del tempo e con la crescita della rete il<br />

numero di proxy che si possono attraversare in tale percorso è andato aumentando sempre di<br />

più; non è infrequente trovare in una azienda più di un proxy, a seconda del dipartimento.<br />

Ipotizzando poi di avere un proxy anche dal lato ISP che fornisce la connessione e magari<br />

anche uno davanti all’origin server, il quadro d’insieme diventa più chiaro. Un discorso<br />

analogo può essere anche esteso al caso di connessioni ad Internet: per risparmiare sul costo<br />

della connessione si possono trovare diverse strutture composte da proxy a livello regionale,<br />

facenti capo ad un proxy centralizzato a livello nazionale. Queste gerarchie di cache hanno<br />

lo scopo di limitare il più possibile il traffico all’interno dei confini nazionali di una rete, al<br />

fine sia di limitare la latenza ma anche di mantenere bassi, appunto, i costi di<br />

interconnessione con l’esterno.<br />

Tali gerarchi di cache utilizzano solitamente dei protocolli “leggeri” al fine di<br />

scambiarsi e eventualmente mantenere informazioni sulle risorse disponibili tra i partecipanti<br />

alla gerarchia stessa. Tutti questi protocolli [Kri01] si basano sul principio che il<br />

sovraccarico dovuto al reperimento delle informazioni necessarie e dell’eventuale risorsa<br />

dalle altre cache della gerarchia è comunque minore al tempo necessario per prelevare tale<br />

risorsa direttamente dall’origin server. I protocolli maggiormente utilizzati sono: Internet<br />

Cache Protocol (ICP), Cache Array Resolution Protocol (CARP), Cache Digest Protocol<br />

(Digest) e Web Cache Coordination Protocol (WCCP).<br />

1.4.1 Internet Cache Protocol (ICP)<br />

ICP è un protocollo utilizzato per fare interrogazioni, tramite ICP infatti una cache<br />

client interroga una cache server (tipicamente tramite un messaggio UDP) per sapere se<br />

possiede o meno una copia in cache di un determinato documento. Quindi, in base alla<br />

positività o meno della risposta ed alla sua tempestività la cache client deciderà se prelevare<br />

o meno il documento dalla cache server. Tale modalità di funzionamento ben si adatta al<br />

caso delle gerarchie di cache, dove più cache (a livello regionale per esempio) fanno capo ad<br />

una cache centrale (a livello nazionale). Il funzionamento in tale modalità prevede<br />

24


1. Caching<br />

l’interrogazione di tutte le cache di pari livello (regionali), nel caso non si abbia nessuna<br />

risposta positiva la cache centrale (nazionale) provvede a ripetere la procedura al proprio<br />

livello di appartenenza interrogando le altre cache regionali ed, eventualmente, estendendo a<br />

sua volta l’interrogazione a livelli di cache ad essa superiori. In caso di mancata risposta<br />

positiva o comunque di timeout, la cache scatenante l’interrogazione utilizza come ultima<br />

risorsa l’origin server. Infine, per ottimizzare ulteriormente l’architettura, è previsto che una<br />

cache nel tragitto tra cache client e cache server memorizzi nella propria cache la risorsa<br />

eventualmente trasferita per usi futuri.<br />

Lo svantaggio derivante dall’utilizzo di ICP è dovuto ai ritardi via via crescenti che<br />

vanno a sommarsi ogni volta che la query ICP sale di livello nella gerarchia di cache, dovuti<br />

sia alla latenza introdotta dall’attesa della risposta all’interrogazione ma anche dall’eventuale<br />

percorso a ritroso che deve fare la risorsa una volta individuata.<br />

1.4.2 Cache Array Resolution Protocol (CARP)<br />

CARP definisce un meccanismo attraverso il quale un insieme di cache può<br />

effettivamente funzionare come una unica grande cache a livello logico. Per effettuare il<br />

partizionamento delle url viene utilizzata una funzione di hash che dovrà essere utilizzata<br />

quando il client interrogherà una cache per sapere dove indirizzare la propria richiesta<br />

relativamente ad una determinata risorsa. Tale funzione utilizza l’url della risorsa richiesta e<br />

l’identificativo della cache appartenente alla grande “cache logica” per costruire un percorso<br />

univoco che porta alla risorsa di interesse. Di conseguenza, diversamente dall’ICP, il CARP<br />

utilizza un percorso deterministici per arrivare alla risorsa, eliminando quindi la necessità di<br />

qualsiasi messaggio di interrogazione. Per consentire la comunicazione tra cache CARP<br />

utilizza sia l’http che interfacce di chiamata a procedura remota.<br />

Gli svantaggi derivanti dall’uso di tale architettura sono da ricercarsi<br />

nell’impossibilità di effettuare del load balancing tra le cache, dal momento che non è<br />

possibile trovare la stessa url in due proxy. Sempre per tale motivo, l’uso del CARP può<br />

portare al sovraccarico sistematico di determinati proxy “colpevoli” di contenere le url<br />

maggiormente richieste.<br />

25


1.4.3 Cache Digest Protocol (Digest)<br />

1. Caching<br />

Digest è una estensione dell’ICP. L’idea che ne è alla base è quella di consentire lo<br />

scambio di una sorta di “sommario” (digest appunto) del contenuto di una cache tra le cache<br />

stesse. Un digest quindi altro non è che una sorta di descrizione “stringata” del contenuto di<br />

una cache, un indicatore degli oggetti in essa contenuti. Una volta ottenuti i vari digest<br />

quindi una cache può analizzarli per capire chi è in possesso o meno della risorsa che<br />

necessità, decidendo anche a chi eventualmente indirizzare la richiesta tra tutti quelli che<br />

possiedono tale risorsa. In questo modo una cache può risparmiarsi di contattare le cache che,<br />

secondo i propri digest, non risultano avere disponibile la risorsa in questione.<br />

Il problema che questa architettura viene tuttavia a creare è derivante dai falsi contatti<br />

positivi che possono verificarsi a seguito di un digest non aggiornato. Così come non è da<br />

sottovalutare il sovraccarico della rete dovuto allo scambio continuo di tali informazioni, dal<br />

momento che queste informazioni possono essere diffuse sia su UDP, che tramite semplice<br />

http su TCP quindi.<br />

1.4.4 Web Cache Coordination Protocol (WCCP)<br />

Differentemente da protocolli di alto livello come ICP e CARP, WCCP lavora a<br />

stretto contatto con i protocolli di livello rete: lo scopo del WCCP infatti è quello di<br />

intercettare le richieste http e di ridirezionarle ad un motore di cache, con lo scopo di<br />

bilanciare il carico tra le varie cache presenti. Inoltre, per evitare di inviare richieste ad una<br />

cache non più disponibile, provvede a tenere traccia delle cache attive tramite interrogazioni<br />

periodiche.<br />

Questo meccanismo è implementato come parte del Cisco Cache Engine all’interno<br />

dei router. Tali dispositivi infatti, qualora abilitati all’uso del WCCP, sono capaci di<br />

analizzare l’header IP e di ridirezionare quindi un pacchetto TCP destinato alla porta 80 al<br />

motore di cache che si occuperà poi di indirizzarlo alla cache più adatta.<br />

26


2 Connessioni satellitari<br />

2. Connessioni satellitari<br />

Il progetto su cui verte il lavoro di tesi prevede come scenario di applicazione il caso<br />

di una fornitura di servizi Business To Business: un ISP che rivolge la propria offerta di<br />

connessione ad Internet, tramite canali satellitari su satelliti geostazionari, ad altri ISP che si<br />

trovano in condizioni tali da non poter usufruire di una connessione terrestre a banda larga.<br />

In tali condizioni, spesso dovute ad un posizionamento geografico poco “fortunato”, una<br />

connessione satellitare risulta essere la via più rapida e “indolore” per ottenere un<br />

collegamento ad Internet veloce.<br />

In questo capitolo verranno inizialmente evidenziati i problemi che normalmente<br />

caratterizzano una connessione ad alta latenza come quella satellitare (2.1) e in seguito<br />

analizzate (2.2) alcune tra le soluzioni proposte per il superamento di tali problemi: quali la<br />

soluzione del consorzio AI3 (2.2.1), quella di Hughes Network System (2.2.2), la soluzione<br />

di INTELSAT (2.2.3) e infine quella di SatCAST (2.2.4). Il fine è quello di mostrare<br />

l’evoluzione del mercato e gli sviluppi che ci sono stati nel corso degli anni relativamente<br />

alle architetture di proxying/caching per canali di trasmissione satellitari, ma anche quello di<br />

trarre spunto e insegnamento dalle esperienze passate, evidenziando gli elementi più<br />

interessanti emersi nel corso dell’analisi (2.3).<br />

2.1 Problematiche di una connessione satellitare<br />

La natura del canale satellitare (broadband), attraverso l’utilizzo di satelliti<br />

geostazionari, consente di creare facilmente delle connessioni con una ampia copertura,<br />

nonché di trasmettere simultaneamente molteplici informazioni.<br />

Tuttavia, l’utilizzo del canale satellitare non è privo di problematiche, prima fra tutte<br />

la latenza insita nel canale stesso [Bha04]. L’utilizzo di satelliti geostazionari e la loro<br />

distanza dalla terra provoca dei ritardi nella propagazione delle onde tra il satellite e una<br />

stazione terrestre (e viceversa), quantificabili nell’ordine di un ottavo di secondo. E’ quindi<br />

facile calcolare che il RTT di una connessione satellitare si attesta nell’ordine del mezzo<br />

secondo (che corrispondono a circa un ottavo di secondo sia per la tratta di uplink sia per la<br />

tratta di downlink e quindi, un totale di mezzo secondo per andare e tornare). Questa latenza<br />

27


2. Connessioni satellitari<br />

viene poi ulteriormente amplificata, soprattutto nel caso di utilizzo del protocollo HTTP, da<br />

altri fattori quali:<br />

• Three-Way-Handshaking del TCP (sul quale poggia l’HTTP), necessario per<br />

effettuare una connessione client-server;<br />

• Maximum Segment Size (MSS) del TCP che tipicamente ammonta a 536 byte,<br />

costringendo alla divisione di una singola richiesta HTTP in più segmenti;<br />

• Slow Start Algorithm del TCP che, per le nuove connessioni o anche in caso<br />

di timeout, rallenta la trasmissione iniziale;<br />

• Controllo del flusso proprio del TCP che impedisce l’invio di nuovi dati se<br />

non si è ricevuto un ACK dei precedenti.<br />

Tutto ciò evidenzia come una richiesta HTTP possa aver bisogno di numerosi RTT<br />

prima di essere soddisfatta, soprattutto nel caso di pagine Web composte da diversi oggetti,<br />

rendendo quindi la navigazione web una esperienza poco “piacevole”.<br />

2.2 Soluzioni possibili<br />

Considerati i problemi precedentemente descritti, la strada che si è cercato di<br />

intraprendere porta al mascheramento della latenza insita nel canale satellitare, al fine di<br />

rendere la navigazione attraverso questa tipologia di connessioni quanto più vicina possibile<br />

ad una navigazione tramite connessioni terrestri. A tal fine, risulta evidente come l’utilizzo<br />

di un proxy possa essere di grande aiuto nella soluzione del problema: opportunamente<br />

posizionato (a valle di una connessione satellitare) esso può fornire direttamente i contenuti<br />

richiesti, eliminando la necessità di transitare per il canale satellitare.<br />

Diverse sono state le architetture proposte e sviluppate in tal senso, di seguito ne<br />

vengono descritte alcune tra le più significative.<br />

2.2.1 AI3 Network: Adaptive WWW Caching<br />

La Asian Internet Interconnection Initiatives (AI3) è una testbed network<br />

[Ino96],[Ino97] costituita da un consorzio di diversi istituti di ricerca della regione asiatica,<br />

tra i quali il NAIST (Nara Institute of Science and Technology, Giappone), l’AIT (Asian<br />

28


2. Connessioni satellitari<br />

Institute of Technology, Thailandia), l’ITB (Institut Teknologi Bandung, Indonesia) e<br />

HKUST (Hong Kong University of Science and Technology, Hong Kong). L’installazione<br />

della rete è iniziata nel 1996 e in Fig.2-1 è possibile notare lo stato attuale della stessa e la<br />

sua topologia. Attualmente, la stazione di terra, così come l’hub principale, è localizzata<br />

presso il NAIST in Giappone; da qui si diramano diversi link a 1.5Mbps verso l’Indonesia,<br />

Honk Kong, la Thailandia ed altri paesi partner. Il protocollo implementato è l’IPv4, ma,<br />

vista la proprio natura (testbed network), saranno implementati anche IPv6 e altre tecnologie<br />

quali RSVP e M-Bone. Tra le varie ricerche portate avanti ci sono, appunto, quelle<br />

riguardanti il caching di contenuti web.<br />

In questa testbed network è presente una struttura di caching articolata in due livelli.<br />

Il primo livello (Hub Cache) è rappresentato da un centro di trasmissione in Giappone,<br />

direttamente connesso ad Internet tramite una connessione T3 e collegato via satellite con le<br />

varie cache di secondo livello (Rim Cache), sparse per il continente asiatico, tramite una<br />

connessione satellitare bidirezionale asimmetrica, che prevede una velocità in downstream di<br />

1.5Mbps e in upstream di 512Kbps.<br />

Fig. 2-1 - AI3 Testbed Network<br />

29


2. Connessioni satellitari<br />

L’architettura utilizzata (Fig.2-2) prevede l’utilizzo del prefetching sia lato Hub<br />

cache sia lato Rim cache, tramite un meccanismo di caching adattativo. Questo perché, per<br />

quanto il prefetching costituisca una valida soluzione al problema della latenza del canale<br />

satellitare, non si può non considerare l’aumento di traffico apportato dall’utilizzo di una tale<br />

soluzione. Da notare infatti come un server situato al NAIST, attraverso l’utilizzo del<br />

prefetching abbia incrementato del 20% l’Hit Rate, aumentando tuttavia anche il traffico<br />

Web del 200%. A tale scopo, l’AI3 ha proposto dei meccanismi di “smart caching” o<br />

caching adattativo allo scopo di migliorare la latenza dei link satellitari più lenti, tramite<br />

l’utilizzo del prefetching basato su pattern di accesso precedenti, accesso ritardato,<br />

aggiornamento automatico notturno (momento di minor carico) e compressione dei file.<br />

Tale meccanismo di caching analizza i log di accesso per decidere le risorse sulle<br />

quali effettuare il prefetching. Mentre sulla Hub cache il prefetching è effettuato solamente<br />

nei momenti di minor carico, sulle Rim cache, invece, è attivo un agente che attua il<br />

prefetching in maniera più sofisticata.<br />

I compiti dell’agente infatti prevedono:<br />

• analisi dei log per la determinazione degli oggetti sui quali effettuare il<br />

prefetching, costruendo degli schemi di accesso che legano gli oggetti<br />

strutturati (per esempio le pagine Web che contengono al loro interno link ad<br />

altre pagine e/o oggetti) a quelli che essi stessi referenziano direttamente,<br />

associando anche la frequenza delle referenze medesime;<br />

• tenere traccia delle dimensioni di un file e del tempo necessario al suo<br />

reperimento, in modo da decidere dinamicamente l’eventuale convenienza<br />

nell’effettuare il prefetching dello stesso (per esempio, se il tempo per<br />

scaricare un file risulta comunque molto superiore al RTT della connessione<br />

satellitare, non ne viene eseguito il prefetching);<br />

• analisi del traffico e della congestione del canale satellitare, al fine di decidere<br />

l’eventuale posticipazione delle operazioni di prefetching in un momento in<br />

cui il canale sia meno congestionato;<br />

• monitoraggio della cache ad esso associata in modo da rilevare eventuali<br />

rallentamenti dovuti alla congestione della stessa e tali da richiedere quindi<br />

una operazione di manutenzione, portando all’eliminazione dei file più vecchi.<br />

30


Fig. 2-2 - Architettura della soluzione AI3 per il web caching<br />

2.2.2 Hughes Network Systems: Cumulative Caching<br />

2. Connessioni satellitari<br />

Gli studi condotti dalla Hughes Network Systems insieme alla NASA hanno lo scopo<br />

di ridurre, tramite un meccanismo di Cumulative Caching, la latenza percepita da un gruppo<br />

di utenti che utilizzino un sistema di navigazione satellitare fornito dalla Hughes Network<br />

Systems stessa, avente come target una utenza di tipo SO-HO [Bha04] (Small Office-Home<br />

Office, utenza costituita da piccoli uffici, spesso abitazioni private).<br />

I presupposti alla base di tale meccanismo di caching sono forniti da alcuni studi<br />

[Mog97], che hanno portato in evidenza che:<br />

• utenti appartenenti ad una stessa area geografica sono portati a visitare gli<br />

stessi siti web, a causa spesso di ragioni relative al mirroring dei siti stessi;<br />

• utenti appartenenti ad uno stesso ambito lavorativo tendono a visitare una<br />

stessa tipologia di siti web.<br />

L’algoritmo di cumulative caching quindi è stato pensato sulla base di tali<br />

considerazioni e sugli studi relativi all’applicabilità alla navigazione web del principio di<br />

Pareto (anche noto come regola dell’80/20), in base al quale l’80% circa delle richieste<br />

HTTP sono dirette verso il 20% delle risorse disponibili, mentre il rimanente 20% delle<br />

31


2. Connessioni satellitari<br />

richieste è diretto verso il rimanente 80% delle risorse. Lo scopo del caching cumulativo<br />

quindi è stato quello di riuscire a salvare in cache almeno quel 20% delle risorse online, che<br />

però consente all’80% degli utenti di non percepire la latenza del canale.<br />

Il sistema di navigazione satellitare considerato come target dagli ideatori di questo<br />

algoritmo è lo Spaceway della Hughes Network Systems (Fig.2-3), costituito da un sistema<br />

di connessione ad Internet tramite link satellitari (satelliti geostazionari) bidirezionali a larga<br />

banda. In prospettiva di utilizzo SO-HO, è stata prevista la possibilità di integrare le<br />

funzionalità di caching cumulativo direttamente all’interno del set-top box che lavora a<br />

livello network ed è direttamente collegato al ricevitore satellitare. Fornendo infatti tale<br />

apparecchiatura di una memoria addizionale e consentendogli di lavorare a livello<br />

applicativo, sarebbe possibile realizzare quanto richiesto. Tuttavia, tale soluzione, potrebbe<br />

risultare economicamente svantaggiosa per il fornitore di servizi, poiché il costo del set-top<br />

box aumenterebbe in maniera proporzionale allo spazio di cui viene dotato. Opzionalmente,<br />

quindi, è stata prevista la possibilità di implementare la soluzione di caching cumulativo<br />

direttamente all’interno del computer di un utente, dove parte della memoria, attraverso un<br />

processo demone, potrebbe essere assegnata a tale scopo.<br />

Il principio che è alla base dell’algoritmo di caching cumulativo è alquanto<br />

semplice: memorizzare in cache tutto quello che viene richiesto. Il suo funzionamento<br />

prevede lo svuotamento della cache ogni 24 ore, nel momento di minor utilizzo del sistema,<br />

e il successivo riempimento con tutto quello che è stato visitato dagli utenti.<br />

Fig. 2-3 - Hughes Network Systems SPACEWAY<br />

32


2. Connessioni satellitari<br />

Il funzionamento dell’architettura è il seguente: quando lo stesso client o un altro<br />

client richiedono una stessa pagina, viene restituita la versione memorizzata nella cache<br />

locale. Allo stesso tempo, viene inviato il timestamp della pagina richiesta attraverso il<br />

canale satellitare fino al Network Operation Center (NOC). Qualora questo abbia una<br />

versione più recente di tale pagina in cache, provvede ad inviarla al client attraverso il canale<br />

satellitare, quest’ultimo genera la nuova pagina e provoca un auto-refresh del browser.<br />

Simultaneamente, il NOC controlla se esiste online una versione più aggiornata della<br />

suddetta pagina e, in caso affermativo, si occupa di inviarla ancora una volta al client che a<br />

sua volta la aggiornerà al browser. Infine, il NOC aggiorna e controlla le pagine che ha<br />

salvato in cache, indipendentemente dalle richieste del client.<br />

Questo algoritmo di caching cumulativo è differente dal prefetching, in quanto molto<br />

più semplice. Non è presente infatti nessun algoritmo di fetching, semplicemente le pagine<br />

che non sono mai state richieste prima vengono prelevate direttamente online.<br />

E’ tuttavia interessante notare come, nonostante la sua apparente semplicità, i risultati<br />

ottenibili da tale architettura possono portare benefici consistenti, in termini di riduzione<br />

della latenza percepita, oscillanti tra il 40% e il 70%.<br />

2.2.3 INTELSAT Internet Delivery System (IDS)<br />

L’Internet Delivery System della INTELSAT (che possiede il più grande sistema<br />

commerciale di comunicazioni satellitari) è una implementazione prototipale del concetto di<br />

wormhole caching. Iniziato come un progetto di ricerca e sviluppo volto ad evidenziare la<br />

natura broadcast del canale satellitare, si è evoluto in una piattaforma di web caching<br />

multicast. In questa piattaforma, i contenuti web sono inviati in pushing o in prefetching in<br />

grossi repository (Warehouse) localizzati vicino ai fornitori di servizi. Tale contenuto Web<br />

viene quindi inviato in pushing attraverso IP multicast su link satellitari ai Kiosk, distribuiti<br />

in tutto il mondo, che ne avevano fatto sottoscrizione. Un canale di ritorno dal Kiosk alla<br />

Warehouse è utilizzato per costruire dinamicamente canali di push.<br />

Le motivazioni che hanno condotto gli studi della INTELSAT [Mat99] si basano<br />

sull’idea che, attualmente, non c’è una distribuzione uniforme del traffico in Internet: client<br />

di ogni paese del mondo accedono a contenuti che vengono prodotti in pochi regioni dello<br />

33


2. Connessioni satellitari<br />

stesso. Lo scopo dell’architettura proposta è quindi quello di creare dei veri e proprio canali<br />

preferenziali multicast nello spazio (wormhole caching), al fine di “saltare” i lenti e<br />

imprevedibili percorsi internazionali che si diramano attraverso numerosi router, bridge e<br />

switch.<br />

L’IDS della INTELSAT [Che99] quindi, come precedentemente accennato, è basato<br />

su un paradigma di caching a due livelli (Warehouse-Kiosk), e fornisce accesso globale e<br />

canali preferenziali attraverso la flotta di satelliti della INTELSAT stessa. Contenuti come<br />

oggetti Web, FTP o streaming vengono scaricati o “spinti” (pushing), sia attivamente che<br />

reattivamente, in un repository centrale attraverso degli agenti web intelligenti. Oggetti<br />

“freschi” vengono costantemente inviati attraverso IP Multicast a cache Kiosk registrate.<br />

Il sistema IDS della INTELSAT si compone di quattro elementi principali:<br />

1. Content Management Subsystem: una interfaccia web che fornisce<br />

funzionalità per configurare, controllare il sistema e gestire i contenuti web,<br />

quali la registrazione, la categorizzazione e la creazioni di canali di contenuti,<br />

nonché l’analisi statica dell’utilizzo degli oggetti web nel sistema.<br />

2. Persistent Storage Subsystem: un database relazionale orientato al caching<br />

che immagazzina i metadati degli oggetti web, i log di utilizzo e altre<br />

informazioni come i contenuti delle categorie e i canali sottoscritti.<br />

3. Multicast Transmission Subsystem: un sistema di trasmissione multicast<br />

affidabile con capacità di scheduling, accorpamento dei contenuti e<br />

compressione/decompressione degli stessi.<br />

4. Web Caching Subsystem: un sistema di caching a due livelli (Fig.2-4), basato<br />

su Squid [Squ05a] che implementa agenti intelligenti e un nuovo metodo di<br />

pushing insieme al tradizionale meccanismo di caching. Lato warehouse è<br />

presente una cache centrale che si interfaccia con i content provider, mentre<br />

lato Kiosk sono utilizzate delle web cache che accettano sia richieste push sia<br />

le più tradizionali richieste pull.<br />

34


Fig. 2-4 - Architettura INTELSAT IDS<br />

2. Connessioni satellitari<br />

Gli elementi di maggior interesse, nonché i più caratterizzanti l’architettura della<br />

INTELSAT sono il reactive caching ed il metodo HTTP PUSH.<br />

Il primo consiste in una serie di processi distribuiti atti a raccogliere ed analizzare i<br />

comportamenti degli utenti registrati ai Kiosk, in modo da adattarsi dinamicamente al<br />

comportamento degli stessi. Periodicamente, ogni Kiosk invia le proprie statistiche locali di<br />

accesso web alla Warehouse. Questa possiede l’intelligenza necessaria a reagire a nuove<br />

attività o a picchi improvvisi, secondo un algoritmo apposito che prende in considerazione il<br />

numero di Kiosk e il numero di utenti al fine di decidere quando un nuovo documento può<br />

essere ritenuto popolare. A questo punto, tale documento viene aggiunto dinamicamente ad<br />

un canale di push, che verrà in seguito aggiornato in multicast ai Kiosk. Qualora la pagina<br />

non fosse più ritenuta popolare, tale documento viene rimosso da qualsiasi canale di push al<br />

quale era stato precedentemente aggiunto.<br />

Il metodo HTTP PUSH, proposto come aggiunta agli altri già presenti nel protocollo<br />

HTTP, consente l’inserimento diretto di oggetti nella cache Warehouse e in quella dei Kiosk,<br />

aumentando le semplici funzionalità “pull” offerte dalle cache tradizionali. Al fine di<br />

35


2. Connessioni satellitari<br />

effettuare l’operazione, è necessario un client-push abilitato che invia alla cache una<br />

richiesta PUSH. Questa, similmente ad una normale PUT HTTP, contiene un header e un<br />

body con l’oggetto da inviare. La cache, al momento della ricezione di una PUSH, controlla<br />

in una Push Control List (PCL) se il client è autorizzato, prima di processare la richiesta<br />

stessa. Verificata l’autorizzazione, se l’oggetto è già presente in cache, ne viene verificata la<br />

“freschezza” e quindi eventualmente viene sostituito quello già presente (caso di risposta<br />

HTTP con un codice 207, PUSH created). Nel caso l’oggetto non fosse invece presente in<br />

cache, viene in essa memorizzato (caso di risposta HTTP con un codice 200, OK). Quindi<br />

questo metodo, come mostrato in Fig.2-5, consente di inserire un oggetto HTTP, ricevuto<br />

tramite un canale multicast o una altra sorgente, direttamente all’interno di una catena di<br />

proxy in modo rapido ed efficiente, senza richiedere l’intervento diretto dell’utente.<br />

Fig. 2-5 - Uso del pushing in una catena di proxy<br />

2.2.4 SatCAST: multicast via satellite per applicazioni web<br />

Il sistema SatCAST [Lin01] è stato sviluppato dalla West Consulting B.V. e<br />

dall’Università di Salisburgo, nell’ambito del programma Advanced Satellite Technology<br />

(ASTE) dell’Agenzia Spaziale Europea (ESA).<br />

L’idea alla base di tale progetto risiede nella considerazione che, attualmente, una<br />

parte sostanziale del traffico Internet viene da applicazioni dove dei client richiedono oggetti<br />

che risiedono su server. Quindi, il caching di tali oggetti vicino a tali client è una tecnica<br />

importante per ridurre sia il traffico di rete che il tempo di risposta di questo tipo di<br />

applicazioni. Tuttavia, l’utilizzo di tecniche normalmente applicate alle reti terrestri, non<br />

consente di trarre grandi benefici, vista la sostanziale differenza nella distribuzione del<br />

tempo nei canali satellitari. Di conseguenza, i canali satellitari, grazie alla propria natura<br />

broadcast, devono essere trattati differentemente dalle reti terrestri, sfruttando, appunto, le<br />

36


2. Connessioni satellitari<br />

caratteristiche proprie di questo mezzo di trasmissione e tenendo però in debita<br />

considerazione le peculiarità relative ai tempi di risposta.<br />

Per portare avanti questo progetto è stata utilizzata nell’ambito dell’UNEP (United<br />

Nation Enviroment Programme) la rete di telecomunicazioni Mercure, composta da un serie<br />

di stazioni terrestri comunicanti attraverso canali satellitari bidirezionali su satelliti<br />

INTELSAT. Attualmente, sono state costruite 16 stazioni presso le seguenti località:<br />

Antwerpen, Vienna, La Paz, Havana, San Jose, Geneva/Leuk, Nairobi, Arendal, Beijing,<br />

Bangkok, Hanoi, Kathmandu, Maputo, Manama e Almaty. Infine, è presente una struttura di<br />

controllo posizionata in Svizzera per assicurare un livello di servizio uniforme a prescindere<br />

dalle differenti reti pubbliche. In Fig.2-6 è mostrata la parte centrale della topologia di rete,<br />

costituita da siti interconnessi permanentemente tramite dei link satellitari a 128Kbps o<br />

384Kbps<br />

Fig. 2-6 - Topologia dei core-link della rete Mercure<br />

La rete implementa IPv4 e la propria filosofia di funzionamento è quella di “servizio<br />

locale per utenti locali”. Con questo si intende che le informazioni create e aggiornate nei<br />

diversi siti della rete (pagine Web o database dai quali vengono create le pagine Web stesse)<br />

vengono aggiornate regolarmente in maniera automatica, inviandole agli altri nodi della rete.<br />

Questo permette a chi ricerca informazioni un accesso facilitato e rapido attraverso qualsiasi<br />

37


2. Connessioni satellitari<br />

nodo della rete. Fino alle modifiche apportate dalla SatCAST, gli aggiornamenti dei database<br />

venivano effettuati in modalità punto-punto, tramite l’utilizzo del protocollo TCP. Al fine di<br />

ottimizzare l’utilizzo dei link satellitari, quest’ultima ha sviluppato un sistema di proxying<br />

basato su un meccanismo di pushing multicast, rimpiazzando il TCP tramite un protocollo di<br />

multicast affidabile.<br />

Infatti, un modo efficace per effettuare operazioni di replicazione di dati è quello di<br />

utilizzare un protocollo di multicast come protocollo di livello transport tra i proxy, fermo<br />

restando la possibilità per la rete sottostante di utilizzare il multicast su protocollo IP. In tal<br />

modo, è possibile effettuare un’unica trasmissione dei dati, mentre con un più tradizionale<br />

protocollo unicast il numero di trasmissioni dipende direttamente dal numero di riceventi e<br />

può portare quindi rapidamente a problemi di scalabilità. Tuttavia, il multicast è stato finora<br />

sempre utilizzato per applicazioni quali lo streaming audio e video, che quindi non<br />

necessitavano di una particolare affidabilità implementandola a livello applicativo. Nel caso<br />

di replicazione di dati (del quale la cache costituisce una particolare specializzazione) è<br />

sicuramente conveniente avere la possibilità di utilizzare un protocollo di multicast affidabile<br />

a livello transport. Proprio in questo ambito ha operato la SatCAST attraverso<br />

l’implementazione del RRMP, Restricted Reliable Multicast Protocol.<br />

L’architettura sviluppata prevede l’utilizzo del proxy server Squid, coadiuvato da<br />

agenti di multicast MCast che agiscono come peer-cache per Squid e comunicano tra di loro<br />

attraverso il protocollo RRMP. Questo protocollo utilizza un trasferimento dati senza prima<br />

effettuare alcuna connessione di rete, questo al fine di evitare i problemi derivanti<br />

dall’utilizzo di una procedura di handshake, ovvero l’introduzione di un ritardo significativo,<br />

soprattutto nei casi di brevi trasmissioni di dati su link ad alta latenza, come quelli satellitari.<br />

Inoltre, la SatCAST ha provveduto a rendere affidabile tale protocollo di multicast attraverso<br />

l’utilizzo di differenti schemi di controllo di errore, per adattarsi alle necessità delle varie<br />

applicazioni:<br />

• multicast semi-affidabile, attraverso l’uso della tecnica di Forward Error<br />

Correction (FEC);<br />

• multicast completamente affidabile, attraverso l’utilizzo del FEC,<br />

congiuntamente ad un meccanismo di un ARQ (Automatic Request-<br />

Response) basato su Negative Aknowledgement (NAK). Il funzionamento<br />

38


2. Connessioni satellitari<br />

prevede, nel caso del rilevamento di una errore (perdita di dati) da parte del<br />

ricevente, l’invio di un NAK al mittente. Questo risponderà con dei pacchetti<br />

FEC al fine di permettere al ricevente di ricostruire quanto perso;<br />

• multicast affidabile e proattivo, combinazione dei due precedenti. In questa<br />

modalità, i dati FEC sono sempre inviati insieme ai dati originali.<br />

Fig. 2-7 - Archietettura della SatCAST con Squid e agenti MCast<br />

In Fig.2-7 è mostrato un esempio di funzionamento dell’architettura della SatCAST.<br />

Procedendo per ordine:<br />

1. Un client invia una richiesta HTTP per una URL.<br />

2. Squid (supponendo di non avere a disposizione il file in cache) ricerca<br />

all’interno del proprio file di configurazione il cache-peer al quale inoltrare la<br />

richiesta (il proprio agente MCast).<br />

3. Squid inoltra la richiesta al proprio agente MCast.<br />

39


2. Connessioni satellitari<br />

4. L’agente MCast inoltra la richiesta in multicast attraverso la rete satellitare.<br />

5. Gli agenti MCast agli altri capi dei link ricevono le richieste e le inoltrano ai<br />

propri Squid.<br />

6. Squid ricerca all’interno del proprio file di configurazione se la richiesta è<br />

indirizzata localmente:<br />

a. in caso affermativo, invia la richiesta HTTP al server WWW locale<br />

che possiede i dati;<br />

b. altrimenti, invia la richiesta HTTP al proprio agente MCast locale. [il<br />

prossimo passo è il passo 10]<br />

7. Il server WWW locale invia la risposta HTTP a Squid.<br />

8. Squid invia la risposta HTTP al proprio agente locale MCast.<br />

9. L’agente MCast invia la risposta in multicast alla rete satellitare.<br />

10. Gli agenti MCast agli altri capi dei link ricevono le risposte e le inviano ai<br />

propri Squid.<br />

11. Squid memorizza la risposta nella cache locale.<br />

12. Squid invia le risposte HTTP:<br />

a. al client (se il client ha effettuato la richiesta HTTP);<br />

b. all’agente MCast (se l’agente MCast ha effettuato la richiesta HTTP).<br />

2.3 Considerazioni sulle soluzioni proposte<br />

Nella sezione precedente sono state descritte alcune tra le soluzioni più significative<br />

nell’ambito dei sistemi di proxying/caching per contenuti fruibili attraverso connessioni<br />

satellitari. Da una prima analisi risultano evidenti diversi elementi caratterizzanti le soluzioni<br />

mostrate, dai quali è stato possibile trarre spunto per una successiva fase di progettazione:<br />

• un sistema di proxying/caching su doppio livello, un primo livello a monte<br />

del satellite e un secondo livello a valle del satellite;<br />

• sfruttamento massimo di un’architettura su due livelli, spesso utilizzando un<br />

unico livello superiore (a monte del satellite) per numerosi livelli inferiori (a<br />

valle del satellite);<br />

40


2. Connessioni satellitari<br />

• utilizzo di Squid [Squ95a] come software proxy server, uno tra i più diffusi e<br />

riconosciuti (nonché open source);<br />

• uso di tecniche di pushing o prefetching al fine di mascherare la latenza insita<br />

nella natura stessa del canale satellitare;<br />

• utilizzazione del multicast come complemento ideale alle tecniche di pushing,<br />

allo scopo di ottimizzare al massimo lo sfruttamento della banda;<br />

• tecniche di analisi del traffico in modo da consentire una selezione mirata<br />

delle informazioni necessarie, prelevate in seguito attraverso pushing o<br />

prefetching.<br />

E’ infine interessante notare come la maggior parte delle soluzioni analizzate sono<br />

state sviluppate in un periodo di tempo relativamente breve, tra il 1996 e il 2001. Segno<br />

evidente di come, con il passare del tempo, sia sempre più diffusa la connessione a larga<br />

banda, tale da rendere economicamente poco “appetibile” l’utilizzo di una connessione<br />

satellitare in ambito trasmissione dati.<br />

41


3. Progettazione e architettura del sistema SatSquid<br />

3 Progettazione e architettura del sistema<br />

SatSquid<br />

Tutta la fase di definizione e progettazione dell’architettura di caching satellitare<br />

SatSquid è stata guidata principalmente dai problemi derivanti dalla natura del canale<br />

trasmissivo utilizzato: la connessione satellitare. Il problema più grande da affrontare, nel<br />

caso di utilizzo di tale mezzo di comunicazione, è infatti la latenza insita nel canale stesso,<br />

ben 500msec di ritardo per ogni richiesta, che si vanno a sommare al ritardo normalmente<br />

necessario ad esaudire la richiesta stessa. Se consideriamo tutte le interazioni necessarie<br />

anche solo per scaricare una semplice pagina web, ci rendiamo conto che tale ritardo diventa<br />

“insopportabile” per un utente che si accinge ad utilizzare tale mezzo per navigare su<br />

Internet. Lo scopo principale che si è cercato di raggiungere è stato quindi il mascheramento<br />

di tale latenza. A tal proposito in questo capitolo saranno inizialmente mostrati quelle che<br />

sono state le ipotesi e le problematiche di partenza (3.1), quindi le scelte di progetto fatte per<br />

risolvere tali problematiche, quali la scelta del software di proxy server da utilizzare (3.1.1),<br />

l’utilizzo di un doppio livello di caching (3.1.2) e di una doppia istanza di Squid (3.1.3), la<br />

scelta del meccanismo atto a mascherare la latenza del canale (3.1.4), l’uso di una tecnica di<br />

content switching per smistare le richieste (3.1.5), la logica di controllo alla base del<br />

funzionamento dell’architettura (3.1.6) e infine un attento dimensionamento hardware<br />

dell’impianto (3.1.7). Verranno quindi presentate le possibili architetture derivanti dalle<br />

scelte effettuate in fase di progetto (3.2), pushing vs. prefetching (3.2.1), la tecnologia<br />

impiegata per effettuare l’indirizzamento delle richieste (3.2.2) e la possibilità di un sistema<br />

dedicato per il mirroring dei siti (3.2.3). Infine sarà presentata l’architettura scelta (3.3).<br />

3.1 Le scelte progettuali<br />

Prima di iniziare a discutere la progettazione del sistema di caching satellitare<br />

SatSquid, è necessario inquadrare meglio il contesto di utilizzo di tale sistema, quello<br />

dell’Internet Service Providing. L’azienda committente vuole infatti proporsi come fornitrice<br />

di connettività attraverso canali satellitari a tutti quegli Internet Service Provider che per<br />

motivi vari non possono utilizzare connettività terrestre a larga banda. L’interesse di tale<br />

42


3. Progettazione e architettura del sistema SatSquid<br />

iniziativa è anche rivolto verso quelle aziende in forte espansione, con una vasta presenza sul<br />

territorio e che hanno quindi la necessità di collegare tra loro le sedi periferiche con la sede<br />

centrale, eliminando la necessità di transitare sulla rete pubblica, sia per questioni di<br />

sicurezza dei dati in transito, sia per ridurre la possibilità di ritardi o difficoltà di connettività<br />

non direttamente controllabili.<br />

Lo scopo principale è quindi quello di rendere “appetibile” l’offerta del servizio di<br />

caching satellitare, cercando di avvicinare quanto più possibile la qualità del servizio offerta,<br />

percepita dall’utente finale, da una connessione satellitare ad una normalmente offerta da reti<br />

cablate.<br />

A questo punto, è necessario sottolineare quelli che sono stati i presupposti alla base<br />

del progetto, direttamente forniti dal committente:<br />

• basso costo delle capacità di storage: attualmente è diventato abbastanza<br />

economico assemblare sistemi con capacità disco nell’ordine dei terabyte;<br />

• larga banda satellitare a disposizione: l’intenzione dietro questa ipotesi è<br />

quella di costruire un satellite espressamente dedicato alla trasmissione dati,<br />

quindi appositamente bilanciato sulla base delle necessità operative.<br />

Come sarà meglio evidenziato in seguito, nonostante queste due ipotesi siano state<br />

tenute in grande considerazione durante tutta la fase di progettazione, non è stato possibile<br />

avvantaggiarsi da entrambe, ma solamente dalla prima. Infatti, la possibilità di avere a<br />

disposizione uno spazio disco di grande dimensioni, non necessariamente porta benefici al<br />

caching.<br />

Le problematiche da affrontare sono state principalmente due:<br />

• ritardo insito nella natura stessa del canale satellitare;<br />

• necessità di avere funzionalità di mirroring di siti web (richiesta esplicita del<br />

committente).<br />

Sulla base delle ipotesi e delle problematiche di partenza, sono state effettuate tutte le scelte<br />

progettuali, che vengono descritte nelle sezioni successive.<br />

43


3.1.1 La scelta del proxy: Squid<br />

3. Progettazione e architettura del sistema SatSquid<br />

Come evidenziato precedentemente, il problema principale da risolvere era relativo<br />

alla latenza del canale satellitare. In tal senso, l’utilizzo di un sistema di proxy sicuramente<br />

consente di trarre beneficio dall’uso della cache, al fine di ridurre il numero di richieste<br />

instradate attraverso la connessione satellitare.<br />

Diverse erano le possibilità di scelta del software da usare per la realizzazione del<br />

sistema: sicuramente si è cercato di dare maggiore preferenza alle soluzioni open source, in<br />

quanto più facilmente accessibili e anche eventualmente modificabili, grazie alla<br />

disponibilità del codice sorgente, in tal senso, le scelte si sono subito ristrette all’uso di<br />

quello che viene oggigiorno considerato uno dei migliori proxy server sul mercato: Squid<br />

[Squ05a].<br />

Squid è il più conosciuto, nonché il più utilizzato tra i proxy server attualmente in<br />

commercio, il suo codice sorgente è libero e fornisce funzionalità di caching e proxing per il<br />

traffico HTTP, FTP e Gopher. Squid può anche essere utilizzato come motore HTTP/HTTPS<br />

per eseguire avanzate tecniche di reverse proxy. Il progetto nasce come evoluzione di CERN<br />

HTTP Server, che già nel 1994 includeva un modulo per la gestione della cache. Questo<br />

modulo, implementato nel progetto Harvest, fu realizzato nel 1994 al fine di migliorare i<br />

sistemi di gestione della cache. Tuttavia ebbe vita breve, visto che venne sciolto l'anno<br />

successivo. In seguito, venne ripreso sia per scopi commerciali (Network Appliance) sia per<br />

scopi scientifici, determinando la nascità di Squid. Duane Wessels è l'autore di Squid.<br />

Durante il lavoro svolto presso il National Laboratory of Applied Network Research<br />

(NLANR), all'interno del gruppo Information Resource Caching (IRcache) fondato dalla<br />

National Science Foundation, Wessels riprese in mano il progetto originario Harvest e lo<br />

rinominò in Squid, rilasciandolo secondo l'accordo di licenza GPL (General Pubblic<br />

License). Attualmente, Squid viene sviluppato da una vasta schiera di sviluppatori, tra questi<br />

i più importanti sono Henrik Nordstrom, Robert Collins, Adrian Chadd e Joe Cooper.<br />

Sicuramente peculiare è stata la scelta del nome per tale proxy server: per distinguere questo<br />

nuovo prodotto da quello realizzato dalla Harvest, Duane Wessels decise di chiamarlo con il<br />

nome del progetto iniziale: Squid ovvero "il calamaro". Henrik Nordstrom, uno dei migliori<br />

hacker del progetto Squid, a tale proposito afferma: "il nome Squid non è una abbreviazione,<br />

il calamaro è un animale marino che in qualche modo si comporta proprio come il nostro<br />

44


3. Progettazione e architettura del sistema SatSquid<br />

proxy. Le cache gerarchiche ed il protocollo Internet Cache Protocol (ICP) possono essere<br />

paragonati ai tentacoli utilizzati da un calamaro per fare suo tutto quello che lo interessa".<br />

3.1.2 Due livelli di caching<br />

L’uso di un semplice proxy non consente tuttavia di ottenere il risparmio desiderato<br />

in termini di latenza percepita. Infatti, nonostante sia possibile ottenere dei valori di hit<br />

prossimi anche al 40%, gran parte delle richieste transiterebbero ancora su sul canale<br />

satellitare e quindi, al normale ritardo necessario al soddisfacimento della richiesta, si<br />

sommerebbe il ritardo del canale stesso. Per ovviare alla limitazione sull’hit rate, si è pensato<br />

di adottare un sistema di caching su due livelli (Fig.3-1), uno lato Content Broker<br />

(distributore di contenuti, nel caso in esame Telespazio) e uno lato Service Provider<br />

(fornitore di connettività agli utenti finali). L’utilizzo di una tale soluzione è stato valutato<br />

anche sulla base delle esperienze positive raccolte durante la fase di analisi delle soluzioni<br />

offerte dal mercato (Capitolo 2).<br />

L’architettura su due livelli consente di raggiungere un duplice scopo:<br />

• limitare al massimo il ritardo, eliminando la parte relativa al normale<br />

adempimento della richiesta. In tal modo infatti, essendo i dati già presenti<br />

nella cache di livello superiore, qualora anche la richiesta di tali dati, non<br />

soddisfatta dalla cache di livello inferiore, debba transitare sul canale<br />

satellitare, può comunque essere risolta dalla cache di livello superiore, senza<br />

dover sopportare il ritardo necessario all’indirizzamento della stessa all’origin<br />

server a cui era destinata;<br />

• consentire lo sfruttamento di un livello superiore di caching (L1), al fine di<br />

soddisfare le richieste di numerosi livelli inferiori (L2). La presenza di una<br />

cache di livello superiore, facente capo a numerose cache di livello inferiore,<br />

consente di sfruttare al meglio la banda a disposizione, attraverso meccanismi<br />

quali il pushing e il multicast. Uno stesso dato, per esempio, memorizzato<br />

nella cache L1 potrebbe essere inviato in pushing a diverse cache di livello L2<br />

che ne avessero fatto preventivamente richiesta.<br />

45


3. Progettazione e architettura del sistema SatSquid<br />

Fig. 3-1 - Sistema di proxy/caching su due livelli<br />

3.1.3 Due istanze di Squid<br />

Parallelamente all’utilizzo di una soluzione con due livelli di caching, si è pensato di<br />

suddividere ognuno dei due livelli in due istanze di Squid separate:<br />

• la prima per la gestione dei normali documenti web, quindi di dimensione<br />

generalmente contenute (WD Squid);<br />

• la seconda per la gestione di contenuti multimediali, generalmente di<br />

dimensioni medio-grandi (MM Squid).<br />

Ognuna delle due istanze di Squid in un determinato livello comunica con la<br />

rispettiva controparte nell’altro livello, come mostrato in Fig.3-2.<br />

Fig. 3-2 - Doppia istanza di Squid per ogni livello di caching<br />

46


3. Progettazione e architettura del sistema SatSquid<br />

Tale scelta è stata pensata in funzione delle politiche di rimpiazzamento utilizzabili<br />

in Squid: LRU, GDSF e LFUDA. Infatti, le ultime due risultano particolarmente adatte per<br />

la gestione, rispettivamente, di file di piccola dimensione e di file di medio-grande<br />

dimensione.<br />

La politica GDSF (Greedy Dual Size Frequency) [Arl99] ottimizza l’hit rate,<br />

cercando di mantenere in cache gli oggetti più piccoli tra quelli maggiormente popolari, sulla<br />

base del presupposto che tale strategia porta ad avere una probabilità maggiore di hit in<br />

cache. Così facendo, si ottimizza l’hit rate a discapito del byte hit rate, poiché vengono<br />

eliminati prima i file di grandi dimensioni.<br />

La politica LFUDA (Least Frequently Used Dynamic Age) [Dil99] opera invece in<br />

maniera opposta alla GDSF: essa infatti cerca di tenere in cache gli oggetti più popolari,<br />

favorendo quelli di dimensioni maggiori. In tal modo, usando per esempio un unico grande<br />

oggetto, si ha sicuramente una minor probabilità di avere hit rispetto a tanti piccoli oggetti<br />

con una dimensione complessiva analoga, tuttavia si aumenta, viste le dimensioni del file, il<br />

byte hit rate.<br />

Quindi, l’adozione di due istanze separate di Squid consente l’utilizzo, altrimenti non<br />

possibile (per ogni istanza di Squid è possibile usare solamente una politica di<br />

rimpiazzamento) di differenti replacement policy, garantendo lo sfruttamento ottimale dello<br />

spazio a disposizione. Per validare una tale soluzione oltre le considerazioni teoriche, sono<br />

stati condotti dei test attraverso l’ausilio di strumenti (che verranno adeguatamente descritti<br />

nel capitolo successivo) quali Calamaris (analizzatore di log), MRTG (interrogazione remota<br />

di apparecchiature tramite SNMP) e RRDTool (database round robin, usato per migliorare le<br />

caratteristiche di MRTG). I dati emersi dai test condotti evidenziano come, in un ambito<br />

business (Elis, circa 25 IP), la percentuale di traffico “multimediale” sia effettivamente poco<br />

rilevante, in quanto rappresentativa di circa lo 0.5% del traffico totale e caratterizzato<br />

comunque da percentuali di hit molto basse, inferiori al 3% circa, come evidenziato dal<br />

grafico in Fig.3-3.<br />

47


3. Progettazione e architettura del sistema SatSquid<br />

Fig. 3-3 - Istanza di Squid dedicata ai file multimediali: basso traffico e hit rate<br />

Pur ipotizzando il basso sfruttamento della istanza dedicata ai file multimediali, una<br />

configurazione a due istanze, come verrà evidenziato meglio in seguito, può comunque<br />

costituire una valida soluzione per la gestione del mirroring di siti web.<br />

3.1.4 Pushing vs. prefetching<br />

Un sistema di proxying/caching disposto su due livelli, come precedentemente<br />

illustrato, consente di avere diversi vantaggi quali la massima limitazione del ritardo e la<br />

possibilità di fare content broadcasting sfruttando la posizione privilegiata del livello<br />

superiore. Tuttavia, il vantaggio maggiore lo si ottiene se si utilizzano contestualmente due<br />

tecniche per il reperimento delle informazioni, quali il prefetching e il pushing. La prima<br />

tecnica consente di prelevare delle informazioni in maniera “preventiva”, ancor prima,<br />

quindi, che ne sia fatta richiesta. La seconda invece consiste nell’inviare informazioni a chi<br />

si sia precedentemente sottoscritto per la ricezione delle stesse, senza però che quest’ultimo<br />

ne abbia fatto esplicita richiesta. La ricezione di tali informazioni avviene ogni qual volta<br />

queste siano state aggiornate e per il solo fatto di essere sottoscritti. Come si è potuto notare<br />

48


3. Progettazione e architettura del sistema SatSquid<br />

dall’analisi delle differenti soluzioni proposte dal mercato (Cap.2), queste due tecniche<br />

vengono largamente utilizzate al fine di mascherare la latenza del canale satellitare, pur<br />

necessitando di una implementazione e di una gestione completamente differente.<br />

Sicuramente l’utilizzo del pushing, congiuntamente all’uso di una trasmissione multicast,<br />

consente di ottenere una serie di vantaggi rispetto al prefetching:<br />

• non è richiesta interazione da parte dei client, se non la sottoscrizione del<br />

contenuto;<br />

• grazie all’utilizzo del multicast, si può inviare in pushing, con una sola<br />

trasmissione, lo stesso dato ad una serie di client che si siano<br />

precedentemente sottoscritti per lo stesso, minimizzando così l’utilizzazione<br />

della banda a disposizione e limitando al contempo il traffico sul canale.<br />

Tuttavia, tale soluzione non è esente da difetti:<br />

• necessità di implementare un protocollo di pushing proprietario o tramite<br />

modifica diretta del protocollo HTTP;<br />

• necessità di implementare un protocollo di trasmissione multicast affidabile;<br />

• necessità di modificare o di creare un proxy server che sia in grado di<br />

supportare entrambi i protocolli di pushing e multicast.<br />

Allo stesso modo, l’utilizzo del prefetching presenta pregi e difetti. Andando con<br />

ordine, sicuramente sono da evidenziare in positivo:<br />

• la facilità di implementazione e utilizzo;<br />

• modifiche non necessarie a livello di protocollo di trasmissione;<br />

• modifiche non necessarie al programma proxy server.<br />

Tuttavia non si possono non considerare i seguenti elementi negativi:<br />

• maggior aumento del traffico;<br />

• necessità di implementare una logica di controllo per le operazioni di<br />

prefetching;<br />

• sfruttamento non ottimale della banda a disposizione.<br />

Come verrà spiegato in seguito in modo più approfondito, la scelta del meccanismo<br />

da utilizzare è ricaduta sul prefetching, sia per problemi tecnici legati al pushing, sia per una<br />

delle due ipotesi iniziali, ovvero la disponibilità di una banda satellitare pressoché infinita.<br />

49


3.1.5 Gestione del prefetching<br />

3. Progettazione e architettura del sistema SatSquid<br />

La decisione di utilizzare il prefetching richiede, come precedentemente evidenziato,<br />

la necessità di una logica di controllo, alla quale delegare il compito di gestire tale modalità<br />

operativa. Infatti, per poter richiedere “preventivamente” determinate informazioni, è<br />

innanzitutto necessario sapere quali saranno le informazioni che con molta probabilità<br />

saranno richieste in un prossimo futuro e su quelle andare ad effettuare il prefetching.<br />

La logica che si è deciso di utilizzare, anche alla luce dei buoni risultati conseguiti,<br />

riprende quindi le esperienze riportate da Hughes Network Systems (Cap.2) con il proprio<br />

Cumulative Caching, nonché alcuni dei fondamenti alla base dell’algoritmo di Static<br />

Caching (descritto nel Cap.1). Proprio i risultati positivi ottenuti da quest’ultimo, nonché<br />

l’assunzione fatta per il Cumulative Caching della Hughes Network Systems, secondo la<br />

quale utenti appartenenti ad una stessa area geografica sono portati a visitare gli stessi siti<br />

web, a causa spesso di ragioni relative al mirroring dei siti stessi, hanno condotto all’idea di<br />

memorizzare in cache in anticipo le informazioni della giornata precedente.<br />

Ogni giorno, tramite una analisi dei log delle 24 ore precedenti, vengono identificati<br />

ed ottenuti quelli che sono stati gli oggetti maggiormente richiesti e su quelli vengono<br />

eseguite le operazioni di prefetching.<br />

3.1.6 Indirizzamento delle richieste<br />

Vista la scelta di utilizzare una doppia istanza di Squid per ognuno dei due livelli di<br />

caching, si presenta il problema di decidere come gestire l’indirizzamento delle richieste<br />

verso le due istanze.<br />

In tal senso, le alternative erano due:<br />

1. layer 7 switching dedicato;<br />

2. indirizzamento in base ad estensione tramite Access Control List di Squid.<br />

La prima delle due soluzioni (Fig.3-4) prevede l’utilizzo di una macchina dedicata<br />

che effettui solamente le funzionalità di switch di livello 7, ovvero il riconoscimento a livello<br />

applicativo e il conseguente indirizzamento delle differenti richieste alla rispettiva istanza di<br />

Squid (WD o MM), nel nostro caso, in base alla estensione del file richiesto.<br />

50


3. Progettazione e architettura del sistema SatSquid<br />

Fig. 3-4 - Layer 7 switching dedicato<br />

La seconda soluzione (Fig.3-5) prevede l’utilizzo di una configurazione in cui uno<br />

dei due Squid (WD Squid) faccia da front-end per l’altro (MM Squid), filtrando tutte le<br />

richieste in entrata e indirizzandole opportunamente allo MM Squid o risolvendole<br />

autonomamente a seconda della estensione del file richiesto. Tale operazione di filtraggio è<br />

resa possibile grazie all’utilizzo delle Access Control List (ACL) di Squid, che rendono<br />

possibili diverse tipologie di filtraggi, in base a informazioni quali estensione del file, url,<br />

indirizzo di destinazione, indirizzo di sorgente, etc.<br />

Fig. 3-5 - Layer 7 Switching tramite Squid e ACL<br />

51


3. Progettazione e architettura del sistema SatSquid<br />

La scelta finale su quale delle due soluzioni utilizzare, come descritto in seguito, è<br />

ricaduta sull’utilizzo delle ACL di Squid.<br />

3.1.7 Dimensionamento hardware<br />

Il problema del dimensionamento hardware del sistema di caching satellitare è stato<br />

tenuto in debita considerazione. Una delle ipotesi iniziali era infatti relativa allo spazio disco<br />

a disposizione e al basso costo attuale di una tale risorsa. Eppure, anche ipotizzando di avere<br />

uno spazio disco pressoché infinito, non è possibile trarre completamente vantaggio da tale<br />

opportunità per una serie di problemi legati sia alla gestione delle risorse hardware da parte<br />

di Squid, sia alle caratteristiche proprie del traffico Internet.<br />

Prima di tutto, bisogna infatti considerare che Squid è un programma che fa un uso<br />

intenso della RAM di sistema. Sicuramente l’uso maggiore di tale risorsa dipende dall’indice<br />

principale della cache. Questo indice è costituito da una tabella hash che mantiene una<br />

piccola quantità di metadati per ognuno degli oggetti in cache, quantità che diventa<br />

assolutamente non trascurabile se consideriamo il fatto che il numero di oggetti memorizzati<br />

in cache può arrivare a diversi milioni, direttamente legato quindi allo spazio disco riservato<br />

alla cache. Inoltre, vanno anche tenuti in considerazione gli utilizzi della memoria relativi ai<br />

differenti buffer utilizzati da Squid ogni volta che un client effettua una richiesta HTTP,<br />

oppure una richiesta viene inoltrata all’origin server, o ancora ogni volta che vengono<br />

effettuate operazioni di lettura scrittura da disco. Senza dimenticare gli oggetti normalmente<br />

mantenuti in memoria da Squid, come gli oggetti delle richieste attualmente servite dal<br />

programma. Quindi, tenendo conto di questo quadro di insieme, non si può non pensare ad<br />

un dimensionamento opportuno della RAM a seconda dello spazio disco che si vuole<br />

utilizzare, pena un forte degrado delle prestazioni dovuto alle operazioni di swapping su<br />

disco che Squid dovrebbe fare a causa dell’esaurimento della RAM a disposizione.<br />

Generalmente, si tende a dimensionare un cache server in base al traffico che dovrà<br />

sopportare nell’arco di tre, massimo cinque giorni, all’interno della rete di utilizzo. Sulla<br />

base di questo traffico si usa quindi dimensionare lo spazio disco e conseguentemente la<br />

dimensione della RAM, considerando che è ritenuta buona norma considerare, per il solo<br />

funzionamento di Squid, un quantitativo di RAM circa pari all’1% delle spazio disco messo<br />

52


3. Progettazione e architettura del sistema SatSquid<br />

a disposizione per il caching (es: spazio disco di 1TB necessità di un quantitativo di RAM<br />

pari a 10GB solo per Squid!). A tale riguardo, sono sicuramente interessanti alcuni dati<br />

forniti dalla Swelltech, cache vendor che fornisce soluzioni basate su Squid, che riporta<br />

[Coo02] una serie di dati (Tab.3-1) relativi al dimensionamento di un proxy server a seconda<br />

dello spazio disco riservato alla cache e della banda della rete in cui verrà utilizzato:<br />

NETWORK<br />

BANDWIDTH<br />

Reccomanded CACHE<br />

S<strong>TOR</strong>AGE size<br />

DSL 512Kbps 4 GB 128MB<br />

T1 1.5Mbps 8 GB 192 MB<br />

Dual T1 3Mbps 16 GB 256 MB<br />

Three T1 4.5Mbps 24 GB 384 MB<br />

Four T1 6Mbps 30 GB 512 MB<br />

Five T1 7.5 Mbps 36 GB 1024 MB<br />

Reccomanded RAM size<br />

Tab. 3-1 - Tabella per il dimensionamento di un proxy server Squid<br />

A queste considerazioni sull’utilizzo delle risorse hardware, se ne aggiungono altre<br />

relative alla natura del traffico. Bisogna infatti considerare che una buona parte del traffico<br />

Internet è di tipo non memorizzabile in cache, per tutta una serie di motivi legati alla natura<br />

dei contenuti che possono essere:<br />

• contenuti dinamici;<br />

• contenuti soggetti a diritti d’autore (es: alcuni video del sito della Cisco<br />

hanno una protezione DRM che ne impedisce la visualizzazione a chi non è<br />

stato espressamente autorizzato);<br />

• contenuti direttamente (vedi caso di header expiry-time=0) o indirettamente<br />

(contenuti posizionati a valle di una richiesta di autorizzazione) non<br />

memorizzabili.<br />

Per questi motivi, pur ipotizzando di avere a disposizione uno spazio disco<br />

praticamente infinito, non si può pensare di “memorizzare l’intera Internet!”<br />

A solo titolo di esempio, in Fig.3-6 viene riportato un grafico generato sulla base del<br />

traffico monitorizzato nella rete Elis (circa 25 IP), che riporta le diverse tipologie di richieste<br />

53


3. Progettazione e architettura del sistema SatSquid<br />

osservate. In questo caso, la percentuale delle richieste verso contenuti dinamici è pari a<br />

circa il 46% del traffico totale.<br />

Fig. 3-6 - Grafico della tipologia di traffico della rete Elis<br />

3.2 Le possibili architetture<br />

Le scelte effettuate in fase di progettazione hanno portato alla definizione di diverse<br />

architetture per il sistema SatSquid, riassumibili attraverso i seguenti elementi<br />

caratterizzanti:<br />

• due livelli di caching, un primo livello (L1) a monte del satellite e lato<br />

Content Broker (Telespazio) e diversi secondi livelli (L2) a valle del satellite,<br />

uno per ogni Service Provider;<br />

• doppia istanza di Squid per ognuno dei due livelli di caching, in modo da<br />

sfruttare al massimo gli algoritmi di rimpiazzamento supportati da Squid<br />

stesso;<br />

54


3. Progettazione e architettura del sistema SatSquid<br />

• indirizzamento delle richieste verso una istanza di Squid tramite l’utilizzo di<br />

un L7 Switch dedicato o tramite l’utilizzo di una delle due istanze di Squid,<br />

attraverso l’uso delle ACL;<br />

• meccanismi di pushing o prefetching per mascherare la latenza del canale<br />

satellitare;<br />

• utilizzo delle tecniche proprie dello static caching e della soluzione di Hughes<br />

Network Systems, per automatizzare le operazioni di prefetching.<br />

A questi elementi, va aggiunto la scelta di realizzare un sistema di gestione per il<br />

mirroring di siti web, come richiesto da specifiche del committente.<br />

Nelle sezioni successive vengono descritte le considerazioni ed i test che hanno<br />

determinato la scelta della architettura finale.<br />

3.2.1 Pushing vs. prefetching<br />

Il primo elemento, probabilmente quello più caratterizzante l’architettura in esame, è<br />

rappresentato dalla scelta della tecnica di reperimento delle informazioni: pushing vs.<br />

prefetching. Per poter utilizzare il pushing è stato necessario, visto l’impossibilità di Squid di<br />

usare tale meccanismo, reperire una sua versione appositamente modificata. In tal senso, il<br />

progetto relativo ad una versione push-based di Squid è considerato in fase di stallo.<br />

Solamente tramite contatti diretti con il mantainer del progetto è stato possibile avere una<br />

versione pre-alfa (non era neanche in fase di alfa!) di uno Squid v.2.5 stable6p3, ovvero di<br />

una versione 2.5stable6 di Squid alla terza modifica per il pushing, p3 appunto. Vista la fase<br />

altamente sperimentale di tale soluzione, non è stato possibile reperire informazioni corrette<br />

sul funzionamento di questa release. Di conseguenza, tutte le informazioni che vengono di<br />

seguito riportate sono frutto di test condotti sulla release stessa, attraverso lo “sniffing” della<br />

rete sottostante, tramite il programma di sniffing Ethereal.<br />

I test sono stati condotti installando e configurando opportunamente su due macchine<br />

diverse, una con funzionalità di L1 e l’altra con funzionalità di L2, la versione di Squid<br />

modificata per il pushing. Inoltre, sulle due macchine sono state configurate delle ACL per<br />

consentire: alla macchina L1 di effettuare il pushing dei dati sottoscritti sulla L2 che ne farà<br />

sottoscrizione e alla macchina L1, come verrà spiegato meglio in seguito, di riceve<br />

55


3. Progettazione e architettura del sistema SatSquid<br />

aggiornamenti in pushing dei dati sottoscritti dalle L2 da parte di un agente esterno. Il<br />

funzionamento del meccanismo di pushing è il seguente:<br />

1. un agente esterno (Fig.3-7), in funzione sulla macchina L2, effettua una<br />

richiesta HTTP alla macchina L1, inviando una GET opportunamente<br />

modificata: “GET httpdist3128://www.google.it HTTP/1.0”, aggiungendo<br />

dist3128 per indicare allo Squid che risiede sulla L1 che sta inviando una<br />

richiesta di sottoscrizione e che si aspetta una risposta sulla porta 3128 dello<br />

stesso IP dal quale ha effettuato la richiesta. La modifica all’URL è necessaria<br />

in quanto l’agente esterno a Squid si occupa di effettuare la sottoscrizione “a<br />

nome” dello Squid stesso, indicando su quale porta della stessa macchina sia<br />

in ascolto quest’ultimo per ricevere le risposte.<br />

Fig. 3-7 - Sottoscrizione di un contenuto da parte agente esterno<br />

2. Lo Squid che risiede su L1 riceve la richiesta di GET opportunamente<br />

modificata dall’agente esterno su L2 (Fig.3-8), ne effettua il parsing<br />

eliminando l’aggiunta dist3128 e memorizzando al contempo la richiesta di<br />

sottoscrizione per la url indicata (http://www.google.it) e infine risponde allo<br />

Squid su L2 in ascolto sulla porta indicata nella url, ovvero la 3128, come se<br />

questo avesse effettuato una normale GET con la URL in oggetto<br />

(http://www.google.it).<br />

56


3. Progettazione e architettura del sistema SatSquid<br />

Fig. 3-8 - Memorizzazione della richiesta di sottoscrizione e risposta alla GET<br />

3. D’ora in poi, lo Squid sulla L1 avrà memorizzato la richiesta di sottoscrizione<br />

relativa allo Squid L2. Tuttavia, il controllo degli aggiornamenti e l’eventuale<br />

conseguente invio dell’oggetto sottoscritto non sono a carico dello Squid L1,<br />

è invece necessario un altro agente esterno, che può in questo caso anche<br />

risiedere su una macchina diversa dalla L1 stessa (basta configurare<br />

opportunamente la regola della ACL relativa ai permessi di pushing sulla L1),<br />

che si occupi di controllare eventuali aggiornamenti dei file sottoscritti dalle<br />

L2 e in quel caso li prelevi inviandoli in pushing alla L1 stessa (Fig.3-9),<br />

tramite una semplice PUT HTTP.<br />

Fig. 3-9 - Aggiornamento del contenuto da parte di un agente di PUSHING<br />

4. Al momento della ricezione del file aggiornato, L1 controlla l’elenco dei file<br />

sottoscritti e invia a sua volta in pushing (tramite il metodo PUT dell’HTTP)<br />

57


3. Progettazione e architettura del sistema SatSquid<br />

tale file a tutte le L2 che ne avevano fatto richiesta di sottoscrizione (Fig.3-<br />

10).<br />

Fig. 3-10 - Aggiornamento del contenuto di L2 tramite PUT HTTP<br />

Dalla descrizione, si può notare come il funzionamento della soluzione di pushing<br />

non sia in realtà completamente autonomo, ma richieda la presenza di due agenti esterni, uno<br />

per effettuare le richieste di sottoscrizione e l’altro per controllare l’aggiornamento di tali<br />

oggetti sottoscritti e iniziarne la procedura di pushing. Questa modalità operativa diventa<br />

quindi del tutto analoga a quella che viene utilizzata per il prefetching: anche in questo caso<br />

infatti è necessario un agente esterno che faccia richiesta anticipata allo Squid dei file che<br />

intende far memorizzare allo stesso. Il motivo di un tale funzionamento del pushing è<br />

sicuramente da ricondurre alla volontà da parte del mantainer di tale progetto di utilizzare,<br />

congiuntamente a tale tecnica, il multicast: così facendo infatti sarebbe possibile, con un solo<br />

invio di un file a L1, far inviare ad essa in multicast (quindi con una sola trasmissione) il file<br />

contemporaneamente a tutte le L2 che ne avevano fatto richiesta di sottoscrizione,<br />

ottimizzando l’utilizzo della banda.<br />

Tuttavia, la versione di Squid modificata, pur supportando il pushing, non supporta il<br />

multicast. Quindi, oltre ad un funzionamento non completamente autonomo, veniva a<br />

mancare anche il vantaggio di poter sfruttare al meglio la banda a disposizione. Se a questo<br />

aggiungiamo due bachi che sono stati riscontrati durante la fase di testing, risultano evidenti<br />

i motivi che hanno condotto a preferire la soluzione che implementa il prefetching. A tale<br />

scopo è stata progettata una logica di controllo che, funzionando autonomamente, effettua<br />

regolarmente procedure di analisi dei log della giornata precedente per decidere cosa<br />

richiedere in prefetching.<br />

I bachi a cui si accennava poco sopra sono:<br />

58


3. Progettazione e architettura del sistema SatSquid<br />

• problema nel valutare il grado di “freschezza” di un oggetto e quindi la<br />

possibilità di memorizzazione o meno in cache di tale oggetto;<br />

• problemi di funzionamento in modalità parent/sibling, quindi in una<br />

architettura di caching cooperativo.<br />

Il primo dei due problemi deriva da una mancata memorizzazione del valore del<br />

campo “time” inviato insieme ai documenti. Tale valore indica la data e l’ora di creazione di<br />

un documento e viene utilizzato da Squid per calcolare “l’età” di un documento attraverso<br />

una semplice sottrazione età=ora_corrente-time. Non memorizzando però bene il campo<br />

time, Squid impostava tale valore a zero, di conseguenza il valore di età si aggirava intorno<br />

ai 35 anni. Questo perché nei sistemi *nix i valori temporali sono espressi in secondi rispetto<br />

a quella che viene considerata l’epoch time, ovvero il 1° Gennaio 1970. L’unico modo per<br />

“forzare” questa versione push-based di Squid a memorizzare qualsiasi file era quella di<br />

impostare il valore della direttiva refresh_pattern all’interno del proprio file di<br />

configurazione ad un valore superiore ai 35 anni. Tale direttiva infatti indica a Squid qual è il<br />

valore massimo di età che un documento non deve superare per essere considerato “fresh” e<br />

quindi memorizzabile in cache.<br />

Il secondo baco è relativo al funzionamento in modalità parent/sibling. Nel file di<br />

configurazione di Squid è presente una direttiva che indica quale deve essere la dimensione<br />

massima di un oggetto memorizzabile in cache (max_obj_size). Il problema si verificava<br />

durante una modalità di funzionamento in cui si usava uno dei due Squid come switch di<br />

livello 7. In una configurazione siffatta, lo Squid che si trovava a fare da front-end, chiudeva<br />

la connessione con quello di back-end nel momento in cui, indirizzandogli una richiesta e<br />

ricevendo la risposta, il file trasferito superava la propria direttiva di max_obj_size.<br />

3.2.2 Indirizzamento delle richieste<br />

Vista la scelta di utilizzare una doppia istanza di Squid, era necessario implementare,<br />

come precedentemente accennato, una tecnica per instradare le richieste a seconda delle<br />

necessità. Inoltre, data anche la scelta di utilizzare Squid e conseguentemente Linux come<br />

sistema operativo, si è pensato ad una implementazione di uno switching di livello 7 tramite<br />

una macchina Linux dedicata.<br />

59


3. Progettazione e architettura del sistema SatSquid<br />

In tale ambiente operativo, la soluzione open-source più diffusa è rappresentata dal<br />

progetto Linux Virtual Server [Lin05a]. Questo progetto, che mira principalmente ad<br />

architetture di load balancing [Car02], mette a disposizione tre possibili soluzioni<br />

implementative, basate rispettivamente sull’utilizzo dei seguenti meccanismi.<br />

• NATting: tecnica di Network Address Translation che consente ad una<br />

macchina di front-end di effettuare il load balancing su delle macchine di<br />

back-end. Il front-end è un tramite per lo svolgimento della comunicazione<br />

client-server e si occupa di riscrivere gli header dei pacchetti TCP/IP in<br />

transito, modificando, di volta in volta, le informazione relative agli indirizzi<br />

IP e alle porte di sorgente e destinazione.<br />

• IP Tunneling [Lin05b]: meccanismo per l’incapsulamento di datagrammi IP<br />

in altri datagrammi IP (le macchine di front-end e back-end possono trovarsi<br />

in reti differenti ).<br />

• DirectRouting: meccanismo che prevede che una macchina front-end effettui<br />

la rescrittura a livello network dei pacchetti in transito, cambiandone il MAC<br />

address (le macchine di front-end e back-end devono trovarsi sullo stesso<br />

segmento di rete).<br />

Le soluzioni sopra descritte e implementate dal progetto LVS sono tuttavia soluzioni<br />

adatte per attuare uno switching di livello 4, non utilizzabili direttamente quindi per<br />

effettuare uno switching di livello 7. Per tale motivo, ci si è indirizzati verso un progetto<br />

parallelo a LVS, il progetto TCPHA [Dra05], che si occupa dell’implementazione di uno<br />

switching livello 7 sotto Linux, prendendo spunto dal progetto Linux Virtual Server e<br />

dall’utilizzo dell’IP tunneling e del TCP Hand-Off. Tale progetto prevede l’utilizzo di una<br />

architettura (Fig.3-11) in cui una serie di server di back-end sono direttamente indirizzati<br />

tramite l’ausilio di un server di front-end. Tutti i server componenti il cluster condividono<br />

uno stesso IP virtuale, quasi come se fossero, appunto, un unico server virtuale, pur<br />

utilizzando per le comunicazioni interne degli indirizzi IP reali, non visibili all’esterno. Una<br />

tale architettura viene identificata con il termine di one-way layer 7 switching [And03], in<br />

contrapposizione all’altra architettura possibile, la two-way layer 7 switching. Un sistema di<br />

switching livello 7 prevede la presenza di una macchina di front-end o switch, chiamato<br />

anche web switch (per sottolineare il ruolo di switching effettuato a livello di una richiesta<br />

60


3. Progettazione e architettura del sistema SatSquid<br />

web), posizionato davanti alle macchine sulle quali andranno poi indirizzate le richieste. Con<br />

il termine one-way si vuole sottolineare il fatto che il meccanismo di switching così<br />

realizzato, consente ai server di rispondere direttamente ai client, senza la necessità di far<br />

passare la propria risposta nuovamente attraverso il web switch. Al contrario, in una<br />

architettura two-way, tutte le risposte dei server devono transitare nuovamente per lo switch.<br />

Il progetto TCPHA, appartenente alla categoria degli one-way switch, realizza uno<br />

switching di livello 7 tramite l’utilizzo dei meccanismi di IP-Tunnelling e con l’ausilio di un<br />

protocollo di TCP Hand-Off (THOP) [And05][Car02]. Attraverso tale protocollo la<br />

macchina di front-end e la macchina di back-end si scambiano informazioni relative allo<br />

stato della connessione TCP [TCP05] inizialmente creata tra il client e il front-end, in modo<br />

da consentire al back-end di gestire direttamente le risposte con il client. Oltre alle<br />

informazioni relative alla creazione delle connessione TCP, il THOP (TCP Hand-Off<br />

Protocol) prevede anche lo scambio tra la macchina di front-end (o switch) e quelle di back-<br />

end di informazioni sullo stato attuale della connessione (chiusura, errori, etc) che<br />

consentono al front-end di reagire a determinati eventi. Infatti, pur potendo i server<br />

rispondere direttamente ai client, i pacchetti che questi ultimi indirizzano ai server (per<br />

esempio ACK) transitano ancora tramite la macchina di front-end. Questa, tramite una<br />

tabella hash in cui mantiene le informazioni relative ad una determinata connessione,<br />

indirizza tali pacchetti verso il server opportuno. Al momento della chiusura della<br />

connessione e alla ricezione del messaggio di notifica tramite il protocollo TCP Hand-Off, il<br />

front-end provvede ad eliminare dalla tabella le informazioni relative alla connessione<br />

appena terminata.<br />

61


3. Progettazione e architettura del sistema SatSquid<br />

Fig. 3-11 - Architettura Virtual Server tramite IP Tunneling<br />

. Il funzionamento dello switching livello 7 implementato dal progetto TCPHA<br />

tramite IP tunneling e THOP può essere così riassunto:<br />

1. un client invia una richiesta al server virtuale;<br />

2. la macchina di front-end risponde stabilisce la connessione col client e<br />

accetta la richiesta;<br />

3. la macchina di front-end analizza la richiesta e decide a quale server<br />

di back-end indirizzarla;<br />

4. la macchina di front-end incapsula (Fig.3-12) quindi il datagramma IP<br />

della richiesta in un altro datagramma IP, nel quale però vengono<br />

utilizzati gli indirizzi IP reali delle macchina sorgente (sè stessa) e<br />

destinazione (il server di back-end selezionato);<br />

62


3. Progettazione e architettura del sistema SatSquid<br />

5. il server di back-end riceve il datagramma IP, lo decapsula ritrovando<br />

la richiesta originale;<br />

6. il server di back-end risolve la richiesta rispondendo direttamente al<br />

client tramite il proprio IP virtuale.<br />

Fig. 3-12 - Flusso di incapsulamento/decapsulamento tra il forntend (LinuxDirector) e il backend (Real<br />

Server)<br />

E’ importante sottolineare come, in una tale architettura in cui diverse macchine<br />

rispondono ad un unico indirizzo IP virtuale, solamente una di queste (quella con<br />

funzionalità di fornt-end) deve rispondere alle interrogazioni ARP su tale indirizzo,<br />

altrimenti possono generarsi dei conflitti nonché degli indirizzamenti sbagliati [Lin05c],<br />

portando il client, per esempio, ad effettuare le richieste direttamente ad un server di back-<br />

end. Per risolvere tali problematiche, è possibile disabilitare (Fig.3-13) tramite l’interfaccia<br />

al kernel proc l’invio di risposte ARP per una determinata interfaccia di loopback associata<br />

all’indirizzo IP virtuale su ognuno dei server di back-end.<br />

63


3. Progettazione e architettura del sistema SatSquid<br />

# Abilitazione delle funzionalità di hiding delle interfacce<br />

echo 1 > /proc/sys/net/ipv4/conf/all/hidden<br />

# Nasconde tutti gli indirizzi dell’interfaccia di loopback tunl0<br />

echo 1 > /proc/sys/net/ipv4/conf/tunl0/hidden<br />

Fig. 3-13 - Comandi per disabilitare le risposte ARP per una interfaccia di loopback<br />

Il progetto TCPHA implementa, tramite dei moduli, il TCP Hand-Off all’interno del<br />

kernel di Linux. Il suo funzionamento si basa su due componenti: tcpha_fe (front-end) e<br />

tcpha_be (back-end). Il primo modulo, installato sulla macchina di front-end, si occupa di<br />

instradare le richieste al secondo modulo posizionato sulle macchine di back-end, seguendo<br />

una serie di regole memorizzate all’interno di un file di configurazione.<br />

Facciamo un esempio: il server di front-end risponde all’indirizzo IP 10.0.0.3 ed è<br />

posizionato davanti a due server di back-end, con indirizzi IP rispettivamente pari a 10.0.0.4<br />

e 10.0.0.5. Tutte e tre le macchine condividono l’IP virtuale 10.0.0.2 visibile ai client.<br />

Compilati i moduli, verranno installati rispettivamente il modulo tcpha_fe sulla macchina di<br />

front-end e i moduli tcpha_be sulle macchine di backend. Quindi, per ogni macchina sarà<br />

necessario modificare il relativo file di configurazione del modulo. Nel caso del front-end<br />

nel file tcphafe.conf andranno inseriti:<br />

inseriti:<br />

• raddr = x.x.x.x: indirizzo IP reale del front-end, quindi nel caso in esempio<br />

raddr = 10.0.0.3;<br />

• vaddr = x.x.x.x: indirizzo IP virtuale del cluster, quindi vaddr = 10.0.0.2;<br />

• server = x.x.x.x port: indirizzo e porta dei server di back-end, quindi server =<br />

10.0.0.4 666 e server = 10.0.0.5 666;<br />

• rule = x.x.x.x pattern: se una richiesta soddisfa la regola pattern, allora deve<br />

essere indirizzata al server di back-end all’indirizzo x.x.x.x, nel nostro<br />

esempio qualcosa come rule = 10.0.0.5 avi$ and rule = 10.0.0.4 .*<br />

Analogamente, nel caso delle macchine di back-end nel file tcphabe.conf andranno<br />

• raddr = x.x.x.x: l’indirizzo IP del back-end, nel caso della macchina 10.0.0.4<br />

quindi raddr = 10.0.0.4;<br />

64


3. Progettazione e architettura del sistema SatSquid<br />

• vaddr = x.x.x.x: indirizzo IP virtuale del cluster, nel nostro caso quindi vaddr<br />

= 10.0.0.2<br />

Lo sviluppo del progetto TCPHA purtroppo procede a rilento (non è ancora stato<br />

introdotto il supporto al kernel versione 2.6) ed è ancora in fase semi-sperimentale. Sono<br />

stati infatti riscontrati problemi sia in fase di compilazione (risolti attraverso piccole<br />

modifiche al codice), sia in fase di installazione dei moduli che ne hanno impedito il<br />

funzionamento. Per questo motivo si è deciso di utilizzare una delle due istanze di Squid<br />

come switching di livello 7, attraverso l’uso delle ACL opportunamente configurate.<br />

Sicuramente, l’utilizzo di una soluzione di switching di livello 7 dedicata e implementata<br />

tramite TCP handoff avrebbe consentito l’utilizzo ottimale delle risorse a disposizione: una<br />

tale soluzione infatti risulta ideale in tutti quei casi in cui il server di front-end può diventare<br />

un collo di bottiglia, in quanto impegnato nella gestione di numerosi server di back-end (da<br />

20 in su). Tuttavia, avendo nella nostra architettura solamente due server di back-end, dei<br />

quali uno dei due funziona contemporaneamente anche da server di front-end, il problema<br />

del collo di bottiglia diventa pressoché ininfluente.<br />

3.2.3 Mirroring separato<br />

Una delle problematiche chiave, così come evidenziata dal committente stesso, era la<br />

necessità di un meccanismo che consentisse di effettuare il mirroring di siti web. Per tale<br />

motivo è stata pensata la creazione di una interfaccia di management che consentisse la<br />

gestione di una tale procedura. Al fine di diminuire la possibilità di errori umani e di poter<br />

meglio tenere sotto controllo il funzionamento dell’intero sistema, si è ipotizzato di<br />

posizionare tale interfaccia solamente sulla cache L1, in modo che un unico amministratore<br />

possa occuparsi, su richiesta espressa degli amministratori delle varie L2, di inserimenti e<br />

rimozione dei siti sottoposti a mirroring.<br />

L’interfaccia di management è stata quindi spunto per ulteriori riflessioni: visti anche<br />

i test condotti in un ambito business (rete Elis, 25 IP) che hanno portato alla luce come, in un<br />

tale contesto di utilizzo, la richiesta di file multimediali sia una percentuale bassissima del<br />

totale del traffico generato (inferiore allo 0.5%), si è pensato di riutilizzare la doppia istanza<br />

di Squid, per ognuno dei due livelli, a favore del mirroring. Supponendo una applicazione in<br />

65


3. Progettazione e architettura del sistema SatSquid<br />

ambito business del sistema, si può pensare di dedicare una delle due istanze al normale<br />

caching dei siti, tramite anche l’ausilio della logica di controllo e delle operazioni di<br />

prefetching da essa eseguite, e di utilizzare l’altra, completamente per il mirroring dei siti<br />

web, attraverso l’eventuale uso di ACL che filtrano in base al dominio di appartenenza<br />

dell’url (come verrà meglio spiegato nel Cap.4).<br />

3.3 Architettura scelta: vantaggi e limiti<br />

Riassumendo quindi le varie scelte progettuali effettuate, l’architettura del sistema di<br />

caching satellitare SatSquid (Fig.3-14) può essere così riassunta:<br />

Fig. 3-14 - Architettura del sistema di caching satellitare SatSquid<br />

• adozione di Squid, il più diffuso e apprezzato programma proxy server open<br />

source e quindi, conseguenza naturale, uso del sistema operativo Linux;<br />

• due livelli di caching, al fine di ridurre il più possibile la latenza normalmente<br />

attribuibile al reperimento delle pagine presso l’origin server (le operazioni di<br />

prefetching infatti procedono ritardate nel tempo tra i due livelli, per dar<br />

modo alla L1 di avere già presenti in cache i dati al momento che la L2 ne<br />

faccia richiesta);<br />

66


3. Progettazione e architettura del sistema SatSquid<br />

• due istanze di Squid per ognuno dei due livelli di caching, con una doppia<br />

possibilità di utilizzo: sfruttamento massimo degli algoritmi di<br />

rimpiazzamento attraverso la distinzione di traffico multimediale e non,<br />

oppure uso di una delle due istanze, nel caso di utenza prettamente business,<br />

per una gestione dedicata al mirroring dei siti;<br />

• gestione dell’instradamento del traffico per la doppia istanza di Squid tramite<br />

ACL di Squid, sia nel caso di distinzione tra traffico multimediale e non, sia<br />

per indirizzare opportunamente il traffico generato verso i siti mirror;<br />

• tecniche di prefetching, realizzate tramite l’implementazione di un demone<br />

sempre in funzione sulle macchine di secondo livello, che analizzando ogni<br />

giorno i log della giornata precedente, decida cosa sia più conveniente andare<br />

a richiedere in prefetching, al fine di mascherare la latenza del canale<br />

satellitare;<br />

• mirroring di siti web attraverso una interfaccia di management situata sulla<br />

macchina di primo livello, con la possibilità di avere una macchina<br />

completamente dedicata al mirroring dei siti (Fig.3-15).<br />

Fig. 3-15 - Architettura finale "alternativa": mirroring dedicato<br />

67


3. Progettazione e architettura del sistema SatSquid<br />

La scelta dell’architettura finale del sistema SatSquid è avvenuta sulla base delle<br />

possibilità a disposizione e dei vantaggi e svantaggi offerti dalle soluzioni possibili.<br />

L’insieme demone/interfaccia di management costituisce sicuramente un valido strumento<br />

sia per il caching, sia per il mirroring di siti web. Ciò nonostante, le scelte effettuate hanno<br />

portato alla implicita accettazione di quelli che costituiscono i limiti di tale architettura. La<br />

decisione di adottare una doppia istanza di Squid, se da un lato consente di gestire meglio le<br />

differenti tipologie di traffico, dall’altro non consente un controllo completo dello spazio<br />

disco utilizzato. Infatti anche in tal senso è stata progettata la configurazione alternativa: una<br />

gestione separata del mirroring consente di avere un controllo completo dello spazio<br />

occupato. Infine, il mancato utilizzo del pushing coadiuvato dal multicast non consente un<br />

utilizzo ottimo della banda a disposizione. Tuttavia, proprio per quella che era l’assunzione<br />

iniziale, ovvero la disponibilità di una banda satellitare pressoché infinita, tale mancanza non<br />

costituisce un problema rilevante.<br />

68


4. Strumenti per la realizzazione di SatSquid<br />

4 Strumenti per la realizzazione di SatSquid<br />

Per la realizzazione del progetto sono state usate alcune applicazioni utili sia<br />

all’implementazione e al funzionamento del sistema realizzato, sia al monitoraggio dello<br />

stesso. In questo capitolo verranno descritti questi tool, riportandone le caratteristiche<br />

salienti e analizzando con maggiore dettaglio quelle tra queste ultime che sono state più<br />

importanti ai fini del progetto. In tal senso, verranno meglio evidenziate le caratteristiche di<br />

Squid (4.1) che hanno permesso lo sviluppo dell’architettura adottata, quindi sarà analizzato<br />

il protocollo SNMP (4.2) che ha permesso, attraverso una serie di tool quali MRTG e<br />

RRDTOOL (4.3), l’analisi e il monitoraggio dell’architettura scelta. Infine, verrà descritto il<br />

funzionamento di Calamaris (4.4), ottimo tool utilizzato per l’analisi dei log di Squid.<br />

4.1 Squid<br />

Il programma proxy server Squid, come precedentemente accennato, è un software<br />

rilasciato sotto licenza GPL, che permette di effettuare operazioni di proxying/caching su<br />

diversi protocolli, nonché di funzionare come transparent proxy o reverse proxy. Le<br />

potenzialità offerte da questo proxy server consentono di gestire finemente un sistema di<br />

proxying/caching attraverso una serie di parametri e impostazioni, selezionabili sia in fase di<br />

compilazione, sia all’interno del file di configurazione squid.conf (in Appendice A sono<br />

riportati alcuni file di configurazione d’esempio). Di seguito, vengono descritti gli elementi<br />

di Squid più significativi ai fini del progetto.<br />

4.1.1 Configurazione iniziale<br />

Le prime impostazioni sono anche le più importanti, dal momento che abilitano una<br />

serie di caratteristiche altrimenti inutilizzabili e sono da effettuare già in fase di<br />

compilazione del programma [Tag05b]. La procedura di configurazione ricalca le classiche<br />

tre fasi di un programma open source, ovvero: configure, make e make install.<br />

69


4. Strumenti per la realizzazione di SatSquid<br />

Allo script di configurazione è possibile passare numerosi parametri per abilitare<br />

diverse funzionalità. Sicuramente i più importanti ai fini del progetto in esame, come<br />

mostrato in Fig.4-1, sono i seguenti:<br />

• enable-async-io e enable-storeio=”ufs aufs”: queste due opzioni sono<br />

entrambe relative al meccanismo di accesso al disco utilizzato da Squid. La<br />

prima abilita una gestione asincrona di accesso al disco, la seconda attiva due<br />

sistemi di gestione di accesso disco: ufs e aufs. Squid infatti utilizza diverse<br />

tecniche di accesso al disco, tra le quali appunto ufs e aufs. La prima è il<br />

sistema di memorizzazione originario e nativo di Squid, si basa su una<br />

struttura di directory a 2 livelli dove i valori di default prevedono 16 directory<br />

per il primo livello (L1) e 256 per il secondo (L2). Tutti gli oggetti presenti<br />

nella cache di Squid sono immagazzinati come file all'interno del secondo<br />

livello, tutte le operazioni di I/O sono gestite in modalità sincrona<br />

direttamente dal Sistema Operativo e possono bloccare il funzionamento del<br />

processo principale di Squid sino al loro completamento. La seconda tecnica<br />

di accesso al disco viene usata proprio per risolvere tale problematica; infatti,<br />

utilizza il medesimo formato di storage su disco di ufs, tuttavia in questo caso<br />

tutte le operazioni di I/O sono gestite in modalità asincrona utilizzando il<br />

modello POSIX-thread. Aufs utilizza dei processi di tipo thread che gli<br />

consentono di eseguire le operazioni di disk I/O. Questo modello di storage<br />

permette di evitare il blocco del processo principale di Squid durante tutte le<br />

operazioni di disk I/O, in quanto le stesse vengono inoltrate ad un processo<br />

thread differente.<br />

• enable-removal-policies="lru heap": questo parametro attiva la possibilità di<br />

utilizzare diverse replacement policy all’interno di Squid. In particolare,<br />

consente di usare la più classica delle politiche di rimpiazzamento, LRU,<br />

nonché tutte le politiche basate su heap, tra le quali possiamo citare sia<br />

GDSF che LFUDA, precedentemente descritte (3.1.3).<br />

• enable-snmp: questa opzione abilita la gestione del protocollo SNMP da parte<br />

di Squid, consentendone così il monitoraggio remoto. Gli aspetti che è<br />

70


4. Strumenti per la realizzazione di SatSquid<br />

possibile monitorizzare sono elencati all’interno del file SQUID-MIB.txt,<br />

come verrà meglio descritto in seguito.<br />

• enable-err-languages="Italian English" e enable-default-err-<br />

language="Italian”: questi due ultimi parametri servono invece ad abilitare<br />

la comunicazione dei messaggi di errore in una lingua desiderata. Per tale<br />

motivo sono stati abilitati i messaggi di errore sia nella lingua inglese sia<br />

nella lingua italiana ed è stata selezionata quest’ultima come lingua di default.<br />

./configure --enable-async-io\<br />

--enable-storeio="ufs aufs"\<br />

--enable-removal-policies="lru heap"\<br />

--enable-snmp\<br />

--enable-err-languages="Italian English"\<br />

--enable-default-err-language="Italian"<br />

4.1.2 ACL<br />

Fig. 4-1 - Script di configurazione di Squid<br />

Tra le numerose opzioni di configurazione di Squid, sicuramente rivestono un ruolo<br />

centrale quelle relative alle Access Control List [Tag05b], [Wes04].<br />

Le ACL consentono di impostare diverse politiche di utilizzo per definire le modalità<br />

con cui permettere l’accesso a Squid stesso. Definendo delle liste di controllo di accesso,<br />

con diverse regole associate, è possibile impedire o consentire agli utenti di accedere a<br />

determinati siti o a determinati contenuti; inoltre, è possibile limitare l'accesso nell'utilizzo di<br />

particolari protocolli di rete. Squid implementa circa 20 differenti tipologie di ACL che<br />

consentono di filtrare il traffico su altrettanti parametri, tra i quali i più importanti sono:<br />

• src: indirizzo IP del sorgente (client);<br />

• dst: indirizzo IP del server di destinazione;<br />

• url_regex: espressione regolare che identifica una URL;<br />

• urlpath_regex: espressione regolare che identifica una URL-path, non viene<br />

specificato il protocollo e l'eventuale hostname;<br />

71


4. Strumenti per la realizzazione di SatSquid<br />

• port: seleziona e specifica il numero di porta per il server di destinazione<br />

(server);<br />

• proto: protocollo di trasferimento (HTTP, FTP, ecc.);<br />

• method: metodo di richiesta HTTP (get, post, ecc.);<br />

• browser: espressione regolare che identifica una richiesta che viene effettuata<br />

da un browser web specifico;<br />

• snmp_community: definizione di una SNMP community string.<br />

E’ importante sottolineare che una ACL si compone di elementi e regole e che le<br />

espressioni utilizzate all’interno delle ACL sono Case Sensitive: è necessario quindi fare<br />

attenzione nell’inserimento delle stesse. Un elemento di una ACL si compone di 3 parti:<br />

1. nome dell’ACL;<br />

2. tipologia dell’ACL;<br />

3. uno o più valori legati alla tipologia oppure un file contenente i valori.<br />

In Fig. 4-2 sono riportati alcuni esempi di elementi di ACL, il primo elemento<br />

IP_sorgente filtra tutte le richieste provenienti dall’indirizzo 10.0.0.4, il secondo elemento<br />

domino_dest filtra tutte le richieste indirizzate verso il dominio www.google.it, infine il<br />

terzo elemento metodo_richiesta filtra sul metodo GET dell’HTTP.<br />

acl IP_sorgente src 10.0.0.4<br />

acl dominio_dest dstdomain www.google.it<br />

acl metodo_richiesta method GET<br />

Fig. 4-2 - Esempi di elementi di ACL<br />

E’ inoltre possibile associare più valori ad un elemento di una ACL; tuttavia in tal<br />

caso è importante sottolineare come il filtraggio avviene secondo una logica OR, ovvero,<br />

prendendo ad esempio gli elementi in Fig.4-3, nel primo caso il filtraggio sarà effettuato<br />

sull’indirizzo di destinazione 10.0.0.4 oppure sull’indirizzo 10.0.0.20, nel secondo caso<br />

invece il filtraggio avverrà nel caso che il dominio di destinazione sia www.google.it oppure<br />

www.google.com. Nell’ultimo caso infine il filtraggio sarà effettuato solo se i metodi HTTP<br />

utilizzati sono GET oppure PUT.<br />

72


acl IP_sorgente_m src 10.0.0.4 10.0.0.20<br />

4. Strumenti per la realizzazione di SatSquid<br />

acl dominio_dest_m dstdomain www.google.it www.google.com<br />

acl metodo_richiesta_m method GET PUT<br />

Fig. 4-3 - Esempi di elementi ACL con valori multipli<br />

Introdotti quelli che sono gli elementi delle ACL, si può ora passare alle regole<br />

corrispondenti e tali elementi. Per ogni elemento è necessario specificare una regola che ha<br />

lo scopo di consentire o di negare il traffico filtrato dall’elemento stesso. Riferendosi agli<br />

esempi di Fig.4-4, si ha che la prima regola consente il transito del traffico filtrato<br />

dall’elemento IP_sorgente, ovvero consente il traffico generato dall’IP 10.0.0.4; la seconda<br />

regola consente il traffico filtrato dall’elemento dominio_dest, ovvero consente il traffico<br />

che ha come dominio di destinazione www.google.it. L’ultima regola infine non consente il<br />

traffico filtrato dall’elemento metodo_richiesta, quindi non consente il traffico rappresentato<br />

da metodi GET dell’HTTP.<br />

http_access allow IP_sorgente<br />

http_access allow dominio_dest<br />

http_access deny metodo_richiesta<br />

Fig. 4-4 - Esempi di regole di ACL<br />

Anche nel caso delle regole è possibile specificare più valori; in questo caso tuttavia<br />

è importante sottolineare che, al contrario degli elementi, le regole lavorano secondo la<br />

logica AND. Rifacendosi quindi alla Fig.4-5, la prima regola consente il passaggio del<br />

traffico proveniente dall’indirizzo 10.0.0.4 solamente se destinato al dominio<br />

www.google.it; la seconda regola nega il traffico generato dall’indirizzo 10.0.0.4 che sia<br />

contemporaneamente effettuato attraverso il metodo GET dell’HTTP. La terza regola infine<br />

non consente il traffico generato attraverso una GET HTTP e diretto verso il dominio<br />

www.google.it.<br />

http_access allow IP_sorgente dominio_dest<br />

http_access deny IP_sorgente metodo_richiesta<br />

http_access deny metodo_richiesta dominio_dest<br />

Fig. 4-5 - Esempi di regole ACL con valori multipli<br />

73


4. Strumenti per la realizzazione di SatSquid<br />

L’insieme quindi degli elementi e delle rispettive regole consente di controllare<br />

finemente il traffico in transito sul proxy server. Le ACL, come precedentemente accennato,<br />

sono infatti state usate nell’ambito del progetto per realizzare il meccanismo di<br />

indirizzamento delle richieste, andando a filtrare in base all’estensione del file richiesto<br />

(Fig.4-6) e, attraverso la regola cache_peer_access che consente di negare o meno l’accesso<br />

ad un determinato cache peer, indirizzando tale traffico dal front-end verso il back-end. La<br />

direttiva never_direct infine, opportunamente settata, impedisce al proxy di collegarsi<br />

direttamente all’origin server per la tipologia di traffico selezionata, un ulteriore controllo<br />

quindi per aumentare la sicurezza di instradare il traffico selezionato verso il back-end.<br />

# L7 SWITCHING tramite ACL<br />

acl MM urlpath_regex -i<br />

\.avi$ \.mpg$ \.mpeg$ \.mov$ \.divx$ \.xvid$ \.mkv$ \.wmv$ \.wav$<br />

\.mp3$ \.ogg$ \.mpc$ \.asf$ \.wma$ \.iso$ \.bin$ \.img$ \.nrg$ \.vob$<br />

\.mdf$<br />

#Su 10.50.5.80 vanno solo i file MM<br />

never_direct allow MM<br />

cache_peer_access 10.50.5.80 deny !MM<br />

Fig. 4-6 - Insieme di ACL usate per effettuare l’indirizzamento delle richieste<br />

4.1.3 File di log<br />

Una ottima fonte di informazioni relativamente alle prestazioni e ai carichi di Squid è<br />

rappresentata dai propri file di log [Squ05b]. Questi file consentono non solo di avere<br />

informazioni di accesso, ma anche informazioni riguardanti errori di configurazione del<br />

sistema e informazioni sul consumo delle risorse. Diversi sono i file di log prodotti da Squid,<br />

alcuni di questi devono essere attivati in fase di compilazione, altri possono essere disattivati<br />

comodamente attraverso il file squid.conf, tra questi abbiamo:<br />

• cache.log: contiene i messaggi di errore e di debug generati da Squid (Fig.4-<br />

7). Questo file non offre molte informazioni utili in fase di analisi automatica<br />

dei log; generalmente viene utilizzato, previa attivazione dei messaggi di<br />

debug, per verificare il motivo di un funzionamento anomalo del proxy server.<br />

74


4. Strumenti per la realizzazione di SatSquid<br />

2005/04/21 17:29:56| Starting Squid Cache version 2.5.STABLE9 for<br />

i686-pc-linux-gnu...<br />

2005/04/21 17:29:56| Process ID 13272<br />

2005/04/21 17:29:56| With 1024 file descriptors available<br />

2005/04/21 17:29:56| Performing DNS Tests...<br />

2005/04/21 17:29:56| Successful DNS name lookup tests...<br />

2005/04/21 17:29:56| DNS Socket created at 0.0.0.0, port 32902, FD 5<br />

2005/04/21 17:29:56| Adding nameserver 195.103.122.10 from<br />

/etc/resolv.conf<br />

2005/04/21 17:29:56| Unlinkd pipe opened on FD 10<br />

2005/04/21 17:29:56| Swap maxSize 11264000 KB, estimated 866461<br />

objects<br />

2005/04/21 17:29:56| Target number of buckets: 43323<br />

…<br />

Fig. 4-7 - Esempio di file cache.log<br />

• useragent.log: necessita di essere espressamente attivato in fase di<br />

compilazione, attraverso il parametro enable-user-agent-log, e consente di<br />

tener traccia dei diversi browser utilizzati dai client. La creazione di tale file<br />

può appesantire un sistema Squid in produzione.<br />

• store.log: questo file di logging (Fig.4-8) può sicuramente essere utilizzato<br />

per reperire informazioni utili sul salvataggio dei file in cache. Esso infatti<br />

tiene traccia di tutti gli elementi trattati da Squid e in particolare di quelli<br />

salvati e di quelli rimossi dalla cache. Quindi, può essere utile per conoscere,<br />

ad esempio, informazioni su quali oggetti sono stati memorizzati e per quanto<br />

tempo sono stati mantenuti in cache. Un oggetto memorizzato in cache viene<br />

identificato con il termine SWAPOUT, mentre un oggetto rimosso dalla<br />

cache è identificato tramite il termine RELEASE.<br />

75


4. Strumenti per la realizzazione di SatSquid<br />

1113974963.327 RELEASE -1 FFFFFFFF D64DC3B5156D41116E4685E6651F5878<br />

404 1113916784 -1 -1 text/html 538/538 GET http://cdnaimtoday.aol.com/aimtoday_daypart/nav_middle<br />

1113974963.650 SWAPOUT 00 00005EC0 0F1E39BACA2F455A107BFD2EF51578FA<br />

200 1113978574 1113933213 -1 image/gif 2790/2790 GET<br />

http://cdn-aimtoday.aol.com/wpt_at_main_am/200504191353_rc_hlm1_i1_1_0<br />

1113974963.809 RELEASE -1 FFFFFFFF 89B143E593B2648C0B8B1424A82F3C09<br />

200 1113978574 -1 1113978574 application/x-javascript 147/147<br />

GET http://ar.atwola.com/html/93139375/508300829/aoladp?<br />

1113974963.978 RELEASE -1 FFFFFFFF ED7BD8D7618355C02D434D971F6A9359<br />

200 1113978575 1093543773 -1 text/html 903/903 GET<br />

http://creativeby.viewpoint.com/A7/N1040/M463/P174/Q2081/B_2_4/index_i<br />

frame_2_4.html?<br />

Fig. 4-8 - Esempio di file store.log<br />

• access.log: le informazioni più importanti reperibili per l’analisi dei log sono<br />

contenute all’interno di questo file (Fig.4-9). Attualmente è possibile avere<br />

due formati di logging relativi a tale file: un formato proprietario di Squid e<br />

un formato secondo il “common log file format” così come definito dal<br />

demone web del CERN.<br />

I due formati di logging contengono informazioni diverse e sicuramente la<br />

versione nativa di Squid fornisce informazioni di utilità maggiore nel caso si<br />

voglia monitorare una cache.<br />

1113377710.386 335 10.250.1.120 TCP_MISS/302 415 GET<br />

http://www.google.com/ - <strong>DI</strong>RECT/66.102.9.104 text/html<br />

1113377710.560 169 10.250.1.120 TCP_MISS/200 1425 GET<br />

http://www.google.it/ - <strong>DI</strong>RECT/66.102.9.104 text/html<br />

1113377711.960 419 10.50.5.81 TCP_MISS/301 400 GET<br />

http://g.msn.com/8HMBITIT/1945? - <strong>DI</strong>RECT/207.68.179.219 -<br />

1113377712.132 50 10.50.5.81 TCP_IMS_HIT/304 208 GET<br />

http://www.msn.it/img/it/it-it/MSNSito/messenger/v7/Local1.css -<br />

NONE/- text/css<br />

1113377712.141 2 10.50.5.81 TCP_IMS_HIT/304 208 GET<br />

http://www.msn.it/img/it/it-it/MSNSito/messenger/v7/main1.css - NONE/-<br />

text/css<br />

1113377712.998 93 10.50.5.81 TCP_HIT/200 18757 GET<br />

http://spe.atdmt.com/b/D3D3IITALMSN/Messenger_Slot_Machine_Turchese_16<br />

0x600.gif - NONE/- image/gif<br />

Fig. 4-9 - Esempio di access.log nel formato nativo di Squid<br />

76


4. Strumenti per la realizzazione di SatSquid<br />

Il formato del file di log nativo di Squid, rappresentato in Fig.4-10, consente<br />

di avere informazioni quali:<br />

- elapsed: rappresenta il tempo che la transazione ha occupato la cache,<br />

calcolato in millisecondi. Esso differisce a seconda del protocollo di<br />

livello transport utilizzato: TCP o UDP. In particolare:<br />

§ per l’HTTP/1.0 è il tempo che intercorre tra una accept() e una<br />

close();<br />

§ per le connessioni persistenti è il tempo che trascorre tra lo<br />

scheduling della risposta e la fine dell’invio della stessa;<br />

§ per l’ICP è il tempo che intercorre tra lo scheduling di una<br />

risposta e l’invio effettivo della stessa.<br />

- Result codes: è divisa in due parti da uno slash, la prima parte è<br />

costituita dai codici specifici di Squid, mentre la seconda parte<br />

rappresenta i codici generati da Squid secondo il formato proprio<br />

dell’HTTP. Questa prima tipologia di codici risulta di grande utilità ai<br />

fini del monitoraggio della cache, in quanto consente di identificare le<br />

informazioni sul tipo di richiesta, su come è stata soddisfatta o il<br />

motivo per cui è fallita. Di seguito vengono mostrati alcuni tra i più<br />

significativi codici:<br />

§ TCP_HIT: una copia valida dell’oggetto era presente in cache;<br />

§ TCP_MISS: l’oggetto richiesto non era presente in cache;<br />

§ TCP_REFRESH_HIT: l’oggetto richiesto era presente in<br />

cache ma marchiato come STALE (vecchio). Tuttavia la<br />

richiesta IMS (If Modified Since) ha ricevuto un codice “304<br />

Not Modified”;<br />

§ TCP_REFRESH_MISS: l’oggetto era presente in cache ma<br />

STALE. La richiesta IMS ha ritornato un nuovo contenuto;<br />

§ TCP_IMS_HIT: l’oggetto richiesto a seguito di una richiesta<br />

IMS era presente in cache e ritenuto fresco;<br />

77


4. Strumenti per la realizzazione di SatSquid<br />

§ TCP_MEM_HIT: una copia valida dell’oggetto, oltre che in<br />

cache, era presente in memoria e quindi non ha richiesto<br />

l’accesso al disco.<br />

- Hierarchy codes: codici relativi alla gerarchia di cache. Sono<br />

composti da tre parti, la prima parte potrebbe essere rappresentata da<br />

un TIMEOUT, nel caso sia occorso un timeout durante l’attesa di tutte<br />

le richieste ICP ai vicini, la seconda parte rappresenta un codice che<br />

identifica come la richiesta è stata trattata (inviata ad un cache peer o<br />

diretta verso l’origin server), la terza e ultima informazione<br />

rappresenta l’indirizzo IP o l’hostname dove la richiesta è stata inviata.<br />

Di seguito vengono evidenziati i codici più significativi:<br />

§ <strong>DI</strong>RECT: l’oggetto è stato prelevato direttamente dall’origin<br />

server;<br />

§ DEFAULT_PARENT: non è stata inviata nessuna richiesta<br />

ICP, poiché è stato usato il cache peer marcato come default<br />

nel file di configurazione;<br />

§ FIRST_PARENT_MISS: l’oggetto è stato prelevato dal cache<br />

peer col valore più basso di RTT (Round Trip Time).<br />

time elapsed remotehost code/status bytes method URL rfc931<br />

peerstatus/peerhost type<br />

Fig. 4-10 - Formato del file di logging access.log proprietario di Squid<br />

4.1.4 Configurazioni varie<br />

Il file di configurazione di Squid, squid.conf, consente una impostazione fine del<br />

programma, permettendo di agire su un insieme innumerevole di impostazioni. Di seguito,<br />

vengono evidenziate solo alcune di esse, quelle che hanno avuto una rilevanza notevole ai<br />

fini del progetto.<br />

• cache_peer: questa direttiva serve per specificare le altre cache facenti parte<br />

della gerarchia. Il formato è quello specificato nell’esempio in Fig.4-11 e<br />

consente di definire, rispettivamente: l’hostname della cache, il proprio ruolo<br />

78


4. Strumenti per la realizzazione di SatSquid<br />

rispetto alla cache in questione, ovvero sibling (allo stesso livello della cache<br />

sulla quale si effettua l’impostazione) oppure parent (ad un livello superiore),<br />

la porta sulla quale tale cache sarà in ascolto per le richieste del proxy, la<br />

porta usata per interrogarla via ICP sul proprio contenuto, infine eventuali<br />

opzioni, tra cui quella rappresentata nell’esempio, proxy-only. Proprio questa<br />

opzione è stata fondamentale nell’architettura adottata in quanto ha consentito<br />

il funzionamento ottimale del meccanismo di indirizzamento delle richieste<br />

implementato tramite le ACL. L’opzione proxy-only, infatti, forza Squid che<br />

utilizza la cache specificata, tramite la direttiva cache_peer, a non salvare per<br />

sé il contenuto dei file scambiati con questa cache. Utilizzando questa<br />

opzione, è stato possibile impostare la cache di front-end in modo tale da non<br />

salvare in cache i file ricevuti dalla cache di back-end, impedendole così di<br />

diventare a sua volta una “replica” di quest’ultima e di vanificare così la<br />

divisione del traffico in base al contenuto.<br />

cache_peer 10.50.5.80 parent 3128 3130 proxy-only<br />

…<br />

Fig. 4-11 - Esempio di impostazione cache_peer usata per i test<br />

• maximum_object_size: questa direttiva consente di specificare le dimensioni<br />

massime di un oggetto in byte memorizzabile in cache. Proprio questa<br />

impostazione, come precedentemente descritto, è stata la causa di un bug<br />

nella versione pushing di Squid, poiché forzava lo Squid di front-end non<br />

solo a non memorizzare, ma addirittura a chiudere la connessione non appena<br />

il file che stava ricevendo dallo Squid di back-end raggiungeva tale limite.<br />

• refresh_pattern: l’impostazione relativa al refresh_pattern è molto importante,<br />

poichè consente di specificare le regole che permettono a Squid di verificare<br />

la freschezza di un file. Come mostrato nell’esempio in Fig.4-12, tale<br />

impostazione si compone rispettivamente di una espressione regolare (usata<br />

per identificare una url per esempio), di un valore min, di un valore percent e<br />

di un valore di max. Il primo dei tre valori rappresenta il tempo (in minuti)<br />

che un oggetto senza un valore di expiry time deve essere considerato fresco,<br />

il secondo rappresenta la percentuale del valore di age (calcolato come:<br />

79


4. Strumenti per la realizzazione di SatSquid<br />

age=ora_attuale-data_creazione_oggetto) per cui un oggetto senza expiry<br />

time esplicito deve essere considerato fresco, il terzo valore, infine,<br />

rappresenta il limite superiore sul tempo per cui un oggetto senza expiry time<br />

deve essere considerato fresco.<br />

refresh_pattern ^ftp: 1440 20% 10080<br />

refresh_pattern ^gopher: 1440 0% 1440<br />

refresh_pattern . 0 20% 4320<br />

Fig. 4-12 - Esempio di impostazioni del parametro refresh_pattern<br />

Come precedentemente accennato, tale direttiva è stata la fonte del bug più<br />

penalizzante della versione di Squid appositamente modificata per il pushing.<br />

Come mostra lo pseudocodice in Fig.4-13, Squid verifica la freschezza<br />

secondo un ordine ben preciso. Dal momento che tale versione di Squid non<br />

memorizzava correttamente il valore del campo relativo alla data di creazione<br />

dell’oggetto impostandolo a 0 (equivalente sotto i sistemi operativi *nix alla<br />

data del 1 Gennaio 1970), il valore di age era sempre pari a circa 35 anni. Di<br />

conseguenza, il secondo controllo in Fig.4-12 falliva sempre e l’unico modo<br />

per far memorizzare qualcosa in cache era quello di impostare il valore di<br />

max oltre i 35 anni.<br />

FRESH if expires < now, else STALE<br />

STALE if age > max<br />

FRESH if lm-factor < percent, else STALE<br />

FRESH if age < min<br />

Else STALE<br />

Fig. 4-13 - Pseudocodice per il controllo della freschezza di un oggetto di Squid<br />

4.2 SNMP<br />

Simple Network Management Protocol è un protocollo di livello applicativo [Coh95],<br />

[Cis02] basato principalmente su UDP, che facilita lo scambio di informazioni di gestione<br />

tra periferiche di rete. Esso consente all’amministratore di rete di gestire le prestazioni della<br />

stessa, trovare e risolvere problemi, nonché pianificarne uno sviluppo. Questo protocollo è<br />

80


4. Strumenti per la realizzazione di SatSquid<br />

stato sviluppato nel 1988 e da allora è diventato uno standard de facto per la gestione delle<br />

reti, poiché richiede un basso sforzo implementativo e consente ai produttori di aggiungere<br />

nuove funzionalità di gestione ai proprio apparecchi. Una rete gestita via SNMP consiste di<br />

due elementi chiave:<br />

1. agente: modulo software per la gestione di rete che risiede su una periferica<br />

monitorizzata. Esso raccoglie e immagazzina le informazioni relative alla<br />

periferica gestita e le rende in un formato compatibile con l’SNMP, può<br />

inoltre inviare dei messaggi asincroni per segnalare eventi al manager;<br />

2. manager: il manager o Network Management Station (NMS), presente su una<br />

rete gestita in una o più macchine, si occupa di monitorizzare e controllare le<br />

periferiche gestite. Esso possiede la potenza di calcolo e la memoria<br />

necessaria alla gestione della rete: interroga gli agenti, riceve le risposte,<br />

imposta delle variabili sugli agenti stessi e infine risponde ad eventi asincroni<br />

inviati da quest’ultimi.<br />

Come precedentemente accennato, gli agenti costituiscono l’interfaccia di gestione<br />

verso le periferiche di rete che implementano il protocollo SNMP. Queste periferiche<br />

possono essere apparati di rete specifici, per esempio router, bridge e switch, ma anche<br />

periferiche varie, come stampanti e altre collegabili in rete e infine anche programmi<br />

dedicati alle reti, tra i quali proprio Squid. Tali periferiche contengono al loro interno una<br />

serie di “oggetti gestiti” sui quali gli agenti prelevano informazioni: questi oggetti possono<br />

essere componenti hardware, parametri di configurazione, statistiche prestazionali e altro<br />

ancora e sono normalmente organizzati in una sorta di database virtuale di informazioni,<br />

chiamato Management Information Base (MIB), nel quale sono raccolte l’insieme delle<br />

proprietà relative ad ogni oggetto gestito. Ognuno di questi oggetti è identificabile<br />

univocamente da un Object Identifier (OID), rappresentato da una serie di numeri interi<br />

separati da punti. Tale struttura è alla base dell’organizzazione gerarchica del MIB,<br />

rappresentabile tramite un albero, in cui ogni livello è assegnato ad una differente<br />

organizzazione (Fig.4-14).<br />

Attualmente esistono tre versioni del protocollo SNMP: SNMPv1, SNMPv2 e<br />

SNMPv3. Mentre la versione 2 estende solamente alcune funzionalità della versione 1, la<br />

versione 3 implementa delle politiche di sicurezza più stringenti e uno schema di<br />

81


4. Strumenti per la realizzazione di SatSquid<br />

autenticazione forte, consentendo lo scambio di informazioni attraverso un canale<br />

crittografato. Infatti, è da sottolineare come, fino alla versione 2 del protocollo, l’accesso agli<br />

agenti da parte delle NMS sia stato caratterizzato dall’utilizzo di una schema di<br />

autenticazione debole, ossia basato sull’uso di password in chiaro, le community string. La<br />

community string, inviata dalle NMS in ogni messaggio SNMP, viene infatti intesa come<br />

una sorta di autenticazione, poiché le NMS che non conoscono il nome della comunità sono<br />

precluse dal poter effettuare operazioni SNMP.<br />

Fig. 4-14 - Albero gerarchico degli OID nel MIB<br />

Nel progetto in esame è stato fatto uso del protocollo SNMP e di alcuni tool specifici<br />

al fine di effettuare il monitoraggio dell’architettura scelta. Innanzi tutto, è stato necessario<br />

abilitare Squid al supporto SNMP [Tag05c], dapprima in fase di compilazione, attraverso la<br />

direttiva enable-snmp nello script di configurazione, quindi settando appositamente delle<br />

ACL, in modo da consentire o meno l’accesso all’agente SNMP di Squid (Fig4-15).<br />

82


## ACL SNMP ##<br />

acl snmppublic snmp_community public<br />

snmp_access allow localhost<br />

snmp_access allow snmppublic localhost<br />

snmp_access deny all<br />

4. Strumenti per la realizzazione di SatSquid<br />

Fig. 4-15 - Esempio di ACL per l'accesso SNMP su Squid<br />

Utilizzando come sistema operativo Linux, sono stati impiegati i tool disponibili in<br />

tale ambiente per il monitoraggio SNMP [Gue97]. In particolare sono stati usati i comandi<br />

da shell:<br />

• smnpwalk: lo scopo di questo comando è quello di “camminare” lungo<br />

l’albero gerarchico del MIB di Squid, così da individuare i valori più<br />

opportuni da monitorare;<br />

• smnpget: la funzionalità di questa utility è quella di prelevare il valore<br />

associato all’OID selezionato.<br />

4.3 MRTG e RRDTOOL<br />

Tuttavia, tali tool di SNMP non erano sufficienti per effettuare un monitoraggio<br />

costante e automatizzato. Di conseguenza, sono stati presi in considerazione due strumenti<br />

entrambi largamente utilizzati nell’ambito del monitoraggio di periferiche di rete via SNMP:<br />

MRTG e RRDTOOL [Tag05d], [MRT05], [Gen05], [Pru04].<br />

Multi Router Traffic Grapher è una applicazione per la gestione di rete, in grado di<br />

monitorizzare qualsiasi periferica ad essa collegata che supporti il protocollo SNMP.<br />

Originariamente, MRTG era stato pensato per monitorizzare solamente le interfacce di un<br />

host di rete; allo stato attuale, consente l’interrogazione di qualsiasi OID supportato è in<br />

grado di costruire un grafico che ne rappresenti le variazioni.<br />

MRTG acquisisce informazioni SNMP eseguendo i seguenti task:<br />

• interroga l’host remoto e recuperare il valore di un OID specifico;<br />

• aggiorna il grafico delle variazioni con i nuovi valori e cancella il grafico<br />

precedente (i grafici sono immagini in formato PNG e possono essere<br />

memorizzati in locale o remoto);<br />

83


4. Strumenti per la realizzazione di SatSquid<br />

• memorizza i nuovi valori in un file di log (anche questo memorizzabile sia in<br />

locale sia in remoto).<br />

Per ogni host monitorizzato è richiesto un file di configurazione dedicato (.cfg), nel<br />

quale vengono definiti gli OID sui quali si vogliono ottenere informazioni. Su tale file verrà<br />

effettuato un parsing da MRTG dal quale estrarre gli OID da interrogare.<br />

Per creare questo file di configurazione è possibile lanciare lo script cfgmaker,<br />

specificando l’indirizzo dell’host da monitorare. Questo script provvede quindi ad<br />

interrogare l’host indicato per estrarre gli OID di tutte le interfacce di rete disponibili e su<br />

quelle costruisce il file di configurazione. Tale tool evidenzia quelle che sono le origini di<br />

MRTG: non a caso un file .cfg così creato riporta solamente gli OID relativi al traffico in<br />

ingresso e uscita delle interfacce di rete di un host, risultando quindi inadatto nel caso di<br />

Squid. Per creare un file di configurazione significativo per Squid, è stato analizzato l’intero<br />

MIB di Squid (disponibile nella cartella squid/share/mib.txt). In tale file è possibile trovare<br />

tutte le OID messe a disposizione da Squid, tra le più significative si possono trovare:<br />

• cacheSysStorage: dimensione dello spazio di swap in KB;<br />

• cacheNumObjCount: numero di oggetti memorizzati in cache;<br />

• cacheCurrentUnusedFDescrCnt: numero dei file descriptor disponibili;<br />

• cacheHttpHits: numero delle richieste HTTP ricevute;<br />

• cacheHitRatio: valore di hit ratio delle richieste.<br />

Il file di configurazione creato (riportato in Appendice B), presenta anche numerosi<br />

parametri, tra i quali quelli relativi alla generazione di grafici: dimensione dell’immagine,<br />

scala dei valori degli assi del grafico, colori impiegati, etc. Altri parametri riguardano la<br />

generazione automatica delle pagine html che è possibile creare usando i grafici prodotti da<br />

MRTG, altri ancora riguardano la selezione della lingua e il caricamento di una particolare<br />

MIB. Tra i numerosi parametri, uno in particolare, interval, consente di selezionare<br />

l’intervallo di monitoraggio, che può essere impostato ad un valore minimo di 5 minuti. Per<br />

scendere sotto tale soglia diventa necessario l’utilizzo di RRDTOOL, congiuntamente a<br />

MRTG.<br />

RRDTOOL è un database Round-Robin (da qui il nome), ovvero un database che<br />

memorizza dati dipendenti dal tempo, in modo da mantenere costanti le dimensioni del<br />

database, “ruotando” i dati memorizzati: quando il database si riempie, i nuovi dati vengono<br />

84


4. Strumenti per la realizzazione di SatSquid<br />

scritti sopra quelli vecchi. Di default, per ogni valore monitorizzato vengono creati database<br />

per tenere 1 giorno di dati ad alta risoluzione, una settimana di dati a 30 minuti, 2 mesi di<br />

dati a 2 ore e due anni di dati ad 1 giorno. Tale strumento risulta molto utile se accoppiato<br />

con MRTG, poiché libera quest’ultimo dal compito di creare i grafici delle variazioni dei<br />

dati raccolti, memorizzandoli all’interno del database per una elaborazione successiva.<br />

Grazie alla diminuzione del carico di MRTG, è possibile diminuire la frequenza di raccolta<br />

dati da una volta ogni 5 minuti ad una volta al minuto.<br />

Per poter utilizzare RRDTOOL come supporto alla memorizzazione dei valori<br />

raccolti sotto MRTG, è necessario modificare appositamente il file di configurazione di<br />

quest’ultimo, secondo quanto riportato nell’esempio in Fig.4-16.<br />

PathAdd: /usr/bin<br />

LibAdd: /usr/share/perl/gentoo-pods/5.8.2<br />

logformat: rrdtool<br />

Interval: 1<br />

Fig. 4-16 - Impostazioni per l'utilizzo di RRDTOOL all'interno di un .cfg di MRTG<br />

I valori così raccolti possono poi essere esportati in XML, al fine di essere elaborati<br />

in seguito. Nel corso del progetto, i valori raccolti sono stati esportati in XML e poi elaborati<br />

in Excel. In Fig.4-17 e Fig.4-18 sono riportati i grafici Excel rispettivamente della<br />

dimensione della cache e del numero di oggetti in essa contenuta, relativamente ad una<br />

giornata di monitoraggio SNMP.<br />

85


4. Strumenti per la realizzazione di SatSquid<br />

Fig. 4-17 - Dimensione della cache in un giorno di utilizzo<br />

Fig. 4-18 - Numero di oggetti in cache in un giorno di utilizzo<br />

86


4.4 Calamaris<br />

4. Strumenti per la realizzazione di SatSquid<br />

Per effettuare il testing dell’architettura è stato necessario reperire le numerose<br />

informazioni utili all’interno dei file di log di Squid. Al fine di automatizzare la procedura è<br />

stato utilizzato un tool molto noto nell’ambito dell’analisi dei file di log di proxy server:<br />

Calamaris [Bee05].<br />

Questo programma, scritto in Perl, è stato creato inizialmente nel 1997, con il solo<br />

scopo di creare un tool per analisi statistiche dei log di Squid. In seguito, visto la crescente<br />

popolarità, è stato riscritto aggiungendo nuove caratteristiche, fino alla attuale versione 3 in<br />

fase di beta, utilizzata per l’analisi dei log dell’architettura scelta, che consente anche la<br />

creazione di grafici a partire dai risultati delle analisi effettuate.<br />

Attualmente Calamaris supporta differenti tipologie di file di log, a seconda del<br />

programma che li ha generati:<br />

• Squid V1.1.alpha1-V2.x<br />

• NetCache<br />

• Inktomi Traffic Server<br />

• Oops! proxy server<br />

• Compaq Tasksmart<br />

• Novell Internet Caching System<br />

• Netscape/iPlanet/SunONE Web Proxy Server<br />

• Squid with the SmartFilter-patch<br />

• Cisco Content Engines<br />

Il funzionamento del programma richiede la configurazione dello stesso, tramite il<br />

file di configurazione calamaris.conf (Appendice C). All’interno di tale file è necessario<br />

attivare le analisi che si vogliono effettuare sui log di interesse, nonché specificare se si<br />

vogliono o meno creare i grafici con i risultati di tali analisi.<br />

Tra le analisi di maggiore interesse vi sono sicuramente quelle relative alle<br />

percentuali di Hit Rate, di Byte/Hit Rate e tutte quelle analisi relative alla distribuzione di<br />

differenti tipologie di informazioni, quali: la tipologia delle richieste, la tipologia dei codici<br />

di risposta, i differenti domini visitati, i tempi di risposta delle richieste, le dimensioni dei<br />

file richiesti (Fig.4-19), etc.<br />

87


4. Strumenti per la realizzazione di SatSquid<br />

Fig. 4-19 - Distribuzione della dimensione e del numero dei file richiesti<br />

88


5. Progettazione e implementazione dei moduli software di SatSquid<br />

5 Progettazione e implementazione dei moduli<br />

software di SatSquid<br />

Le scelte di progetto evidenziate nel Cap.3 hanno guidato la fase di implementazione<br />

dell’architettura di SatSquid. In particolare, la scelta di utilizzare Squid come sistema proxy<br />

server di riferimento ha portato alla necessità di una attenta configurazione dello stesso, al<br />

fine di realizzare una architettura di caching su due livelli, con due istanze di Squid per<br />

livello.<br />

Come evidenziato nel Cap.4, grazie alle opzioni disponibili all’interno del file di<br />

configurazione di Squid, è stato possibile implementare un indirizzamento delle richieste,<br />

distinguendo la tipologia di traffico da trattare per ognuna delle due istanze. Consolidata<br />

l’architettura di base, è stato quindi necessario implementare SPD (Satellite Prefetching<br />

Daemon), il demone che si occupa di effettuare l’analisi dei log e il conseguente prefetching<br />

degli elementi più richiesti, e MMI (Mirroring Management Interface), l’interfaccia di<br />

management per il mirroring dei siti web. Nel corso di questo capitolo verrà innanzitutto<br />

descritto il funzionamento dell’architettura software (5.1), in seguito saranno presentati SPD<br />

(5.2) e MMI (5.3), che costituiscono gli elementi caratterizzanti l’architettura implementata.<br />

5.1 Architettura software di SatSquid<br />

Le architetture software progettate consentono di mascherare la latenza tipica del<br />

canale satellitare. Per comprendere meglio il funzionamento dell’architettura di base di<br />

SatSquid, di seguito vengono presentati due esempi: il primo (Fig.5-1) relativo al caso di una<br />

richiesta di un normale documento web (WD), il secondo (Fig.5-2) relativo alla richiesta di<br />

un documento di tipo multimediale (MM).<br />

Nel primo esempio, un client richiede un normale documento web al secondo livello<br />

di caching. La richiesta, come precedentemente accennato (Cap.3), viene indirizzata al proxy<br />

di front-end. Quest’ultimo, identificata tramite le ACL la tipologia della richiesta (WD),<br />

ricerca nella propria cache la presenza dell’oggetto richiesto. Nel caso tale oggetto sia<br />

presente in cache e considerato “fresco”, lo restituisce direttamente al client, altrimenti<br />

provvede ad inoltrare la richiesta al corrispondente proxy di primo livello. Questo, nel caso<br />

89


5. Progettazione e implementazione dei moduli software di SatSquid<br />

abbia in cache l’oggetto richiesto, lo restituisce al proxy di secondo livello, che a sua volta,<br />

previa memorizzazione dello stesso nella propria cache, lo restituisce al client.<br />

Nell’eventualità in cui, invece, anche il proxy di primo livello non possieda in cache<br />

l’oggetto richiesto, si occupa di prelevarlo dall’origin server, di memorizzarlo nella propria<br />

cache e quindi lo invia al proxy di secondo livello. Quest’ultimo, memorizzato in cache<br />

l’oggetto, lo restituisce al client che ne aveva fatto richiesta.<br />

Fig. 5-1 - Funzionamento dell'architettura software nel caso di richiesta di tipo WD<br />

Nel secondo esempio, invece, la richiesta effettuata da un client è di tipo<br />

multimediale (MM). Il proxy di front-end del secondo livello, tramite l’utilizzo delle ACL,<br />

indirizza la richiesta MM direttamente al proxy di back-end del secondo livello. Questo, nel<br />

caso abbia memorizzato in cache l’oggetto richiesto, provvede ad inviarlo al client,<br />

indirizzandolo attraverso il proxy di front-end. Quest’ultimo, tuttavia, non memorizza nella<br />

propria cache l’oggetto ricevuto dal back-end, ma si limita a indirizzarlo al client. Tale<br />

accorgimento è necessario al fine di evitare che il proxy di front-end diventi una replica di<br />

quello di back-end. Nel caso il proxy di back-end di secondo livello non possieda l’oggetto<br />

richiesto in cache, indirizza la richiesta al corrispettivo proxy di back-end di primo livello.<br />

Ancora una volta, nel caso questo possieda l’oggetto richiesto in cache, lo fornisce<br />

direttamente al proxy di back-end di secondo livello, che, previa memorizzazione nella<br />

propria cache, lo restituisce al client attraverso il proxy di front-end. Nel caso l’oggetto non<br />

risieda invece nella propria cache, il proxy di back-end di primo livello preleva l’oggetto<br />

90


5. Progettazione e implementazione dei moduli software di SatSquid<br />

direttamente dall’origin server, lo invia al proxy di secondo livello, che, dopo averlo<br />

memorizzato, lo invia al client, facendolo transitare per il front-end.<br />

Fig. 5-2 - Funzionamento dell'architettura software nel caso di richiesta di tipo MM<br />

Tali esempi non sono validi nel caso dell’architettura alternativa (mirroring dedicato),<br />

in quanto, in tal caso, non vengono effettuate distinzioni sulla tipologia del traffico, essendo<br />

il proxy di back-end, per ogni livello, dedicato esclusivamente al mirroring. Nel caso, quindi,<br />

di una richiesta verso un sito per il quale è stato effettuato il mirroring (Fig.5-3), il<br />

funzionamento dell’architettura è il seguente: la richiesta viene effettuata dal client verso il<br />

proxy di front-end del secondo livello di caching. Questo, tramite l’ausilio delle ACL,<br />

indirizza tale richiesta direttamente verso il server di back-end di pari livello, il quale, nel<br />

caso abbia memorizzato nella propria cache il contenuto richiesto, lo restituisce attraverso il<br />

server di front-end al client. Nell’eventualità in cui, invece, il server di back-end del secondo<br />

livello non possieda l’oggetto richiesto, provvede ad indirizzare la richiesta verso il server di<br />

back-end di primo livello. Quest’ultimo, a sua volta, invia l’informazione richiesta al proxy<br />

di secondo livello nel caso ne sia in possesso, altrimenti la richiede direttamente all’origin<br />

server, per poi inviarla. Anche in questo caso, come nei due precedenti, il server di front-end<br />

non memorizza in cache le informazioni ricevute dal server di back-end, al fine di evitare di<br />

costituirne una inutile replica.<br />

91


5. Progettazione e implementazione dei moduli software di SatSquid<br />

Fig. 5-3 - Funzionamento dell'architettura software alternativa<br />

Le funzionalità delle due architetture software appena descritte sono state espanse<br />

grazie all’implementazione di due elementi aggiuntivi: SPD e MMI. Tali elementi verranno<br />

meglio descritti nelle sezioni successive.<br />

5.2 SPD (Satelitte Prefetching Daemon)<br />

Il demone SPD costituisce il cuore del meccanismo di prefetching. Esso ha il<br />

compito di analizzare, nei momenti di minor carico (presumibilmente intorno alla<br />

mezzanotte), il file access.log.0 di Squid, creato nella giornata appena trascorsa, per<br />

raccogliere le URL più richieste in una lista, e iniziarne il prefetching. Il linguaggio scelto<br />

per la realizzazione del demone è il Python [Pyt05a]. Il Python è un linguaggio sviluppato<br />

nei primi anni 90 presso il CWI (Centrum voor Wiskunde en Informatica) di Amsterdam.<br />

Esso si caratterizza per essere un linguaggio di alto livello ad oggetti, interpretato e<br />

portabile: attualmente sono diverse le piattaforme che lo supportano, partendo da sistemi<br />

*nix, passando per Windows OS, OS/2, MAC, Amiga, fino ad arrivare ai sistemi Symbian<br />

dei moderni smartphone [Nok05]. La potenza di questo linguaggio è da ricercare<br />

sicuramente nella semplicità della sintassi (non banalizzante tuttavia) e quindi nella rapidità<br />

implementativa che consente in fase di sviluppo. Inoltre, è caratterizzato dalla presenza di<br />

una libreria standard “all inclusive”, ricca cioè di numerosi moduli e funzioni adatti agli<br />

92


5. Progettazione e implementazione dei moduli software di SatSquid<br />

scopi più disparati. Proprio queste sono state le caratteristiche che hanno portato alla scelta<br />

di tale linguaggio: rapidità di sviluppo e utilizzabilità a 360 gradi.<br />

Inoltre, al fine di fornire le funzionalità di demone e di poter quindi avviare il<br />

programma con cadenza regolare in determinati orari della giornata, sono stati utilizzati i<br />

servizi messi a disposizione dal demone cron [Bro05]. Questo demone è utilizzato in tutti i<br />

sistemi operativi *nix e ne esistono diverse implementazioni. Le funzionalità del demone<br />

cron sono quelle di permettere l’esecuzione di comandi, con credenziali impostate, a diversi<br />

intervalli e con una ripetitività selezionata. Cron si attiva all’avvio della macchina e rimane<br />

sempre in funzione, attivandosi ogni minuto per controllare la presenza di operazioni da<br />

eseguire (cron-job), all’interno di una lista di operazioni (/etc/crontab). Ogni riga all’interno<br />

del crontab contiene un comando preceduto da una serie di indicatori della sequenza<br />

temporale di esecuzione dello stesso e dalle credenziali di esecuzione per il comando. Gli<br />

indicatori della sequenza temporale sono rappresentati da cinque campi, rispettivamente: i<br />

minuti (0-59), le ore (0-23), i giorni del mese (1-31), i mesi (1-12) e i giorni della settimana<br />

(0-7, Lunedì è 1, Domenica è 0 e 7). I giorni della settimana e i mesi possono anche essere<br />

inseriti tramite delle abbreviazioni di tre lettere dei corrispettivi in lingua inglese (es: mon,<br />

tue, wed, jan, feb, etc). Infine ogni campo può anche contenere un intervallo di valori (es: 1-<br />

5) o una lista di valori separati da virgole (es: 1,2,3,4). In Fig.5-4 è riportato un esempio di<br />

alcune istruzioni all’interno del crontab.<br />

30 5 1 * * root rm -f /var/spool/cron/lastrun/cron.monthly<br />

* * * * * root test -x /usr/sbin/run-crons && /usr/sbin/runcrons<br />

il seguente:<br />

Fig. 5-4 - Esempio di istruzioni all'interno del crontab<br />

5.2.1 Funzionamento<br />

Il funzionamento di SPD, come mostrato anche nel diagramma di flusso di Fig.5-5 è<br />

• avvio del programma ogni giorno verso le 00:00, nel momento in cui si<br />

suppone esserci meno carico nel sistema;<br />

93


5. Progettazione e implementazione dei moduli software di SatSquid<br />

• parsing del file di configurazione del demone, al fine di determinare diversi<br />

parametri che sono necessari al corretto funzionamento dello stesso (per<br />

esempio: dimensione della cache, posizione del file access.log.0, attivazione<br />

della notifica del funzionamento via mail, etc);<br />

• preparazione, nel caso sia stata attivata l’opzione per la notifica di<br />

funzionamento via mail, delle intestazioni dei messaggi email di notifica;<br />

• analisi del file di log: l’intero file viene controllato richiesta per richiesta,<br />

effettuando un parsing della stessa al fine di individuarne le dimensioni e la<br />

URL di riferimento; per ogni richiesta viene quindi memorizzato il numero di<br />

occorrenze all’interno del file, allo scopo di creare una lista successiva, in cui<br />

le richieste sono ordinate in modo crescente in base al numero di occorrenze,<br />

ovvero dalla più richiesta alla meno richiesta;<br />

• inizio della fase di prefetching delle richieste, partendo, appunto, da quella<br />

con il maggior numero di richieste e tenendo man mano traccia delle<br />

dimensioni occupate, al fine di non superare il 70% delle dimensioni della<br />

cache stessa, per non avviare l’algoritmo di rimpiazzamento. Controllo sulla<br />

presenza di eventuali errori di funzionamento ed eventuale invio di mail di<br />

notifica nel caso sia stata abilitata, nel file di configurazione, la notifica del<br />

funzionamento via mail.<br />

94


5. Progettazione e implementazione dei moduli software di SatSquid<br />

Fig. 5-5 - Diagramma di flusso del funzionamento del demone SPD<br />

95


5. Progettazione e implementazione dei moduli software di SatSquid<br />

5.2.2 Implementazione<br />

Lo scopo del demone SPD è quello di mascherare la latenza insita nel canale<br />

satellitare, prelevando in anticipo (prefetching) i contenuti che con buona probabilità<br />

verranno richiesti in un prossimo futuro. Al fine di raggiungere tale scopo, tuttavia, è stata<br />

necessaria una implementazione dipendente dall’architettura utilizzata: architettura di base o<br />

architettura alternativa.<br />

Nel primo caso, infatti, vista la distinzione in base alla tipologia di traffico effettuata<br />

all’interno del sistema, è necessario utilizzare una istanza di SPD per ognuno dei proxy<br />

presenti nei due livelli di caching. Come mostrato in Fig.5-6, in questo modo viene<br />

effettuato il prefetching proprio in base alla tipologia di traffico. Inoltre, programmando le<br />

partenze delle fasi di prefetching in momenti differenti e temporalmente successivi tra i due<br />

livelli di caching, è possibile ridurre al minimo il ritardo necessario al reperimento delle<br />

informazioni. Così facendo, infatti, si elimina il ritardo normalmente necessario al<br />

prelevamento dell’informazione dall’origin server.<br />

Fig. 5-6 - Funzionamento delle varie istanze di SPD in una architettura base<br />

Nel secondo caso, invece, essendo i server di back-end completamente dedicati al<br />

mirroring dei siti Web, i demoni sono posizionati solamente sui server di front-end (Fig.5-7).<br />

Anche in questo caso, tuttavia, le fasi di prefetching sono temporalmente sfalsate e<br />

successive, al fine di consentire l’eliminazione del ritardo dovuto al prelevamento della<br />

informazioni dall’origin server.<br />

96


5. Progettazione e implementazione dei moduli software di SatSquid<br />

Fig. 5-7 - Funzionamento delle varie istanze di SPD in una architettura alternativa<br />

Per l’implementazione del demone SPD, come precedentemente accennato, è stato<br />

utilizzato il Python, linguaggio di programmazione ad alto livello [Pyt05a]. In questa sezione<br />

saranno evidenziati alcuni elementi tra i più significativi, che hanno caratterizzato la fase di<br />

implementazione dello stesso:<br />

• la configurazione tramite apposito file;<br />

• la gestione del logging e della notifica via mail;<br />

• il parsing dei log tramite espressioni regolari.<br />

5.2.2.1 File di configurazione<br />

Viste le differenti configurazioni in cui è possibile utilizzare il demone SPD (su tutte<br />

e due le istanze di Squid o solamente sul front-end), è stato scelto l’utilizzo di un apposito<br />

file di configurazione, in modo da adattare facilmente il programma ai diversi ambiti di<br />

applicazione. Tale file di configurazione, spd.cfg (Appendice D), è stato pensato risiedere<br />

nella directory dove si trovano normalmente i file di configurazione dei diversi applicativi in<br />

ambiente *nix, ovvero nella directory /etc.<br />

Questo file è stato diviso in tre sezioni: default, posta e smtp. La prima, fondamentale<br />

ai fini del corretto funzionamento del programma, contiene informazioni relative alla<br />

dimensione della cache dello Squid gestito da SPD e il percorso del file di log da analizzare<br />

per la creazione della lista di URL da prelevare in prefetching. Le altre due sezioni<br />

contengono, rispettivamente, le informazioni necessarie ad abilitare la notifica via mail del<br />

97


5. Progettazione e implementazione dei moduli software di SatSquid<br />

logging effettuato da SPD e le eventuali credenziali di accesso al server SMTP per l’invio<br />

della posta.<br />

Per la realizzazione della sezione di parsing del file di configurazione è stato<br />

utilizzato una apposito modulo del Python, ConfigParser [Pyt05d]. Questo modulo consente<br />

di dividere il file di configurazione in sezioni, rappresentate attraverso il nome della sezione<br />

racchiuso tra parentesi quadre (per esempio “[Posta]”), e di inserire delle coppie<br />

“nome=valore” oppure “nome:valore” per ogni sezione. Inoltre, consente anche la<br />

possibilità di inserire dei commenti all’interno di tale file, facendoli precedere dal carattere<br />

“#” o “;”. In Fig.5-8 è riportato un esempio di una sezione contenente valori e commenti.<br />

[DEFAULT]<br />

# Dimensione della cache di squid in MB<br />

dim_cache = 1000<br />

# Path assoluto del file di log da analizzare<br />

log_from = /usr/local/squid/var/logs/access.log.0<br />

Fig. 5-8 - Una sezione del file di configurazione spd.cfg<br />

Definita la struttura del file di configurazione, il modulo ConfigParser mette a<br />

disposizione una serie di funzioni per il parsing di tale file e il recupero, ad esempio, delle<br />

informazioni relative ad un dato valore in una sezione specifica, consentendo anche di<br />

specificare a priori la tipologia dell’informazione recuperata (numero intero o valore<br />

booleano). In Fig.5-9 è riportato un esempio di codice relativo al prelevamento delle<br />

informazioni contenute nella sezione DEFAULT del file di configurazione spd.cfg.<br />

# Utilizzo della sezione DEFAULT<br />

try:<br />

[…]<br />

dim_cache = config.getint('DEFAULT','dim_cache')<br />

# Controllo della sezione [Posta]<br />

try:<br />

[…]<br />

mail = config.getboolean('POSTA','mail')<br />

Fig. 5-9 - Parsing di valori del file spd.cfg<br />

98


5. Progettazione e implementazione dei moduli software di SatSquid<br />

5.2.2.2 Gestione del logging e notifica via mail<br />

Al fine di facilitare il monitoraggio del demone SPD, sono state implementate,<br />

attraverso l’ausilio dei moduli Python smtplib [Pyt05b] e logging [Pyt05e], il logging delle<br />

operazioni compiute dal demone durante il proprio funzionamento e l’eventuale invio della<br />

notifica sul proprio stato di funzionamento via mail all’amministratore del sistema (previa<br />

impostazione all’interno del file di configurazione).<br />

Innanzi tutto, è stato realizzato il logging del demone, salvando le informazioni<br />

necessarie all’interno di un apposito file (/root/spd.log). Il modulo logging mette a<br />

disposizione le funzioni e le classi necessarie a realizzare le funzionalità di logging, in<br />

particolare attraverso i metodi delle istanze della classe Logger. La notifica dei messaggi di<br />

errore viene invece affidata agli oggetti handler. Questi ultimi sono responsabili di notificare<br />

i messaggi di cui si prendono carico in diverse forme e modalità, a seconda della propria<br />

tipologia. Alcuni tra gli handler più significativi sono:<br />

• FileHandler: permette l’invio dei messaggi in un file sul disco;<br />

• DatagramHandler: consente l’invio dei messaggi attraverso un socket UDP;<br />

• SocketHandler: consente l’invio dei messaggi attraverso un socket TCP/IP;<br />

• HTTPHandler: permette l’invio dei messaggi ad un server HTTP, attraverso i<br />

metodi GET e POST dell’HTTP stesso.<br />

I messaggi di logging possono essere opportunamente formattati e sono associabili a<br />

diversi livelli di importanza. In questo modo è possibile impostare un handler affinché<br />

gestisca solamente messaggi con un determinato livello di importanza scelto o al massimo<br />

con un livello superiore. I livelli di importanza sono rispettivamente: DEBUG, INFO,<br />

WARNING, ERROR e CRITICAL. In Fig.5-10 è riportato un esempio di codice utilizzato<br />

per impostare il meccanismo di logging su un apposito file di testo.<br />

99


5. Progettazione e implementazione dei moduli software di SatSquid<br />

p = logging.getLogger('spd_log')<br />

p.setLevel(logging.INFO)<br />

try:<br />

except:<br />

hdlr = logging.FileHandler(log_to,'w')<br />

print 'Error: ', sys.exc_info()[0], sys.exc_info()[1]<br />

format = logging.Formatter('%(asctime)s: %(filename)s -<br />

%(levelname)s: %(message)s')<br />

hdlr.setFormatter(format)<br />

hdlr.setLevel(logging.INFO)<br />

p.addHandler(hdlr)<br />

p.info('\n------------------------------------------------------------<br />

---------\nspd: avvio\n-----------------------------------------------<br />

----------------------\n')<br />

Fig. 5-10 - Inizializzazione del logging su file di testo per il demone SPD<br />

Successivamente alla creazione e alla gestione del logging del demone, è stata anche<br />

inserita la possibilità di notificare via mail all’amministratore di sistema lo stato di<br />

funzionamento del demone, riportando nella mail anche l’indirizzo al quale collegarsi per<br />

effettuare la registrazione e quindi per consultare tale file di logging. A tal proposito, si è<br />

fatto uso del modulo smtplib che consente la creazione e l’invio di email attraverso il<br />

protocollo SMTP. Questo modulo consente la creazione di oggetti sessione SMTP client<br />

attraverso i quali inviare email, permettendo anche, eventualmente, di effettuare una fase di<br />

autenticazione per l’invio della posta. Tre differenti tipologie di messaggi vengono creati in<br />

fase di avvio e sono quindi usati nel testo della mail a seconda della notifica che si vuole<br />

inviare. In Fig.5-11 è riportato il codice usato per inviare una mail in caso di un errore grave,<br />

tale da impedire il corretto funzionamento del demone SPD.<br />

100


5. Progettazione e implementazione dei moduli software di SatSquid<br />

# Apertura del file di log da analizzare<br />

try:<br />

except:<br />

fd = open(log_from,'r',)<br />

p.error(str(sys.exc_info()[0])+str(sys.exc_info()[1]))<br />

hdlr.close()<br />

if mail:<br />

server = smtplib.SMTP(smtp)<br />

if login:<br />

server.login(smtp_login,smtp_passwd)<br />

server.sendmail(from_addr, to_addr, msg3)<br />

server.quit()<br />

sys.exit(1)<br />

Fig. 5-11 - Codice per l'invio di una mail di notifica in caso di errore<br />

5.2.2.3 Espressioni regolari e parsing del log<br />

Il parsing del file di log di Squid è stato realizzato attraverso l’ausilio delle<br />

espressioni regolari, in particolare è stato usato il modulo Python re [Pyt05c]. Tale modulo<br />

consente di effettuare operazioni di matching di espressioni regolari tramite l’utilizzo della<br />

funzione “search(pattern, string)” che ricerca nella stringa il pattern definito nella chiamata.<br />

La definizione del pattern, ovvero dell’espressione regolare da utilizzare per il<br />

riconoscimento, è realizzata in Python facendo uso di combinazioni di caratteri. In<br />

particolare, il carattere più usato e importante in una espressione regolare è il carattere<br />

backslash (“\”). Quest’ultimo, opportunamente combinato con altri caratteri, consente di<br />

indicarne particolari significati o di utilizzare determinati caratteri, senza attribuire loro<br />

speciali significati che normalmente avrebbero. Per esempio: al fine di indicare all’interno di<br />

una espressione regolare lo stesso carattere di backslash, per effettuarne un matching, è<br />

necessario indicare un doppio backslash (“\\”), quindi, per poter trovare un doppio backslash<br />

normalmente usato nella identificazione di una URL è necessario usare la seguente scrittura<br />

“\\\\”. Di seguito sono riportati alcuni caratteri speciali, molto usati nella definizione delle<br />

espressioni regolari.<br />

101


5. Progettazione e implementazione dei moduli software di SatSquid<br />

• “.”: permette il matching di qualsiasi carattere tranne il carattere newline.<br />

• “^”: consente di effettuare il matching a partire dall’inizio di una riga.<br />

• “$”: permette il matching a partire dalla fine di una riga.<br />

• “*”: consente alla espressione regolare risultante di effettuare il matching di<br />

zero o più ripetizioni della espressione regolare che precede tale carattere. Per<br />

esempio ab* permette il matching di ‘a’, ‘ab’ o di ‘a’ seguito da un numero<br />

qualsiasi di ‘b’.<br />

• “+”: permette il matching di una o più ripetizioni della espressione regolare<br />

precedente. Per esempio: ab+, non effettua il matching della sola ‘a’, ma di<br />

‘a’ seguito da un numero di ‘b’ variabile, ma diverso da zero.<br />

• “[]”: consente di specificare un insieme di caratteri, sia individualmente sia<br />

come intervallo tra due caratteri separati da un “-“. I caratteri speciali non<br />

sono attivi all’interno dell’insieme.<br />

• “(…)”: consente il matching di qualsiasi espressione regolare dentro le<br />

parentesi e indica l’inizio e la fine di un gruppo. Il contenuto di un gruppo<br />

può essere recuperato dopo che il matching dello stesso è avvenuto con<br />

successo.<br />

• “\d”: permette il matching di qualsiasi numero decimale, è equivalente<br />

all’insieme [0-9].<br />

• “\w”: consente di effettuare il matching di qualsiasi carattere alfanumerico,<br />

compreso il carattere underscore. E’ equivalente all’insieme [a-zA-Z0-9_].<br />

Combinando opportunamente una serie dei caratteri sopra descritti, è stato possibile<br />

realizzare il matching del formato del file di logging di Squid e, attraverso l’utilizzo dei<br />

gruppi, è stato possibile anche reperire le informazioni necessarie alla creazione della lista di<br />

URL, ovvero la dimensione e l’URL stessa presente in ogni richiesta. In Fig.5-12 è presente<br />

il codice utilizzato per effettuare il matching delle richieste all’interno del file di log di Squid.<br />

102


for line in fd:<br />

5. Progettazione e implementazione dei moduli software di SatSquid<br />

# Espressione regolare per trovare solo le HIT ed estrarne l'url<br />

reg = re.search('_HIT/\d+ (\d+) \w+ (.*)( - )', line)<br />

if reg:<br />

url = reg.group(2) # Recupero la URL dalla regexp<br />

dim = reg.group(1) # Recupero la <strong>DI</strong>M dalla regexp<br />

Fig. 5-12 - Codice necessario al matching delle richieste nel file di log di Squid<br />

5.3 MMI (Mirroring Management Interface)<br />

L’interfaccia di management, MMI, consente di eseguire tutte le operazioni<br />

necessarie ad effettuare il mirroring di un determinato sito web, permettendo di scegliere il<br />

grado di profondità (fino ad un massimo di 3) e un tempo di refresh dei contenuti<br />

(selezionabile tra un elenco preimpostato). Gli utenti che possono accedere a tale interfaccia<br />

sono di due tipologie:<br />

• un utente admin, che ha la possibilità di eseguire operazioni di gestione di<br />

altri utenti e di siti (URL) su cui effettuare il mirroring per una determinata<br />

cache di secondo livello;<br />

• un utente user, il quale, non possedendo privilegi di amministratore, non può<br />

gestire altri utenti o URL, ma si limita a visualizzare informazioni relative ai<br />

siti mirror della propria cache e a consultarne i log.<br />

5.3.1 Funzionamento<br />

Le componenti fondamentali della MMI risiedono sulla cache di primo livello. Solo<br />

su quest’ultima è infatti possibile sia per gli admin, sia per gli user effettuare la procedura di<br />

login nel sistema, al fine di rendere la gestione degli utenti più controllabile e sicura. Alcuni<br />

componenti sono anche posizionati sui secondi livelli di cache, allo scopo di consentirne il<br />

monitoraggio.<br />

In particolare, nel caso dell’architettura di base, gli elementi costituenti la MMI sono<br />

stati posizionati sui proxy di front-end di entrambi i livelli di caching (Fig.5-13). Il motivo di<br />

tale disposizione è da ricercare proprio nelle caratteristiche dell’architettura utilizzata:<br />

103


5. Progettazione e implementazione dei moduli software di SatSquid<br />

dovendo infatti effettuare il mirroring di siti Web, è necessario che le richieste per tali siti<br />

vengano inoltrate direttamente al proxy di front-end di ogni livello, che, a sua volta, le<br />

instrada opportunamente a seconda della tipologia di traffico. Inoltre, utilizzando un sistema<br />

di caching a due livelli, si è deciso, in tale architettura, di avviare il download dei siti Web<br />

sul secondo livello con un ritardo di 15 minuti rispetto a quello sul primo livello, in modo da<br />

consentire ad L1 di recuperare preventivamente dalla rete quanto verrà richiesto in un<br />

secondo tempo da L2.<br />

Fig. 5-13 - Funzionamento della MMI nell’architettura base<br />

Nel caso dell’architettura alternativa (Fig.5-14), invece, il posizionamento degli<br />

elementi fondamentali della MMI interessa i proxy di back-end anziché quelli di front-end.<br />

La scelta è stata dettata, ancora una volta, dall’architettura utilizzata: in tal caso, infatti,<br />

essendo i proxy di back-end totalmente dedicati al mirroring di siti Web, le richieste per il<br />

mirroring vengono indirizzate direttamente ad essi. Discorso analogo all’architettura base,<br />

invece, per quanto riguarda lo sfasamento di 15 minuti tra l’inizio del download di siti Web<br />

sul primo livello e quello sul secondo livello del sistema di caching.<br />

104


fondamentali.<br />

5. Progettazione e implementazione dei moduli software di SatSquid<br />

Fig. 5-14 - Funzionamento MMI nell’architettura alternativa<br />

5.3.2 Implementazione<br />

La realizzazione della MMI è stata possibile grazie all’ausilio di alcune componenti<br />

• PHP [php05], un linguaggio di scripting open-source, utilizzato per la realizzazione<br />

di pagine web dinamiche, ovvero di pagine il cui contenuto viene generato nel<br />

momento in cui queste vengono richieste al server web. Esso opera lato server<br />

permettendo che il codice venga eseguito sul server prima che la pagina sia inviata al<br />

browser; inoltre, viene definito HTML-embedded, poiché inserito direttamente<br />

all’interno di pagine HTML. A differenza di altri linguaggi di programmazione,<br />

come ad esempio C++ e Java, il cui codice sorgente, per poter essere eseguito, deve<br />

prima essere compilato, il PHP è un linguaggio interpretato, ovvero tradotto ed<br />

eseguito istruzione per istruzione. Nello scenario della programmazione web, esso è<br />

tra i più utilizzati e apprezzati.<br />

• MySQL [mys05], database relazionale open-source che può essere utilizzato su<br />

qualsiasi piattaforma software, da Windows alla famiglia Unix e Unix-Like<br />

comprendendo in quest'ultima naturalmente anche Linux, FreeBSD e MacOsX.<br />

105


5. Progettazione e implementazione dei moduli software di SatSquid<br />

• Apache [apa05a], il server web più diffuso e apprezzato in ambito Internet,<br />

disponibile per diverse piattaforme: Aix, Darwin, Freebsd, Hpux, Linux, MacOsX,<br />

NetWare, Os2, Os390, Solaris, Windows, etc. E’ un prodotto altamente scalabile,<br />

poichè mediante la gestione di estensioni - chiamati moduli - è possibile arricchirne<br />

le funzionalità, integrandolo con svariati linguaggi di programmazione, come ad<br />

esempio PHP, Python, Perl, Ruby oppure con moduli dedicati a comunicazioni sicure<br />

(SSL).<br />

• Wget [gnu05], un’applicazione che consente di effettuare il download non interattivo<br />

di file Web, lavorando in background senza aver bisogno della presenza di un utente<br />

per svolgere la propria funzione. Esso può anche essere opportunamente impostato<br />

per scaricare un sito fino ad un livello di profondità scelto e proprio per questo è stato<br />

utilizzato nell’implementazione della MMI. Nel progetto in esame, per l’istruzione di<br />

wget, si è scelto di dare la possibilità di selezionare tra otto frequenze, (ogni 30<br />

minuti, ogni ora, ogni 2 ore, ogni 6 ore, ogni 12 ore, 1 volta al giorno, 1 volta alla<br />

settimana, 1 volta al mese), caratterizzate da orari di inizio sfasati tra loro in modo da<br />

minimizzare il numero di esecuzioni simultanee di cron-job. L’istruzione di wget,<br />

inoltre, risulta caratterizzata da una serie di parametri opzionali, tra i quali si è scelto<br />

di utilizzare:<br />

▪ “-l” per fissare il livello di profondità;<br />

▪ “-r” per abilitare il download ricorsivo;<br />

▪ “-p” per scaricare tutti i file necessari alla visualizzazione di una pagina;<br />

▪ “-P” per stabilire in quale cartella scaricare i siti Web;<br />

▪ “--delete-after” per cancellare i file dopo il download.<br />

5.3.2.1 Il database<br />

Il database, realizzato tramite MySQL, è stato strutturato, nell’architettura di base,<br />

secondo cinque tabelle: cache, siti, siti_cache, tipo_utenti, utenti.<br />

La tabella cache elenca le varie cache L2 o meglio i vari front-end di livello 2<br />

contraddistinti dal loro indirizzo IP.<br />

La tabella siti archivia le url dei siti Web di cui si vuole fare il mirroring, insieme con<br />

il corrispondente livello di profondità e frequenza di refresh.<br />

106


5. Progettazione e implementazione dei moduli software di SatSquid<br />

La tabella siti_cache è una tabella di collegamento che serve per gestire la relazione<br />

molti a molti tra le due tabelle precedenti.<br />

La tabella tipo_utenti definisce i vari profili utente ed è precaricata una tantum<br />

all’atto della creazione della tabella stessa.<br />

La tabella utenti elenca i vari utenti con relativa password, e-mail, profilo ed<br />

identificativo della cache associata nel caso di utente senza privilegi di amministratore.<br />

Le relazioni che legano tra loro tali tabelle sono rappresentate in Fig.5-15 e possono<br />

essere descritte come segue.<br />

• La tabella cache è in relazione “uno a uno” con la tabella utenti, poiché si è<br />

deciso di associare ad ogni utente un unico indirizzo IP, quello relativo alla<br />

propria cache, mentre è in relazione “molti a molti” con la tabella siti, poiché<br />

il mirror di un sito può essere richiesto su più cache e ogni cache può<br />

memorizzare più siti mirror.<br />

• La tabella tipo_utenti, invece, è in relazione “uno a molti” con la tabella<br />

utenti, in quanto è possibile inserire più utenti di tipo user.<br />

Fig. 5-15 - Relazioni tra le tabelle del database di MMI in configurazione base<br />

Nell’architettura alternativa (Fig.5-16), il database risulta sempre strutturato secondo<br />

le cinque tabelle. Alla tabella cache, però, viene aggiunto un nuovo campo, ip_be, che tiene<br />

107


5. Progettazione e implementazione dei moduli software di SatSquid<br />

conto dell’indirizzo IP della macchina di back-end di livello 2, necessario per le operazioni<br />

di inserimento, modifica e rimozione sul crontab corrispondente. Infatti, in tale architettura,<br />

è la macchina di back-end quella interessata al caching di siti mirror.<br />

Fig. 5-16 - Relazione tra le tabelle del database di MMI in configurazione alternativa<br />

5.3.2.2 Il software di gestione<br />

Il software di gestione MMI, sviluppato in PHP, consente, a mezzo di un’interfaccia<br />

di autenticazione (Fig.5-17), di accedere ad un’area amministratori, se si è registrati come<br />

utente con privilegi di amministratore o ad un’area utenti in caso contrario.<br />

108


5. Progettazione e implementazione dei moduli software di SatSquid<br />

Fig. 5-17 - Interfaccia di autenticazione<br />

Un amministratore può effettuare operazioni di inserimento, modifica e rimozione sia<br />

di utenti (di tipo admin o user) che di url di siti Web di cui si vuol fare il mirroring fino ad<br />

un livello di profondità selezionato. La modalità con cui vengono eseguite tali operazioni<br />

sarà descritta in maniera più dettagliata nei sottoparagrafi successivi.<br />

Un utente, invece, può consultare in qualsiasi momento i log relativi alle richieste<br />

ricevute e le url dei siti mirror, che vengono scaricati con una certa frequenza sulla propria<br />

cache.<br />

Per entrambe le tipologie di utente, l’accesso all’area loro consentita apre una<br />

sessione che termina mediante un’operazione di “log out”. Inoltre, opportuni controlli nel<br />

codice (Fig.5-18) impediscono ad utenti non autorizzati di accedere anch’essi a tali aree,<br />

rendendo la struttura più robusta in termini di sicurezza.<br />

109


function denied_access() {<br />

}<br />

5. Progettazione e implementazione dei moduli software di SatSquid<br />

session_start();<br />

$user = $_SESSION['username'];<br />

# connessione al database<br />

include ("../connect.php");<br />

$query = "SELECT * FROM utenti WHERE nome_utente = '$user'";<br />

$result = mysql_query($query, $db);<br />

$row = mysql_fetch_array($result);<br />

# chiusura connessione<br />

include ("../close.php");<br />

# se il login viene bypassato, viene negato l'accesso<br />

if ($user == NULL || $row['id_tipo_utente'] != 0) {<br />

session_destroy();<br />

return true;<br />

}<br />

else {<br />

return false;<br />

}<br />

Fig. 5-18 - Codice per il controllo dei diritti di accesso<br />

L’implementazione della MMI è stata conseguita con poche differenze tra<br />

l’architettura di base e quella alternativa. Di seguito verranno descritti i componenti (Fig.5-<br />

19) costituenti la MMI, evidenziando di volta in volta le eventuali differenze sopra accennate.<br />

110


5. Progettazione e implementazione dei moduli software di SatSquid<br />

Fig. 5-19 - Diagramma di flusso del funzionamento di MMI<br />

111


5. Progettazione e implementazione dei moduli software di SatSquid<br />

5.3.2.2.1 Inserimento di un utente<br />

L’operazione di inserimento di un utente avviene mediante un’interfaccia grafica<br />

(Fig.5-20), dove tutti i campi sono stati imposti come obbligatori e pertanto controllati da un<br />

codice Javascript [jav05] che impedisce il processamento dei dati immessi quando uno o più<br />

di essi risultino incompleti o riempiti secondo un formato non corretto.<br />

Fig. 5-20 - Interfaccia di inserimento utente<br />

Nell’architettura alternativa è presente, però, un ulteriore campo (Fig.5.21) per<br />

l’eventuale inserimento dell’indirizzo IP del proxy di back-end da associare, insieme a<br />

quello di front-end, a un nuovo utente non amministratore. Il motivo di tale scelta, come<br />

precedentemente accennato, è dovuto alla necessità di effettuare operazioni di inserimento,<br />

modifica e rimozione sul crontab della macchina di back-end.<br />

112


5. Progettazione e implementazione dei moduli software di SatSquid<br />

Fig. 5-21 - Interfaccia di inserimento utente in configurazione alternativa<br />

La modalità con cui viene effettuata l’operazione di inserimento utente, comunque, è<br />

ben rappresentata dal diagramma di flusso di Fig.5-22.<br />

113


5. Progettazione e implementazione dei moduli software di SatSquid<br />

Fig. 5-22 - Diagramma di flusso dell'inserimento utente<br />

Al momento dell’inserimento, se l’utente risulta già presente nel database, viene<br />

proposto all’amministratore di modificarlo o di ripetere l’operazione di inserimento,<br />

altrimenti viene esaminato il tipo di utente che si vuole inserire. Se l’utente è di tipo<br />

amministratore, viene inserita una nuova riga all’interno della tabella utenti, altrimenti viene<br />

aggiunta una riga nella tabella cache e una ancora nella tabella utenti, dove viene riportato<br />

l’id della cache risultato dall’inserimento precedente; questo avviene perché all’utente di tipo<br />

non amministratore corrisponde univocamente l’indirizzo IP della cache associata, pertanto<br />

quest’ultimo passo viene eseguito solo se l’indirizzo IP immesso non risulta già presente nel<br />

database. In Fig.5-23 è riportato il codice che realizza i due casi appena descritti.<br />

114


5. Progettazione e implementazione dei moduli software di SatSquid<br />

$queryUtenti = "INSERT INTO utenti (id_utente, nome_utente, password,<br />

email, id_tipo_utente, id_cache) VALUES ('', '$username', '$password',<br />

'$email', '$tipo', '0')";<br />

[…]<br />

$queryInsertCache = "INSERT INTO cache (id_cache, ip_cache) VALUES<br />

( '', '$ip')";<br />

$queryUtenti = "INSERT INTO utenti ( id_utente, nome_utente, password,<br />

email, id_tipo_utente, id_cache) VALUES ('','$username', '$password',<br />

'$email', '$tipo', '$idCache')";<br />

Fig. 5-23 - Codice relativo all'inserimento utenti<br />

L’esito delle operazioni effettuate in questa sezione, come in quelle che seguono,<br />

viene sempre stampato a video, sia esso positivo o negativo, consentendo, quindi, di<br />

effettuare una nuova operazione.<br />

5.3.2.2.2 Modifica di un utente<br />

Con l’operazione di modifica di un utente si è tenuto conto dell’eventualità in cui si<br />

possa inserire una tipologia di utente errata. Dal menù “modifica utente” si accede ad una<br />

pagina dove si può scegliere se ricercare l’utente da modificare o visualizzare tutti gli utenti<br />

presenti nel database (Fig.5-24) per poi caricare i dati relativi a quello selezionato.<br />

115


Fig.5-25.<br />

5. Progettazione e implementazione dei moduli software di SatSquid<br />

Fig. 5-24 - Interfaccia di modifica utente<br />

Possono verificarsi quattro casi di utilizzo, rappresentati nel diagramma di flusso di<br />

116


5. Progettazione e implementazione dei moduli software di SatSquid<br />

Fig. 5-25 - Diagramma di flusso della modifica utenti<br />

Un primo caso che si può presentare, una volta confermati i cambiamenti apportati, è<br />

quello in cui si modifica un tipo amministratore in un tipo utente. In tal caso viene inserita<br />

una nuova riga nella tabella cache, dopodiché viene aggiornata la corrispondente riga della<br />

tabella utenti, riportando il nuovo indirizzo IP immesso, purché esso non risulti già inserito<br />

nel database (Fig.5-26).<br />

$queryInsertCache = "INSERT INTO cache (id_cache, ip_cache) VALUES<br />

('', '$ip')";<br />

[…]<br />

$queryUpdate = "UPDATE utenti SET nome_utente='$username',<br />

password='$password', email='$email', id_tipo_utente='$tipo',<br />

id_cache='$idCache' WHERE id_utente = '$id_utente'";<br />

Fig. 5-26 - Codice per la modifica di un amministratore in un utente<br />

Un secondo caso è la modifica di un amministratore che comporta semplicemente<br />

l’aggiornamento di un’opportuna riga della tabella utenti (Fig.5-27).<br />

117


5. Progettazione e implementazione dei moduli software di SatSquid<br />

$queryUpdate = "UPDATE utenti SET nome_utente='$username',<br />

password='$password', email='$email', id_tipo_utente='$tipo',<br />

id_cache='0' WHERE id_utente = '$id_utente'";<br />

Fig. 5-27 - Codice per la modifica di un amministratore<br />

Un terzo caso si può avere quando si modifica un tipo utente in un tipo<br />

amministratore. In tale circostanza, l’indirizzo IP associato alla cache dell’utente non è più<br />

necessario, quindi viene rimossa la corrispondente riga dalla tabella cache e viene aggiornata<br />

la riga interessata sulla tabella utenti. In Fig.5-28 è riportato il codice relativo a tale caso.<br />

$queryDeleteCache = "DELETE FROM cache WHERE ip_cache='$ipCache'";<br />

[…]<br />

$queryUpdate = "UPDATE utenti SET nome_utente='$username',<br />

password='$password', email='$email', id_tipo_utente='$tipo',<br />

id_cache='0' WHERE id_utente = '$id_utente'";<br />

Fig. 5-28 - Codice per la modifica di un utente in amministratore<br />

Quarto ed ultimo caso riguarda la modifica di un utente di tipo non amministratore.<br />

Qui si controlla se l’indirizzo IP della cache associata all’utente è stato modificato. Se è<br />

rimasto invariato, si aggiorna semplicemente la riga interessata sulla tabella utenti, altrimenti,<br />

purché il nuovo indirizzo IP non risulti già inserito nel database, viene rimossa dalla tabella<br />

cache la riga relativa a tale indirizzo prima della modifica, ne viene inserita una nuova,<br />

corrispondente al nuovo indirizzo IP e viene aggiornata la corrispondente riga della tabella<br />

utenti, che tiene conto anche del nuovo indirizzo immesso (Fig.5-29).<br />

$queryUpdate = "UPDATE utenti SET nome_utente='$username',<br />

password='$password', email='$email', id_tipo_utente='$tipo' WHERE<br />

id_utente = '$id_utente'";<br />

[…]<br />

$queryDeleteCache = "DELETE FROM cache WHERE ip_cache='$ipCache'";<br />

[…]<br />

$queryInsertCache = "INSERT INTO cache (id_cache, ip_cache) VALUES<br />

('', '$ip')";<br />

[…]<br />

$queryUpdate = "UPDATE utenti SET nome_utente='$username',<br />

password='$password', email='$email', id_tipo_utente='$tipo',<br />

id_cache='$idCache' WHERE id_utente = '$id_utente'";<br />

Fig. 5-29 - Codice per la modifica di un utente<br />

118


5. Progettazione e implementazione dei moduli software di SatSquid<br />

5.3.2.2.3 Rimozione di un utente<br />

Analogamente alla modifica, dal menù “rimozione utente” si accede ad una pagina<br />

dove si può scegliere se ricercare l’utente da eliminare o visualizzare tutti gli utenti presenti<br />

nel database per selezionare quello che si vuole rimuovere.<br />

L’operazione di cancellazione di un utente è stata implementata in modo da impedire,<br />

mediante un opportuno controllo, la rimozione di un amministratore nel caso in cui fosse<br />

l’unico presente nel database con tali privilegi.<br />

Qualora fosse consentita, però, la rimozione di un amministratore, essa si<br />

risolverebbe nella cancellazione dalla tabella utenti di un’opportuna riga, come mostra il<br />

codice in Fig.5-30.<br />

$queryDeleteUtenti = "DELETE FROM utenti WHERE id_utente='$idUtente'";<br />

Fig. 5-30 - Codice per la rimozione di un amministratore<br />

La richiesta di cancellazione di un utente, invece, si risolverebbe in maniera analoga,<br />

eliminando però anche una riga dalla tabella cache, quella che tiene memoria dell’indirizzo<br />

IP della cache associata (Fig.5-31).<br />

$queryDeleteUtenti = "DELETE FROM utenti WHERE id_utente='$idUtente'";<br />

[…]<br />

$queryDeleteCache = "DELETE FROM cache WHERE ip_cache='$ip'";<br />

Fig. 5-31 - Codice per la rimozione di un utente<br />

5.3.2.2.4 Inserimento di un sito mirror<br />

L’inserimento di un sito mirror ha senso quando la url immessa non risulta già<br />

associata all’indirizzo IP digitato (in tal caso verrebbe proposto all’amministratore di<br />

apportare modifiche o di riprovare l’operazione di inserimento) e quando l’indirizzo IP<br />

immesso è presente nel database.<br />

L’operazione di inserimento avviene tramite un’interfaccia mostrata in Fig.5-32.<br />

119


5. Progettazione e implementazione dei moduli software di SatSquid<br />

Fig. 5-32 - Interfaccia per l'inserimento di un sito mirror<br />

Anche in questa circostanza, c’è da puntualizzare la differenza con l’architettura<br />

alternativa per la presenza del campo relativo all’indirizzo IP della macchina di back-end di<br />

livello 2 (Fig.5.33).<br />

120


5. Progettazione e implementazione dei moduli software di SatSquid<br />

Fig. 5-33 - Interfaccia per l'inserimento di un sito mirror in configurazione alternativa<br />

L’operazione di inserimento è descritta dal diagramma di flusso in Fig.5-34.<br />

L’inserimento è stato implementato in modo che una stessa URL venga inserita più<br />

volte nella tabella siti, con id diversi ed altrettanti conseguenti inserimenti nella tabella di<br />

collegamento siti_cache, purchè la coppia livello di profondità / frequenza di refresh ad essa<br />

associata risulti ogni volta diversa.<br />

121


5. Progettazione e implementazione dei moduli software di SatSquid<br />

Fig. 5-34 - Diagramma di flusso dell'inserimento di un sito mirror<br />

Nel caso di inserimento di una URL già esistente nel database, il livello di profondità<br />

e la frequenza di refresh vengono aggiornati nel crontab L1 secondo il livello di profondità<br />

maggiore e la frequenza di refresh più elevata associate a tale URL e rilevate nel database.<br />

122


5. Progettazione e implementazione dei moduli software di SatSquid<br />

Nel crontab L2, invece, i valori inseriti sono pari a quelli immessi, con frequenza di refresh,<br />

però, impostata con un ritardo di 15 minuti rispetto a quella digitata.<br />

Nel caso di inserimento di una URL non presente nel database, si procede<br />

all’inserimento di una nuova riga nella tabella siti, una nella tabella di collegamento<br />

siti_cache e una nelle tabelle del cron L1 ed L2, con valori di profondità e refresh pari a<br />

quelli immessi (Fig.5-35).<br />

$queryInsert= “INSERT INTO siti (id_sito, url, profondita, refresh)<br />

VALUES (‘’, ‘$url’, ‘$level’ ,’$refresh’)”;<br />

[…]<br />

$queryInsertSitiCache = “INSERT INTO siti_cache (id_sito, id_cache)<br />

VALUES (‘$idSito’, ‘$idCache’)”;<br />

[…]<br />

$fp=fopen(“../../../../../../etc/crontab”,”a+”); // path da<br />

personalizzare!!!<br />

Fputs($fp,$refresh . “ root /usr/bin/wget –r –l “ . $level . “ –p –P<br />

/home/destinazione “ . $url . “\n”);<br />

fclose($fp);<br />

Fig. 5-35 - Codice per l'inserimento di una URL non presente nel database<br />

In entrambi i casi, per l’architettura alternativa, segue un’operazione di<br />

aggiornamento del file di configurazione di Squid sul front-end di livello 2,<br />

/usr/local/squid/etc/squid.conf, mediante l’inserimento di opportune ACL che consentono di<br />

inoltrare le richieste di mirroring sulla macchina di back-end (Fig.5-36).<br />

$name = substr($site, 8, 10);<br />

$aclname = str_shuffle($name);<br />

# inserimento nel file squid.conf del Front-End L2<br />

$fp=fopen("../../../../usr/local/squid/etc/squid.conf","a+");<br />

fputs($fp,"acl " . $aclname . " url_regex -i ^" . $site . "\n");<br />

fputs($fp,"cache_peer_access " . $ipBe . " allow\n");<br />

fputs($fp,"never_direct allow " . $aclname . "\n");<br />

fclose($fp);<br />

Fig. 5-36 - Codice per l'inserimento delle ACL in squid.conf nel caso di architettura alternativa<br />

5.3.2.2.5 Modifica sito mirror<br />

L’operazione di modifica di un sito mirror è stata implementata in modo da poter<br />

modificare solo i campi relativi alla profondità e al refresh. Come si intuisce dal diagramma<br />

di flusso di Fig.5-37, in tale sezione si tiene conto dei quattro casi che si possono presentare.<br />

123


5. Progettazione e implementazione dei moduli software di SatSquid<br />

Fig. 5-37 - Diagramma di flusso della modifica di un sito mirror<br />

Il primo è relativo al caso in cui la URL prima della modifica risulti associata a più di<br />

un indirizzo IP e le modifiche apportate vengano a coincidere con quelle associate ad<br />

un’altra identica URL presente nel database. Tale caso comporta l’aggiornamento dell’id<br />

della URL all’interno di un’opportuna riga della tabella siti_cache e l’aggiornamento del<br />

crontab L1 ed L2 sulla base dei valori modificati di profondità e/o refresh, come evidenziato<br />

dal codice in Fig.5-38.<br />

124


5. Progettazione e implementazione dei moduli software di SatSquid<br />

$queryUpdateSitiCache = "UPDATE siti_cache SET id_sito='$idUrl' WHERE<br />

id_cache='$idCache' AND id_sito='$idSito'";<br />

…………………………<br />

$array = file ("../../../../../../etc/crontab");<br />

$lenght = count($array);<br />

$i=0;<br />

$found = false;<br />

while (($i < $lenght) && ($found == false)) {<br />

if (substr_count($array[$i], $RefreshBeforeUpdateString . " root<br />

/usr/bin/wget -r -l " . $LevelBeforeUpdate . " -p -P /home/toni " .<br />

$url) > 0) {<br />

$array[$i]=$newRefreshString . " root /usr/bin/wget -r -l<br />

" . $newLevel . " -p -P /home/toni " . $url . "\n";<br />

$found = true;<br />

}<br />

$i++;<br />

}<br />

$fp=fopen("../../../../../../etc/crontab","w+"); // path da<br />

personalizzare!!!<br />

$j=0;<br />

while ($j < $lenght) {<br />

fputs($fp, $array[$j]);<br />

fclose($fp);<br />

$fp=fopen("../../../../../../etc/crontab","a+"); // path da<br />

personalizzare!!!<br />

$j++;<br />

}<br />

fclose($fp);<br />

Fig. 5-38 - Codice per la modifica di una URL associata a più L2 con campi identici<br />

Il secondo riguarda il caso in cui la URL prima della modifica non risulti associata ad<br />

alcun indirizzo IP e le modifiche apportate vengano a coincidere con quelle associate ad<br />

un’altra identica URL presente nel database. Questa situazione comporta ancora<br />

l’aggiornamento del campo id_sito di un’opportuna riga della tabella siti_cache, insieme con<br />

l’aggiornamento del crontab L1 ed L2; in più, è necessaria la rimozione dalla tabella siti<br />

della riga relativa alle vecchie impostazioni della URL (Fig.5-39).<br />

$queryDeleteSiti = "DELETE FROM siti WHERE id_sito='$idSito'";<br />

Fig. 5-39 - Codice per la modifica di una URL con una unica associazione, ma associazioni multiple a<br />

seguito della modifica<br />

Il terzo caso tiene conto invece del fatto che la URL prima della modifica risulti<br />

associata a più di un indirizzo IP e che non sia presente alcun altra identica URL con i campi<br />

così modificati. Una tale situazione comporta l’inserimento di una nuova riga nella tabella<br />

siti relativa all’URL con profondità e/o refresh modificati, l’aggiornamento della<br />

125


5. Progettazione e implementazione dei moduli software di SatSquid<br />

corrispondente riga sulla tabella siti_cache con il nuovo id_sito e l’aggiornamento del<br />

crontab L1 ed L2 (Fig.5-40).<br />

$queryInsert= "INSERT INTO siti (id_sito, url, profondita, refresh)<br />

VALUES ('', '$url', '$level' ,'$refreshTime')";<br />

…………………………<br />

$queryUpdateSitiCache = "UPDATE siti_cache SET id_sito='$newIdSito'<br />

WHERE id_cache='$idCache' AND id_sito='$idSito'";<br />

Fig. 5-40 - Codice per la modifica di una URL associata a più L2 con campi diversi<br />

Il quarto ed ultimo caso, in cui la URL prima della modifica non risulti associata ad<br />

alcun indirizzo IP e non sia presente nessun’altra identica URL con i campi così modificati,<br />

comporta semplicemente l’aggiornamento di un’opportuna riga della tabella siti con i valori<br />

modificati di profondità e/o refresh e l’aggiornamento del crontab L1 ed L2 sulla base di tali<br />

valori, come mostrato dal codice in Fig.5-41.<br />

$queryUpdate = "UPDATE siti SET profondita='$level',<br />

refresh='$refreshTime' WHERE url='$url' AND profondita='$oldLevel' AND<br />

refresh='$oldRefresh'";<br />

Fig.5-42.<br />

Fig. 5-41 - Codice per la modifica di una URL con una unica associazione<br />

5.3.2.2.6 Rimozione di un sito mirror<br />

L’operazione di rimozione di un sito mirror è descritta dal diagramma di flusso in<br />

126


5. Progettazione e implementazione dei moduli software di SatSquid<br />

Fig. 5-42 - Diagramma di flusso della rimozione di un sito mirror<br />

Essa comporta la sola cancellazione di un’opportuna riga dalla tabella siti_cache se<br />

ci sono altri indirizzi IP associati alla URL selezionata, altrimenti viene rimossa anche la riga<br />

della tabella siti relativa alla URL in questione (Fig.5-43).<br />

127


5. Progettazione e implementazione dei moduli software di SatSquid<br />

$queryDeleteSitiCache = "DELETE FROM siti_cache WHERE<br />

id_cache='$idCache' AND id_sito='$idSito'";<br />

…………………………<br />

$queryDeleteSiti = "DELETE FROM siti WHERE id_sito='$idSito'";<br />

Fig. 5-43 - Codice per la rimozione di un sito in mirroring<br />

A questo punto, se nel database esistono altre URL uguali a quella rimossa, viene<br />

aggiornato il crontab L1 e viene rimossa la riga corrispondente alla URL eliminata nel<br />

crontab L2, altrimenti viene rimossa la riga corrispondente alla URL cancellata in entrambi i<br />

crontab L1 ed L2 (Fig.5-44).<br />

# rimozione dal crontab<br />

$array = file ("../../../../../../etc/crontab");<br />

$lenght = count($array);<br />

$i=0;<br />

$found = false;<br />

while (($i < $lenght) && ($found == false)) {<br />

if (substr_count($array[$i], $refreshTime . " root /usr/bin/wget<br />

-r -l " . $level . " -p -P /home/toni " . $url . "\n") > 0) {<br />

$found = true;<br />

}<br />

$i++;<br />

}<br />

$fp=fopen("../../../../../../etc/crontab","w+"); // path da<br />

personalizzare!!!<br />

$j=0;<br />

while ($j < $lenght) {<br />

if ($j != $i-1) {<br />

fputs($fp, $array[$j]);<br />

fclose($fp);<br />

$fp=fopen("../../../../../../etc/crontab","a+"); // path<br />

da personalizzare!!!<br />

}<br />

$j++;<br />

}<br />

fclose($fp);<br />

Fig. 5-44 - Codice per la rimozione delle operazioni nel crontab<br />

Anche in tale circostanza, per l’architettura alternativa, segue un’operazione sul file<br />

di configurazione di Squid del front-end L2. In questo caso però si tratta di una rimozione<br />

delle opportune righe inserite per inoltrare le richieste di mirroring sul proxy di back-end<br />

(Fig.5-45).<br />

128


5. Progettazione e implementazione dei moduli software di SatSquid<br />

$array = file ("../../../../usr/local/squid/etc/squid.conf");<br />

$lenght = count($array);<br />

$i=0;<br />

$found = false;<br />

while (($i < $lenght) && ($found == false)) {<br />

if (substr_count($array[$i], "url_regex -i ^" . $site) > 0) {<br />

$found = true;<br />

}<br />

$i++;<br />

}<br />

$fp=fopen("../../../../usr/local/squid/etc/squid.conf","w+"); // path<br />

da personalizzare!!!<br />

$j=0;<br />

while ($j < $lenght) {<br />

if ($j != $i-1 && $j != $i && $j != $i+1) {<br />

fputs($fp, $array[$j]);<br />

fclose($fp);<br />

$fp=fopen("../../../../usr/local/squid/etc/squid.conf","a+"); //<br />

path da personalizzare!!!<br />

}<br />

$j++;<br />

}<br />

fclose($fp);<br />

Fig. 5-45 - Codice per la rimozione di un sito in mirroring nel caso di configurazione alternativa<br />

129


6 Testing e analisi dei risultati<br />

6. Testing e analisi dei risultati<br />

Completate le fasi di progettazione e implementazione, si è proceduto con una serie<br />

di test, con lo scopo di validare l’architettura progettata. Tali test sono stati condotti<br />

attraverso alcuni strumenti atti a simulare sia il comportamento di un insieme di utenti, sia le<br />

caratteristiche tipiche di una connessione satellitare. Nel corso del capitolo sarà innanzitutto<br />

presentata l’architettura di testing (6.1), comprensiva degli strumenti di testing utilizzati,<br />

quali il log_player e l’emulatore di rete netem, quindi verranno mostrati (6.2) i risultati<br />

ottenuti durante le simulazioni e la relativa analisi (6.3).<br />

6.1 Architettura di testing<br />

Lo scopo del testing effettuato era quello di validare il funzionamento<br />

dell’architettura e in particolare l’efficacia del demone SPD, elemento ritenuto fondamentale<br />

nell’architettura progettata. A tal fine sono state utilizzate due macchine così assemblate:<br />

- PC1<br />

- PC2<br />

• Processore AMD AthlonXP 2400+;<br />

• Sistema Operativo Linux (distribuzione Gentoo);<br />

• Kernel 2.6.10-r7;<br />

• 512MB di RAM;<br />

• 160GB di HD;<br />

• NIC 3COM 100Mbit/sec;<br />

• NIC NVI<strong>DI</strong>A 1Gbit/sec.<br />

• Processore Intel Pentium M 1.5GHz;<br />

• Sistema Operativo Linux (distribuzione Gentoo);<br />

• Kernel 2.6.11-r11;<br />

• 512MB di RAM;<br />

• 40GB di HD<br />

• NIC Bradcomm 1Gbit/sec.<br />

130


6. Testing e analisi dei risultati<br />

Le due macchine sono state collegate tra loro tramite un cavo incrociato, utilizzando<br />

le schede di rete con velocità di connessione pari ad 1Gbit/sec, in modo da creare un<br />

collegamento veloce ed a bassa latenza. Inoltre, il PC1 è stato collegato ad Internet per<br />

mezzo di una connessione asimmetrica di tipo ADSL da 2Mbit/sec in download e da<br />

512Kbit/sec in upload.<br />

Al fine di rendere la fase di testing significativa, è stata riposta particolare attenzione<br />

nel rendere l’ambiente di esecuzione quanto più possibile riproducibile e<br />

contemporaneamente vicino ad un reale caso di utilizzo. Proprio in tale ottica, è stata pensata<br />

l’implementazione di un testing di tipo trace driven e l’utilizzo del log_player e del netem,<br />

che verrano descritti nelle sezioni successive.<br />

Come mostrato in Fig.6-1, l’architettura utilizzata per i test prevede il collegamento<br />

delle due macchine tra loro tramite cavo incrociato (in una rete di indirizzi privati di classe C,<br />

192.168.0.1/24), mentre il collegamento del PC1 ad Internet avviene passando attraverso un<br />

HAG (Home Access Gateway) tramite un cavo di rete su connessione Ethernet a 10Mbit.<br />

L’HAG, a sua volta, è collegato ad Internet tramite una connessione a 2 Mbit/sec, come<br />

precedentemente accennato. In tale configurazione, il PC2 è stato utilizzato per generare il<br />

traffico attraverso l’ausilio dei web log e del programma log_player, mentre sul PC1 sono<br />

stati installati e opportunamente settati una istanza di Squid e di SPD, al fine, rispettivamente,<br />

di soddisfare le richieste e di attuare il meccanismo di prefetching.<br />

Fig. 6-1 - Architettura di testing<br />

131


6.1.1 IRCache e Web log<br />

6. Testing e analisi dei risultati<br />

Uno dei problemi riscontrati nella fase di testing è stato quello di decidere come<br />

rendere il test il più possibile riproducibile e contemporaneamente vicino alla realtà. Per<br />

questo motivo si è pensato di realizzare un testing di tipo trace driven, utilizzando dei Web<br />

log di proxy operanti. Vista la difficoltà di reperire dei web log significativi e soprattutto<br />

attuali (in rete si trovano numerosi web log, datati però dal 1996 al 1998 circa), si è deciso di<br />

fare ricorso al progetto IRCache [Irc05]. Questo progetto, iniziato nel 1995 dal NLANR<br />

(National Laboratory for Applied Network Research) e dalla UCSD (University of<br />

California, San Diego) e dalla NSF (National Science Foundation), raccoglie i log di circa<br />

dieci proxy localizzati negli Stati Uniti, con lo scopo di favorire lo sviluppo di Squid e<br />

fornire dati per ricercatori universitari e altre organizzazioni. Questi log vengono raccolti e<br />

catalogati giorno per giorno, con un ritardo massimo di 24 ore, per ognuno dei dieci proxy,<br />

per una durata massima di una settimana. Ogni settimana, quindi, l’insieme dei log viene<br />

sostituito con quello della settimana successiva. In questo modo, tramite un account presso<br />

la IRCache, è stato possibile prelevare dei log attuali (dall’1 al 4 Giugno 2005) di circa<br />

quattro giorni di utilizzo di un proxy situato a Boulder, California. Questi log contenevano<br />

un totale di oltre 600 mila richieste, con una media di circa 170 mila richieste giornaliere.<br />

Purtroppo il progetto IRCache non specifica la tipologia di proxy (regionale, locale o<br />

dipartimentale) a cui appartenevano tali log e, come verrà meglio evidenziato in seguito, tale<br />

elemento ha influenzato i risultati dei test, in quanto la conoscenza della posizione del proxy<br />

costituisce un fattore importante per meglio analizzarne le prestazioni.<br />

6.1.2 Log_stripper, log_player e log_cleaner<br />

Durante tutta la fase di testing sono stati utilizzati una serie di tool appositamente<br />

creati, tramite il linguaggio di alto livello Python, necessari ad eseguire alcune funzioni<br />

importanti per il testing stesso: log_player, log_stripper e log_cleaner.<br />

Il primo, log_player.py, si è reso necessario vista l’assenza di un vero e proprio<br />

“player” di web log adatto allo scopo. Questo programma si occupa di effettuare il parsing<br />

dei log che gli vengono forniti, raccogliendo, per ogni richiesta, il metodo HTTP, la URL e il<br />

tempo di interarrivo rispetto alla richiesta precedente. Dal parsing del log, esso crea una lista<br />

132


6. Testing e analisi dei risultati<br />

che utilizza per effettuare le stesse identiche chiamate fatte dagli utenti, rispettandone i tempi<br />

di interarrivo. Data l’eventualità di più richieste concorrenti o comunque in rapidissima<br />

sequenza, log_player è stato implementato con un processo principale che si occupa del<br />

parsing dei log e della creazione della lista delle richieste effettuate. Quindi, le richieste vere<br />

e proprie vengono generate da processi multithreading, in modo da consentire eventualmente<br />

la presenza di più chiamate concorrenti. Ogni thread riceve dal processo principale il metodo<br />

HTTP e la URL da richiedere e si occupa quindi di creare la connessione con il proxy al fine<br />

di completare tale compito. Rimane poi in attesa della risposta prima di chiudere la<br />

connessione e morire, in modo da simulare il corretto comportamento di un normale utente.<br />

Così facendo, infatti, impedisce che Squid, a causa della chiusura prematura della<br />

connessione (come sarebbe successo nel caso di richiesta e successiva morte del thread senza<br />

attesa di risposta), arresti il processo di prelevamento del file dall’origin server, non<br />

consentendone una successiva memorizzazione in cache. Non è stato posto un limite al<br />

numero dei thread utilizzabili dal processo principale, dal momento che la risoluzione di una<br />

rrichiesta HTTP avviene notoriamente in un tempo molto breve, tale da non provocare un<br />

pericolo di saturazione delle risorse disponibili. Analogamente, non sono state utilizzate<br />

connessioni persistenti, poiché l’utilizzo previsto per log_player era ristretto al campo del<br />

testing in oggetto, dove era previsto l’impiego di una connessione diretta e molto veloce<br />

(Gigabit Ethernet) tra la macchina su cui era in esecuzione tale tool e quella su cui era in<br />

esecuzione il proxy.<br />

Il secondo tool, log_stripper.py, è stato creato per risolvere il problema del notevole<br />

overhead computazionale derivante dalla fase di analisi dei log da parte del programma<br />

log_player, viste le grandi dimensioni dei log stessi (circa 25MB per ogni file di log). Il<br />

compito di log_stripper è quello di raccogliere i log da analizzare e di effettuarne un parsing<br />

al fine di creare un unico file di log, scritto in formato CSV e opportunamente “ripulito” da<br />

tutte le informazioni non necessarie. Il file così creato (valori.txt) contiene, per ogni riga, il<br />

metodo del protocollo HTTP utilizzato, la URL richiesta e il tempo trascorso rispetto alla<br />

richiesta precedente. In tal modo, questo file risulta di più facile gestione per il player dei<br />

log, passando da una dimensione di 90MB ad una di circa 8MB.<br />

Il terzo e ultimo tool, log_stripper.py, è stato implementato con lo scopo di ripulire i<br />

log, generati a seguito del testing, dalle chiamate prodotte dal demone SPD. Il problema era<br />

133


6. Testing e analisi dei risultati<br />

riscontrabile nell’utilizzo del tool di analisi dei log Calamaris e portava ad avere dei risultati<br />

non corretti. Infatti, all’interno dei log creati dall’istanza di Squid utilizzata per il testing,<br />

venivano a trovarsi anche le richieste effettuate dal demone SPD durante la fase di<br />

prefetching. E tra queste richieste era possibile anche avere delle hit in cache. Di<br />

conseguenza, i risultati dell’analisi statistica condotta con Calamaris, in particolare la<br />

percentuale di hit riscontrata nel proxy, sarebbe stata alterata dalla presenza di hit prodotte<br />

dal demone SPD e non dagli utenti simulati. Per eliminare tale problema, log_stripper è stato<br />

utilizzato per “ripulire” i file di log prodotti nel testing da tutte le chiamate prodotte dal<br />

demone SPD.<br />

6.1.3 Netem<br />

Il solo utilizzo di un Web log e dei tool appena descritti, tuttavia, non era sufficiente<br />

a rendere il testing quanto più possibile vicino alla realtà di una connessione satellitare. Per<br />

tale motivo è stato utilizzato l’emulatore di rete Netem (Network Emulator) [Net05].<br />

Netem è una disciplina di accodamento che funziona sotto sistema operativo Linux<br />

ed è basata su NISTnet [Nis05], un emulatore di rete scritto dal NIST (National Institute of<br />

Science and Technology). NISTnet, così come Netem, consente di emulare il<br />

comportamento di una rete WAN, utilizzando una macchina con sistema operativo Linux<br />

come router, sul quale far transitare il traffico che si vuole “manipolare”. Le differenze<br />

sostanziali tra i due sono da ricercare nel fatto che, mentre NISTnet è un tool completo, che<br />

fornisce quindi numerose funzionalità e gira solo su kernel della serie 2.4 (lo sviluppo di<br />

NISTnet è stato infatti sospeso), Netem, invece, è un tool che fornisce solo una serie di<br />

funzionalità mirate e può girare indifferentemente sia su kernel della serie 2.4 sia su quelli<br />

della serie 2.6.<br />

Le funzionalità messe a disposizione da Netem sono, relativamente alla gestione del<br />

traffico, le seguenti:<br />

• ritardo costante;<br />

• ritardo variabile;<br />

• scelta della distribuzione dei tempi di ritardo;<br />

• perdita di pacchetti;<br />

134


• duplicazione dei pacchetti;<br />

• riordinamento dei pacchetti.<br />

6. Testing e analisi dei risultati<br />

Per utilizzare Netem è stato necessario ricompilare il kernel della macchina PC1<br />

(Kernel 2.6.10) e installare il pacchetto iproute2 [Ipr05], contenente una serie di tool per<br />

gestire in maniera avanzata il routing del traffico di rete sotto Linux. Quindi, prima di far<br />

partire ogni test, è stato impostato un ritardo costante sulla interfaccia di rete del PC1<br />

collegata ad Internet pari a 500msec, allo scopo di simulare il ritardo normalmente<br />

riscontrabile in un canale satellitare. In Fig.6-2 è riportato il comando utilizzato per<br />

impostare tale ritardo.<br />

# tc qdisc add dev eth0 root netem delay 500ms<br />

Fig. 6-2 - Comando per impostare un ritardo fisso di 500msec con Netem<br />

6.2 Test e risultati<br />

Al fine di valutare l’architettura implementata, sono state condotte due serie di test,<br />

dipendenti dalle dimensioni scelte per la cache di Squid, rispettivamente posta pari a 4GB e<br />

300MB. Quindi, per ognuna delle due serie, i test sono stati condotti in una doppia modalità,<br />

che prevedeva o meno l’utilizzo del demone SPD. In questo modo, la durata complessiva dei<br />

test è stata pari a 16 giorni.<br />

Di seguito vengono riportati i risultati ottenuti dall’analisi dei log, prodotti durante i<br />

test, condotta tramite il tool Calamaris, divisi in due serie in base alla dimensione della cache,<br />

4GB o 300MB.<br />

6.2.1 Dimensione della cache pari a 4GB<br />

I risutati sono ordinati in modo da presentare prima i valori ottenuti dal solo utilizzo<br />

di Squid (Fig.6-3 e Tab.6-1) e poi quelli ottenuti dall’utilizzo di Squid e del demone SPD<br />

insieme (Fig.6-4 e Tab.6-2).<br />

135


6.2.1.1 Risultati solo Squid<br />

6. Testing e analisi dei risultati<br />

Fig. 6-3 - Valori di HIT, MISS ed ERROR per cache a 4GB senza SPD<br />

status request % sec/req Byte % kB/sec<br />

HIT 159259 23.62 0.12 665199K 50.26 34.15<br />

TCP_HIT 79312 11.76 0.00 535306K 40.45 2378.46<br />

TCP_MEM_HIT 61482 9.12 0.00 97420480 7.19 13055.56<br />

TCP_REFRESH_HIT 12536 1.86 1.54 31297342 2.31 1.59<br />

TCP_NEGATIVE_HIT 5929 0.88 0.00 4292538 0.32 6718.92<br />

MISS 503858 74.73 1.83 641534K 48.48 0.70<br />

TCP_MISS 501442 74.37 1.83 638064K 48.21 0.70<br />

TCP_REFRESH_MISS 2416 0.36 1.83 3553340 0.26 0.79<br />

ERROR 11151 1.65 62.75 17051078 1.26 0.02<br />

TCP_DENIED 6195 0.92 0.00 9838880 0.73 12664.14<br />

TCP_MISS 4956 0.74 141.18 7212198 0.53 0.01<br />

Sum 674268 100.00 2.43 1323384K 100.00 0.81<br />

Tab. 6-1 - Valori di HIT, MISS ed ERROR per cache a 4GB senza SPD<br />

136


6.2.1.2 Risultati Squid e SPD<br />

6. Testing e analisi dei risultati<br />

Fig. 6-4 - Valori di HIT, MISS ed ERROR per cache a 4GB con SPD<br />

status request % sec/req Byte % kB/sec<br />

HIT 159379 23.64 0.15 686106K 50.31 28.23<br />

TCP_HIT 79045 11.72 0.00 543933K 39.88 1508.60<br />

TCP_MEM_HIT 62467 9.26 0.00 100864K 7.40 1062.66<br />

TCP_REFRESH_HIT 11811 1.75 2.02 37300136 2.67 1.53<br />

TCP_NEGATIVE_HIT 6056 0.90 0.00 5000512 0.36 457.83<br />

MISS 501811 74.42 1.70 658292K 48.27 0.77<br />

TCP_MISS 499515 74.08 1.70 654922K 48.02 0.77<br />

TCP_REFRESH_MISS 2296 0.34 1.75 3451207 0.25 0.84<br />

ERROR 13078 1.94 74.91 19871571 1.42 0.02<br />

TCP_MISS 6883 1.02 142.33 10032689 0.72 0.01<br />

TCP_DENIED 6195 0.92 0.00 9838882 0.70 852.01<br />

Sum 674268 100.00 2.76 1363804K 100.00 0.73<br />

Tab. 6-2 - Valori di HIT, MISS ed ERROR per cache a 4GB con SPD<br />

137


6.2.2 Dimensione della cache pari a 300MB<br />

6. Testing e analisi dei risultati<br />

Anche in questo caso i risutati sono ordinati in modo da presentare prima i valori<br />

ottenuti dal solo utilizzo di Squid (Fig.6-5 e Tab.6-3) e poi quelli ottenuti dall’utilizzo di<br />

Squid e del demone SPD insieme (Fig.6-6 e Tab.6-4).<br />

6.2.2.1 Risultati solo Squid<br />

Fig. 6-5 - Valori di HIT, MISS ed ERROR per cache a 300MB senza SPD<br />

status request % sec/req Byte % kB/sec<br />

HIT 144645 21.45 0.09 625245K 48.10 47.84<br />

TCP_MEM_HIT 72725 10.79 0.00 115988K 8.92 14324.11<br />

TCP_HIT 56953 8.45 0.00 481621K 37.05 5783.40<br />

TCP_REFRESH_HIT 8782 1.30 1.48 22680986 1.70 1.71<br />

TCP_NEGATIVE_HIT 6185 0.92 0.00 5618210 0.42 8357.25<br />

MISS 516920 76.66 1.69 655852K 50.45 0.75<br />

TCP_MISS 515205 76.41 1.69 653333K 50.26 0.75<br />

TCP_REFRESH_MISS 1715 0.25 1.65 2578676 0.19 0.89<br />

ERROR 12703 1.88 71.52 19334250 1.45 0.02<br />

TCP_MISS 6508 0.97 139.61 9495370 0.71 0.01<br />

TCP_DENIED 6195 0.92 0.00 9838880 0.74 13912.95<br />

Sum 674268 100.00 2.66 1299978K 100.00 0.72<br />

Tab. 6-3 - Valori di HIT, MISS ed ERROR per cache a 300MB senza SPD<br />

138


6.2.2.2 Risultati Squid e SPD<br />

6. Testing e analisi dei risultati<br />

Fig. 6-6 - Valori di HIT, MISS ed ERROR per cache a 300MB con SPD<br />

status request % sec/req Byte % kB/sec<br />

HIT 148146 21.97 0.10 680767K 49.67 44.38<br />

TCP_MEM_HIT 71684 10.63 0.00 121682K 8.88 1157.08<br />

TCP_HIT 61256 9.08 0.00 524123K 38.24 3128.05<br />

TCP_REFRESH_HIT 8714 1.29 1.73 28377703 2.02 1.84<br />

TCP_NEGATIVE_HIT 6492 0.96 0.00 7423419 0.53 683.62<br />

MISS 512658 76.03 1.85 669959K 48.88 0.71<br />

TCP_MISS 510926 75.77 1.85 667338K 48.69 0.71<br />

TCP_REFRESH_MISS 1732 0.26 1.85 2683845 0.19 0.82<br />

ERROR 13464 2.00 74.04 20408795 1.45 0.02<br />

TCP_MISS 7269 1.08 137.14 10569913 0.75 0.01<br />

TCP_DENIED 6195 0.92 0.00 9838882 0.70 946.20<br />

Sum 674268 100.00 2.91 1370656K 100.00 0.70<br />

Tab. 6-4 - Valori di HIT, MISS ed ERROR per cache a 300MB con SPD<br />

139


6.3 Analisi dei risultati<br />

6. Testing e analisi dei risultati<br />

Prima di analizzare i risultati raccolti durante la fase di testing è doveroso fare una<br />

premessa: il contesto del Web caching ha ormai raggiunto un buon grado di maturità, lo<br />

testimoniano i numerosi studi condotti sull’argomento nonché realtà quali quella di Squid,<br />

ormai sul mercato da più di 10 anni. A tal proposito, visto il già buon grado di maturità e<br />

ottimizzazione che prodotti come Squid hanno raggiunto, i margini di guadagno che si<br />

possono ottenere in tale campo sono davvero ristretti. Inoltre, la percentuale di risorse non<br />

memorizzabili in cache (sia perché generate dinamicamente e non rispondenti ai principi di<br />

località, sia per esplicita indicazione del gestore del sito) è in continuo aumento. Per dare una<br />

idea delle dimensioni di quanto appena accennato, i valori di hit rate ottenibili da una cache<br />

gestita da IRCache sono compresi in un range che oscilla tra il 18% e il 26%. Spesso,<br />

riuscire a guadagnare anche un solo punto percentuale in tale range non è affatto banale.<br />

Fatta questa debita premessa, si può passare all’analisi dei risultati ottenuti.<br />

I valori presi in considerazione ai fini dell’analisi sono i valori di hit rate e byte/hit<br />

rate, due indici tra i più importanti nella valutazione delle prestazioni di un sistema di<br />

caching. Come precedentemente indicato, i dati raccolti riguardano due differenti<br />

configurazioni di Squid, la prima con una dimensione della cache pari a 4GB, la seconda<br />

pari invece a 300MB. Inoltre, per ognuna delle due configurazioni, i test sono stati condotti<br />

sia con l’ausilio del demone SPD sia senza.<br />

Analizzando quindi i valori relativi all’hit rate si può notare dal grafico riportato in<br />

Fig.6-7 come, per una dimensione della cache pari a 4GB, il valore delle hit passi da un<br />

23.62% senza l’ausilio del demone ad un 23.64% dopo l’utilizzo dello stesso, con un<br />

aumento dello 0.08%, mentre, nel caso di dimensione della cache pari a 300MB, tale valore<br />

passi da un 21.45% senza demone ad un 21.97% con demone, con un aumento quindi del<br />

2.36%. Tali valori sono comprensibili se si considera la dimensione della cache e la<br />

dimensione del working set, ovvero l’insieme di dati memorizzati in cache “responsabile”<br />

dei valori di hit ottenuti. Evidentemente, nel caso di cache con dimensione pari a 4GB, il<br />

valore del working set è estremamente inferiore rispetto alla dimensione della cache stessa.<br />

Se a questa considerazione aggiungiamo il fatto che, dal monitoraggio effettuato durante i<br />

test, la dimensione massima dello spazio cache occupato raggiunto da Squid era pari a<br />

1.4GB, si può comprendere meglio la situazione: la dimensione della cache era così grande e<br />

140


6. Testing e analisi dei risultati<br />

la durata del test (4 giorni) non sufficiente a consentire uno svuotamento della stessa. Di<br />

conseguenza, utilizzando il demone e quindi un meccanismo di prefetching, la maggior parte<br />

degli oggetti richiesti in prefetching dal demone era comunque già presente in cache. Quindi,<br />

il prefetching stesso è risultato quasi del tutto ininfluente, poiché ha contribuito ad<br />

aumentare la dimensione del working set in maniera minimale. Ulteriore testimonianza è<br />

costituita dall’aumento del numero di hit ottenuto a seguito dell’uso di SPD, solamente 120<br />

hit su un totale di oltre 600 mila richieste.<br />

Diminuendo le dimensioni della cache e passando quindi al caso di dimensione<br />

cache pari a 300MB, il working set è stato parzialmente ridotto a seguito del minor spazio a<br />

disposizione: infatti il valore delle hit è sceso, nel caso di non utilizzo di SPD, da un 23.62%<br />

per dimensione cache pari a 4GB, ad un 21.45% per cache pari a 300MB. La riduzione<br />

riscontrata nel working set a seguito del cambiamento della dimensione della cache ha<br />

quindi portato ad un maggior beneficio riscontrabile tramite l’uso del demone SPD: in<br />

questo caso infatti, l’utilizzo del prefetching ha permesso di riportare in cache parte degli<br />

elementi del working set che ne erano stati rimossi a seguito del minor spazio di caching a<br />

disposizione. In questo caso l’aumento del numero di hit avuto a seguito dell’utilizzo di SPD<br />

è stato circa pari a 4300 hit.<br />

Fig. 6-7 - Hit rate al variare della dimensione della cache e della presenza di SPD<br />

141


6. Testing e analisi dei risultati<br />

Un discorso analogo è possibile se si considera il grafico dei valori di byte/hit rate in<br />

Fig.6-8, ottenuto dall’analisi dei dati raccolti durante la fase di testing. In questo caso si ha,<br />

considerando una dimensione della cache pari a 4GB, che il valore del byte/hit Rate passa da<br />

un 50.26% nel caso di non utilizzo di SPD ad un 50.34% nel caso di utilizzo dello stesso,<br />

con un aumento dello 0.16%, mentre, nel caso di dimensione della cache pari a 300MB, tale<br />

valore passa dal 48.10% senza SPD ad un 49.67% con SPD, con un aumento del 3.16%. Per<br />

i valori di byte/hit rate occorre tuttavia evidenziare come la differenza nel caso di utilizzo o<br />

meno del demone, per una cache pari a 300MB, sia più accentuata rispetto a quella avuta per<br />

i valori di hit rate nella medesima condizione. Tale differenza è da ricondurre all’algoritmo<br />

utilizzato nelle politiche di rimpiazzamento di Squid (LRU), che ha portato all’eliminazione<br />

dei file più grandi in dimensione ed usati meno di recente. Conseguentemente, il<br />

meccanismo di prefetching ha riportato tali file in cache, contribuendo così ad aumentare di<br />

oltre tre punti percentuale il valore di byte/hit rate, che dipende proprio dalla dimensione del<br />

file trasferito per ogni hit. Aumento che invece non è stato così accentuato per l’hit rate,<br />

poiché quest’ultimo non dipende dalle dimensioni dei file trasferiti per ogni hit.<br />

Fig. 6-8 - Byte/hit rate al variare della dimensione della cache e della presenza di SPD<br />

142


6. Testing e analisi dei risultati<br />

Dai risultati ottenuti e dall’analisi finora condotta su tali risultati emerge chiaro come<br />

il guadagno ottenibile da una meccanismo di prefetching dipenda fortemente dalle<br />

dimensioni della cache e del working set del carico utilizzato per i test: minore è la<br />

differenza tra questi due elementi e maggiore sarà il beneficio apportato dal prefetching<br />

stesso. Proprio a tal proposito è necessario ricordare quanto precedentemente accennato: è<br />

importante conoscere la provenienza del carico utilizzato per i test e, preferibilmente,<br />

utilizzare un carico quanto più vicino possibile a quello di reale impiego per l’architettura in<br />

esame. Purtroppo, i web log prelevati da IRCache non erano identificabili in tal senso (cache<br />

di livello regionale, locale, dipartimentale, etc), di conseguenza, molto probabilmente, la<br />

natura di tali log (forse regionale) era tale da necessitare un periodo di testing di differente<br />

durata, vista l’alta variabilità e disomogeneità del traffico.<br />

Ciò nonostante, seppur contenuto, il guadagno apportato dal demone è comunque<br />

visibile. In particolare, esso contribuisce a diminuire il gap che si viene a creare, al crescere<br />

dello spazio cache a disposizione, sia per quanto riguarda l’hit rate, sia per quanto riguarda il<br />

byte/hit rate, tra le configurazioni con cache di maggiore dimensione rispetto a quelle con<br />

cache di minore dimensione, gap che risulta più marcato nel caso invece di non utilizzo di<br />

SPD.<br />

Infine, dai test condotti si è evidenziato come la presenza di una architettura di proxy<br />

caching applicata al caso di una connessione satellitare costituisca un vantaggio in termini di<br />

riduzione della latenza percepita durante la navigazione. In Fig.6-9 è rappresentata la<br />

distribuzione dei tempi di risposta nel caso di utilizzo di una connessione LAN. In questo<br />

caso, si può notare come la presenza di una connessione veloce diminuisca i benefici<br />

apportati da un proxy. La maggioranza delle richieste (circa il 60%), infatti, viene<br />

normalmente risolta in un tempo inferiore o uguale a 500ms, grazie proprio alla velocità e<br />

alla bassa latenza della connessione. Un tale risultato non può invece ottenersi nel caso di<br />

connessione satellitare poiché, essendo la latenza minima pari proprio a 500msec, tali<br />

richieste verrebbero sicuramente risolte in un tempo superiore.<br />

143


6. Testing e analisi dei risultati<br />

Fig. 6-9 - Distribuzione dei tempi di risposta nel caso di connessione LAN<br />

Come si può infatti notare da Fig.6-10, dove è rappresentata la distribuzione nel<br />

tempo del traffico nel caso di una connessione satellitare simulata (500msec di ritardo<br />

costanti), in questo caso le richieste soddisfatte in un tempo pari o inferiore ai 500msec sono<br />

solo quelle restituite dalla cache, poiché la latenza del canale porterebbe, senza l’ausilio del<br />

proxy, ad una risoluzione in un tempo sicuramente più alto.<br />

144


6. Testing e analisi dei risultati<br />

Fig. 6-10 - Distribuzione dei tempi di risposta nel caso di connessione satellitare<br />

145


Conclusioni<br />

Conclusioni<br />

Il lavoro di tesi presentato è la risposta a due problematiche chiave per il committente<br />

Telespazio: la latenza del canale satellitare e la necessità di un meccanismo di mirroring dei<br />

contenuti web.<br />

Lo sviluppo del lavoro è stato condotto innanzi tutto attraverso una prima fase di<br />

technology assesment, nella quale sono stati studiati gli elementi che costituiscono i<br />

“mattoni” di un buon sistema di caching: le politiche di rimpiazzamento dei contenuti in<br />

cache. A seguito di questo studio, ne sono stati condotti altri miranti ad analizzare le<br />

soluzioni presenti sul mercato, cercando per ognuna di esse di ricavare pregi e difetti. Questi<br />

studi sono stati le basi di partenza per la fase successiva: la progettazione dell’architettura.<br />

Dalle analisi effettuate sulle politiche di rimpiazzamento e sugli elementi comuni nelle varie<br />

architetture attualmente presenti sul mercato, passando per i test condotti sulle soluzioni<br />

tecnologiche disponibili per la realizzazione del sistema, si è arrivati alla formulazione di<br />

una architettura finale. Tale architettura è stata in realtà sdoppiata, al fine di poter rispondere<br />

al meglio alle differenti esigenze che si possono presentare a seconda della natura del<br />

traffico caratterizzante il carico del sistema. E’ stata così presentata una versione base, che<br />

prevede la presenza di un doppio livello di caching (un primo livello a monte del satellite, un<br />

secondo livello a valle dello stesso), con due istanze di Squid per ogni livello. In questo<br />

modo si è mirato ad ottimizzare il rendimento del sistema sulla base delle differenti politiche<br />

di rimpiazzamento utilizzabili per ognuna delle due istanze di Squid, una prima per contenuti<br />

di tipo multimediale (di grandi dimensioni) e una seconda per “normali” contenuti Web (di<br />

dimensioni ridotte). Alternativamente alla versione base dell’architettura, è stata quindi<br />

presentata una seconda versione, che, analogamente alla prima, vede la presenza di un<br />

doppio livello di caching e di due istanze di Squid per ognuno dei due livelli, ma che allo<br />

stesso tempo di differenzia per la destinazione d’uso delle due istanze del proxy server. Sulla<br />

base del presupposto di un basso traffico multimediale e della necessità di un meccanismo di<br />

mirroring dei contenuti, essa mira ad uno sfruttamento massimo di quest’ultimo, dedicando<br />

completamente una delle due istanze di Squid, per ognuno dei due livelli di caching, al<br />

mirroring dei siti Web. Queste due architetture condividono infine l’utilizzo di tecniche di<br />

146


Conclusioni<br />

prefetching e di mirroring dei contenuti, al fine di mascherare il più possibile la latenza insita<br />

nella natura del canale satellitare. Proprio la necessità di utilizzare le tecniche sopra<br />

accennate ha portato ad una successiva fase di implementazione del sistema e in particolare<br />

di due moduli di supporto, SPD e MMI. Questi due moduli, quindi, consentono di sfruttare,<br />

rispettivamente, un meccanismo di prefetching e di mirroring dei contenuti, operando il<br />

primo in maniera del tutto automatica, attraverso l’analisi dei log della giornata precedente,<br />

il secondo tramite intervento manuale, atto a selezionare il sito sul quale effettuare il<br />

mirroring, specificandone un livello di profondità e una frequenza di refresh dei contenuti. Il<br />

risultato di tale lavoro è il sistema di proxy caching satellitare SatSquid. Esso è il frutto di<br />

una attenta considerazione sia delle problematiche che si dovevano affrontare, sia delle<br />

ipotesi di progetto fatte in fase iniziale: il basso costo delle capacità di storage (e quindi la<br />

possibilità di creare cache di grandi dimensioni a fronte di una ridotta spesa economica) e la<br />

disponibilità di una banda satellitare pressoché infinita (data anche l’eventualità di creare un<br />

satellite espressamente dedicato allo scopo). Come già evidenziato, tuttavia, si è potuto trarre<br />

vantaggio solamente dalla seconda delle due ipotesi, dal momento che la disponibilità di uno<br />

spazio disco illimitato è risultata essere una possibile fonte di problemi, dovuti alla necessità<br />

di un oneroso dimensionamento hardware della struttura. Le scelte effettuate, così come<br />

precedentemente mostrato, hanno portato all’adozione di alcune implicite limitazioni (l’uso<br />

non ottimale della banda disponibile, visto il mancato utilizzo del pushing coadiuvato dal<br />

multicast), in parte compensate dalle ipotesi di progetto (banda satellitare pressoché infinita).<br />

Nell’ultima fase del lavoro, infine, sono stati condotti una serie di test sperimentali su un<br />

prototipo del sistema, con l’intenzione di riprodurre, quanto più possibile, un reale caso di<br />

utilizzo. A tal proposito, è stata realizzata una simulazione trace-driven, basata su Web log<br />

attuali (giugno 2005).<br />

I risultati di tali sperimentazioni sono stati quindi raccolti e, proprio dalla loro analisi,<br />

è stato possibile trarre alcune conclusioni, la più significativa delle quali riguarda il<br />

guadagno apportato dai moduli di supporto SPD e MMI. Come è stato evidenziato<br />

nell’analisi condotta sui risultati sperimentali, tale margine di guadagno, nel caso specifico<br />

relativamente al meccanismo di prefetching, risulta limitato e strettamente legato sia alla<br />

natura del traffico utilizzato per le simulazioni (trace log di proxy regionali, locali,<br />

dipartimentali, etc), sia alle dimensioni della cache rispetto al working set creato dal suddetto<br />

147


Conclusioni<br />

traffico. In tal senso, uno dei possibili sviluppi futuri è proprio quello relativo al testing<br />

dell’architettura, da compiersi, appunto, su un traffico quanto più vicino possibile a quello su<br />

cui poi tale architettura verrà effettivamente utilizzata, andando a bilanciare la durata del test<br />

medesimo in base alla natura del traffico stesso. Altri possibili sviluppi potrebbero essere<br />

indirizzati verso un affinamento dell’algoritmo di prefetching, andando ad analizzare di volta<br />

in volta l’eventuale convenienza di richiedere un elemento in prefetching: se il tempo<br />

necessario al prelevamento di tale elemento risultasse di molto superiore rispetto al RTT<br />

della connessione satellitare, non ci sarebbe grosso beneficio a richiederlo in prefetching. In<br />

tal modo, si potrebbe risparmiare sia sull’overhead dovuto alle operazioni di prefetching, sia<br />

sull’utilizzo della banda disponibile.<br />

Nonostante i ridotti margini di guadagno riscontrabili nel campo del caching, rimane<br />

comunque valido quanto sottolineato in fase di analisi dei dati sperimentali: la presenza di un<br />

sistema di proxy caching, nel caso di una connessione satellitare, costituisce un sicuro<br />

vantaggio in termine di riduzione della latenza percepita, in quanto tutto il traffico che<br />

consente di risparmiare verrebbe altrimenti ritardato di almeno 500msec.<br />

148


Appendice A<br />

Appendice A<br />

In questa appendice sono riportati i file di configurazione squid.conf delle macchine<br />

utilizzate per effettuare i test all’interno della struttura Elis. Le macchine, in configurazione<br />

doppia istanza di Squid, funzionavano una da front-end (Calamaro) e l’atra da back-end<br />

(Andromeda).<br />

Squid.conf (Calamaro)<br />

#########################################<br />

# BIN<strong>DI</strong>NG #<br />

#########################################<br />

http_port 8080<br />

icp_port 3130<br />

#########################################<br />

# CACHE_PEER #<br />

#########################################<br />

cache_peer 10.50.5.80 parent 3128 3130 proxy-only<br />

hierarchy_stoplist cgi-bin ?<br />

acl QUERY urlpath_regex cgi-bin \?<br />

no_cache deny QUERY<br />

#########################################<br />

# CACHE_MEMORY_MANAGEMENT #<br />

#########################################<br />

cache_mem 50 MB<br />

cache_swap_low 90<br />

cache_swap_high 95<br />

maximum_object_size 4096 KB<br />

minimum_object_size 0 KB<br />

149


maximum_object_size_in_memory 100 KB<br />

cache_replacement_policy heap GDSF<br />

memory_replacement_policy lru<br />

cache_dir aufs /usr/local/squid/var/cache 1000 16 256<br />

#########################################<br />

# LOGS_MANAGEMENT #<br />

#########################################<br />

cache_access_log /usr/local/squid/var/logs/access.log<br />

cache_log /usr/local/squid/var/logs/cache.log<br />

cache_store_log /usr/local/squid/var/logs/store.log<br />

log_ip_on_direct on<br />

logfile_rotate 10<br />

# debug_options ALL,1<br />

#########################################<br />

# OPTIONS FOR TUNING THE CACHE #<br />

#########################################<br />

refresh_pattern ^ftp: 1440 20% 10080<br />

refresh_pattern ^gopher: 1440 0% 1440<br />

# Modifica dovuta al BUG!!!!<br />

#refresh_pattern . 35791393 20% 35791393<br />

refresh_pattern . 0 20% 4320<br />

#########################################<br />

# ACL #<br />

#########################################<br />

acl all src 0.0.0.0/0.0.0.0<br />

acl manager proto cache_object<br />

acl localhost src 127.0.0.1/255.255.255.255<br />

acl to_localhost dst 127.0.0.0/8<br />

acl SSL_ports port 443 563<br />

Appendice A<br />

150


acl Safe_ports port 80 # http<br />

acl Safe_ports port 21 # ftp<br />

acl Safe_ports port 443 563 # https, snews<br />

acl Safe_ports port 70 # gopher<br />

acl Safe_ports port 210 # wais<br />

acl Safe_ports port 1025-65535 # unregistered ports<br />

acl Safe_ports port 280 # http-mgmt<br />

acl Safe_ports port 488 # gss-http<br />

acl Safe_ports port 591 # filemaker<br />

acl Safe_ports port 777 # multiling http<br />

acl Safe_ports port 631 # cups<br />

acl Safe_ports port 873 # rsync<br />

acl Safe_ports port 901 # SWAT<br />

acl SSL_ports port 873 # rsync<br />

acl CONNECT method CONNECT<br />

acl Marcolinux src 10.50.5.166/255.255.255.255<br />

acl HostValidi src 10.50.5.0/255.255.255.0 10.250.1.120/255.255.255.255<br />

#acl uffcisco src 10.250.1.120/255.255.255.255<br />

acl PUSH method PUT<br />

#Attivazione MSN GAIM YAHOO & IRC<br />

acl AIM_port port 5190<br />

acl MSN_port port 1863<br />

acl YAHOO_port port 5050<br />

acl IRC_port port 6666 6667 6668 6669<br />

acl MULO_port port 4661<br />

acl POST method POST<br />

http_access allow POST HostValidi<br />

http_access allow CONNECT AIM_port HostValidi<br />

#http_access allow CONNECT AIM_port uffcisco<br />

http_access allow CONNECT MSN_port HostValidi<br />

http_access allow CONNECT YAHOO_port HostValidi<br />

http_access allow CONNECT IRC_port HostValidi<br />

http_access allow CONNECT MULO_port HostValidi<br />

# Only allow cachemgr access from localhost<br />

http_access allow manager localhost<br />

Appendice A<br />

151


http_access deny manager<br />

# Deny requests to unknown ports<br />

http_access deny !Safe_ports<br />

# Deny CONNECT to other than SSL ports<br />

http_access deny CONNECT !SSL_ports<br />

http_access allow PUSH localhost<br />

http_access deny PUSH Marcolinux<br />

#DA ATTIVARE SU CALAMARO<br />

#http_access allow PUSH Marcolinux<br />

http_access allow HostValidi<br />

http_access allow localhost<br />

#http_access allow uffcisco<br />

# And finally deny all other access to this proxy<br />

http_access deny all<br />

http_reply_access allow all<br />

icp_access allow all<br />

# L7 SWITCHING tramite ACL<br />

Appendice A<br />

acl MM urlpath_regex -i<br />

\.avi$ \.mpg$ \.mpeg$ \.mov$ \.divx$ \.xvid$ \.mkv$ \.wmv$ \.wav$ \.mp3$ \.ogg$ \.<br />

mpc$ \.asf$ \.wma$ \.iso$ \.bin$ \.img$ \.nrg$ \.vob$ \.mdf$<br />

#Su andromeda vanno solo i file MM<br />

never_direct allow MM<br />

cache_peer_access 10.50.5.80 deny !MM<br />

#########################################<br />

# SNMP #<br />

#########################################<br />

acl snmppublic snmp_community public<br />

snmp_access allow Marcolinux<br />

snmp_access allow localhost<br />

snmp_access allow snmppublic localhost<br />

snmp_access allow snmppublic marcolinux<br />

snmp_access deny all<br />

152


#########################################<br />

# ADMINISTRATIVE PARAMETERS #<br />

#########################################<br />

cache_mgr m.crucianelli@elis.org<br />

cache_effective_user squid<br />

cache_effective_group squid<br />

visible_hostname er-calamaro<br />

log_icp_queries on<br />

store_avg_object_size 13 KB<br />

Appendice A<br />

153


Squid.conf (Andromeda)<br />

#########################################<br />

# BIN<strong>DI</strong>NG #<br />

#########################################<br />

http_port 3128<br />

icp_port 3130<br />

#########################################<br />

# CACHE_PEER #<br />

#########################################<br />

hierarchy_stoplist cgi-bin ?<br />

acl QUERY urlpath_regex cgi-bin \?<br />

no_cache deny QUERY<br />

#########################################<br />

# CACHE_MEMORY_MANAGEMENT #<br />

#########################################<br />

cache_mem 100 MB<br />

cache_swap_low 90<br />

cache_swap_high 95<br />

maximum_object_size 2000000 KB<br />

minimum_object_size 512 KB<br />

maximum_object_size_in_memory 2048 KB<br />

cache_replacement_policy heap LFUDA<br />

memory_replacement_policy lru<br />

cache_dir aufs /home/telespazio/cache 10000 16 256<br />

#########################################<br />

# LOGS_MANAGEMENT #<br />

#########################################<br />

Appendice A<br />

154


cache_access_log /home/telespazio/logs/access.log<br />

cache_log /home/telespazio/logs/cache.log<br />

cache_store_log /home/telespazio/logs/store.log<br />

log_ip_on_direct on<br />

logfile_rotate 10<br />

#debug_options ALL,9<br />

#########################################<br />

# OPTIONS FOR TUNING THE CACHE #<br />

#########################################<br />

# Modifica dovuta al BUG!!!!<br />

#refresh_pattern ^ftp 35791393 20% 35791393<br />

refresh_pattern ^ftp: 1440 20% 10080<br />

refresh_pattern ^gopher: 1440 0% 1440<br />

# Modifica dovuta al BUG!!!!<br />

#refresh_pattern . 35791393 20% 35791393<br />

refresh_pattern . 0 20% 4320<br />

#########################################<br />

# ACL #<br />

#########################################<br />

acl all src 0.0.0.0/0.0.0.0<br />

acl manager proto cache_object<br />

acl localhost src 127.0.0.1/255.255.255.255<br />

acl to_localhost dst 127.0.0.0/8<br />

acl SSL_ports port 443 563<br />

acl Safe_ports port 80 # http<br />

acl Safe_ports port 21 # ftp<br />

acl Safe_ports port 443 563 # https, snews<br />

acl Safe_ports port 70 # gopher<br />

acl Safe_ports port 210 # wais<br />

acl Safe_ports port 1025-65535 # unregistered ports<br />

acl Safe_ports port 280 # http-mgmt<br />

acl Safe_ports port 488 # gss-http<br />

Appendice A<br />

155


acl Safe_ports port 591 # filemaker<br />

acl Safe_ports port 777 # multiling http<br />

acl Safe_ports port 631 # cups<br />

acl Safe_ports port 873 # rsync<br />

acl Safe_ports port 901 # SWAT<br />

acl SSL_ports port 873 # rsync<br />

acl CONNECT method CONNECT<br />

acl PUSH method PUT<br />

acl Marcolinux src 10.50.5.166/255.255.255.255<br />

acl HostValidi src 10.50.5.0/255.255.255.0<br />

acl Calamaro src 10.50.5.21/255.255.255.255<br />

# Only allow cachemgr access from localhost<br />

http_access allow manager localhost<br />

http_access deny manager<br />

# Deny requests to unknown ports<br />

http_access deny !Safe_ports<br />

# Deny CONNECT to other than SSL ports<br />

http_access deny CONNECT !SSL_ports<br />

http_access allow PUSH localhost<br />

#http_access deny PUSH Marcolinux<br />

#DA ATTIVARE SU CALAMARO<br />

#http_access allow PUSH Marcolinux<br />

http_access allow HostValidi<br />

#http_access allow localhost<br />

# And finally deny all other access to this proxy<br />

http_access deny all<br />

http_reply_access allow all<br />

icp_access allow all<br />

Appendice A<br />

156


#########################################<br />

# SNMP #<br />

#########################################<br />

acl snmppublic snmp_community public<br />

snmp_access allow Marcolinux<br />

snmp_access allow Calamaro<br />

snmp_access allow localhost<br />

snmp_access allow snmppublic Marcolinux<br />

snmp_access allow snmppublic localhost<br />

snmp_access deny all<br />

#########################################<br />

# ADMINISTRATIVE PARAMETERS #<br />

#########################################<br />

cache_mgr m.crucianelli@elis.org<br />

cache_effective_user squid<br />

cache_effective_group squid<br />

visible_hostname andromeda-calamaro<br />

log_icp_queries on<br />

store_avg_object_size 512 KB<br />

always_direct allow all<br />

Appendice A<br />

157


Appendice B<br />

Appendice B<br />

In questa appendice è riportato un esempio di un file di configurazione utile al<br />

monitoraggio di diversi parametri via SNMP attraverso il tool MRTG. Nell’esempio in<br />

questione sono state impostate anche tutte le opzioni relative alla creazione di grafici con<br />

MRTG stesso, mentre sono lasciate commentate le opzioni necessarie all’integrazione con<br />

RRDTOOL.<br />

Configurazione MRTG<br />

### Global Config Options<br />

#WorkDir: /home/cala/MRTG<br />

Htmldir: /home/cala/MRTG/andro<br />

Imagedir: /home/cala/MRTG/andro/image<br />

Logdir: /home/cala/MRTG/andro/log<br />

EnableIPv6: no<br />

# Disabilito la raccolta dati per anni e mesi<br />

Suppress[_]: ym<br />

#DA ATTIVARE per RRDTOOL<br />

#PathAdd: /usr/bin<br />

#LibAdd: /usr/share/perl/gentoo-pods/5.8.2<br />

#logformat: rrdtool<br />

LoadMIBs:/usr/share/snmp/mibs/IF-MIB.txt,/usr/share/snmp/mibs/UCD-SNMP-<br />

MIB.txt,/usr/share/snmp/mibs/SQUID-MIB.txt<br />

Language: italian<br />

RunAsDaemon: yes<br />

#Interval: 1 #DA ATTIVARE per RRDTOOL<br />

Interval: 5<br />

######################################################################<br />

158


# System: Andromeda<br />

Appendice B<br />

# Description: Linux Andromeda 2.6.9-vidalinux1 #1 Wed Dec 15 17:51:35 EST 2004<br />

i686<br />

# Contact: m.crucianelli@elis.org<br />

# Location: "Net Lab"<br />

######################################################################<br />

######################################################################<br />

#<br />

# Monitoraggio Schede di Rete<br />

#<br />

######################################################################<br />

Title[^]: Analisi del traffico per<br />

PageTop[^]:Analisi del traffico per<br />

PageTop[$]: di Andromeda<br />

### Interface 2 >> Descr: 'eth0' | Name: '' | Ip: '10.50.5.80' | Eth: '00-10-5abe-bd-8a'<br />

###<br />

Target[andro_eth0]: ifInOctets.2&ifOutOctets.2:public@10.50.5.80<br />

SetEnv[andro_eth0]: MRTG_INT_IP="10.50.5.80" MRTG_INT_DESCR="eth0"<br />

MaxBytes[andro_eth0]: 12500000<br />

Title[andro_eth0]: IF 2 -- Andromeda<br />

PageTop[andro_eth0]: Interface 2<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:eth0 <br />

ifType: ethernetCsmacd (6)<br />

ifName: <br />

Max Speed: 12.5 MBytes/s<br />

Ip: 10.50.5.80 (50-5-21.elis.org)<br />

<br />

### Interface 3 >> Descr: 'eth1' | Name: '' | Ip: '192.168.0.195' | Eth: '00-0bcd-20-c7-ac'<br />

###<br />

159


Target[andro_eth1]: ifInOctets.3&ifOutOctets.3:public@10.50.5.80<br />

SetEnv[andro_eth1]: MRTG_INT_IP="192.168.0.195" MRTG_INT_DESCR="eth1"<br />

MaxBytes[andro_eth1]: 12500000<br />

Title[andro_eth1]: IF 3 -- Andromeda<br />

PageTop[andro_eth1]: Interface 3<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:eth1 <br />

ifType: ethernetCsmacd (6)<br />

ifName: <br />

Max Speed: 12.5 MBytes/s<br />

Ip: 192.168.0.195 ()<br />

<br />

######################################################################<br />

#<br />

# Monitoraggio SQUID<br />

#<br />

######################################################################<br />

Title[^]: Analisi<br />

Title[$]: per lo Squid di Andromeda<br />

PageTop[^]: Analisi<br />

PageTop[$]: per lo Squid di Andromeda<br />

Appendice B<br />

### CPU >> Descr: 'CPU' | Name: '' | Ip: '10.50.5.80' | Eth: '00-10-5a-be-bd-8a'<br />

###<br />

Target[andro_cpu]: ssCpuUser.0&ssCpuUser.0:public@10.50.5.80<br />

AbsMax[andro_cpu]: 100<br />

MaxBytes[andro_cpu]: 100<br />

Title[andro_cpu]: della Cpu %<br />

Options[andro_cpu]:gauge,noo<br />

YLegend[andro_cpu]: CPU Utilization<br />

ShortLegend[andro_cpu]: %<br />

LegendI[andro_cpu]:&nbsp;CPU Utilization (percentage)&nbsp<br />

PageTop[andro_cpu]: del CPU Usage %<br />

<br />

System: Andromeda in "Net Lab"<br />

160


Maintainer: m.crucianelli@elis.org<br />

Description:CPU % <br />

Max %: 100%<br />

<br />

Appendice B<br />

###SQUID CPU >> Descr: 'CPU' | Name: '' | Ip: '10.50.5.80' | Eth: '00-10-5a-be-bd-<br />

8a' ###<br />

Target[andro_squid_cpu]: cacheCpuUsage&cacheCpuUsage:public@10.50.5.80:3401<br />

#SetEnv[10.50.5.80_2]: MRTG_INT_IP="10.50.5.80" MRTG_INT_DESCR="eth0"<br />

AbsMax[andro_squid_cpu]: 100<br />

MaxBytes[andro_squid_cpu]: 100<br />

Title[andro_squid_cpu]: Squid CPU % Usage<br />

Options[andro_squid_cpu]: absolute,noo<br />

YLegend[andro_squid_cpu]: Squid CPU Utilization<br />

ShortLegend[andro_squid_cpu]: %<br />

LegendI[andro_squid_cpu]:&nbsp;Squid CPU Utilization (percentage)&nbsp<br />

PageTop[andro_squid_cpu]: del CPU % Usage<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:CPU % <br />

Max %: 100%<br />

<br />

###SQUID Storage Swap size in kb >> Descr: 'CPU' | Name: '' | Ip: '10.50.5.80' |<br />

Eth: '00-10-5a-be-bd-8a' ###<br />

Target[andro_squid_swap]: cacheSysStorage&cacheSysStorage:public@10.50.5.80:3401<br />

MaxBytes[andro_squid_swap]: 1000000<br />

Title[andro_squid_swap]: Swap Space size<br />

Options[andro_squid_swap]: gauge,noo<br />

YLegend[andro_squid_swap]: Squid Swap Space size<br />

ShortLegend[andro_squid_swap]: KB<br />

LegendI[andro_squid_swap]:&nbsp;Squid Swap Space size&nbsp<br />

PageTop[andro_squid_swap]: Swap Space size<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:SwapSize <br />

161


Max %: 100%<br />

<br />

###SQUID Number of object stored in cache >> Descr: 'CPU' | Name: '' | Ip:<br />

'10.50.5.80' | Eth: '00-10-5a-be-bd-8a' ###<br />

Target[andro_squid_objnum]:<br />

cacheNumObjCount&cacheNumObjCount:public@10.50.5.80:3401<br />

MaxBytes[andro_squid_objnum]: 100000000<br />

Title[andro_squid_objnum]: del numero di oggetti in cache<br />

Options[andro_squid_objnum]: gauge,noo<br />

YLegend[andro_squid_objnum]: Squid Swap Space size<br />

ShortLegend[andro_squid_objnum]: Obj Number<br />

Appendice B<br />

LegendI[andro_squid_objnum]:&nbsp;Squid Number of object stored in cache&nbsp<br />

PageTop[andro_squid_objnum]: del numero di oggetti in cache<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:ObjNumber <br />

Max %: 100%<br />

<br />

###SQUID Number of available FD >> Descr: 'CPU' | Name: '' | Ip: '10.50.5.80' |<br />

Eth: '00-10-5a-be-bd-8a' ###<br />

Target[andro_squid_avFD]:<br />

cacheCurrentUnusedFDescrCnt&cacheCurrentUnusedFDescrCnt:public@10.50.5.80:3401<br />

MaxBytes[andro_squid_avFD]: 1500<br />

Title[andro_squid_avFD]: del numero di FD disponibili<br />

Options[andro_squid_avFD]: gauge,nopercent,noo<br />

YLegend[andro_squid_avFD]: SQUID Number of available FD<br />

ShortLegend[andro_squid_avFD]: Obj Number<br />

LegendI[andro_squid_avFD]:&nbsp;SQUID Number of available FD&nbsp<br />

PageTop[andro_squid_avFD]: del numero di FD disponibili<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:avFD <br />

Max %: 100%<br />

162


###SQUID Number of HHTP request received>> Descr: 'CPU' | Name: '' | Ip:<br />

'10.50.5.80' | Eth: '00-10-5a-be-bd-8a' ###<br />

Appendice B<br />

Target[andro_squid_httpreq]:<br />

cacheProtoClientHttpRequests&cacheProtoClientHttpRequests:public@10.50.5.80:3401<br />

MaxBytes[andro_squid_httpreq]: 10000000<br />

Title[andro_squid_httpreq]: del numero di richieste HTTP ricevute<br />

Options[andro_squid_httpreq]: noo<br />

YLegend[andro_squid_httpreq]: SQUID Number of HHTP request received<br />

ShortLegend[andro_squid_httpreq]: HTTP Req Number<br />

LegendI[andro_squid_httpreq]:&nbsp;SQUID Number of HHTP request received&nbsp<br />

PageTop[andro_squid_httpreq]: del numero di richieste HTTP ricevute<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:HTTPreq <br />

Max %: 100%<br />

<br />

###SQUID Number of cache HHTP HITS>> Descr: 'CPU' | Name: '' | Ip: '10.50.5.80' |<br />

Eth: '00-10-5a-be-bd-8a' ###<br />

Target[andro_squid_httphit]: cacheHttpHits&cacheHttpHits:public@10.50.5.80:3401<br />

MaxBytes[andro_squid_httphit]: 10000000<br />

Title[andro_squid_httphit]: del numero di HTTP HIT in cache<br />

Options[andro_squid_httphit]: noo<br />

YLegend[andro_squid_httphit]: Number of cache HHTP HITS<br />

ShortLegend[andro_squid_httphit]: HTTP HITS<br />

LegendI[andro_squid_httphit]:&nbsp;Number of cache HHTP HITS&nbsp<br />

PageTop[andro_squid_httphit]: del numero di HTTP HIT in cache<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:HTTP HITS <br />

Max %: 100%<br />

<br />

163


Appendice B<br />

###SQUID Number of cache HHTP ERR>> Descr: 'CPU' | Name: '' | Ip: '10.50.5.80' |<br />

Eth: '00-10-5a-be-bd-8a' ###<br />

Target[andro_squid_httperr]:<br />

cacheHttpErrors&cacheHttpErrors:public@10.50.5.80:3401<br />

MaxBytes[andro_squid_httperr]: 10000000<br />

Title[andro_squid_httperr]: del numero di HHTP ERR in cache<br />

Options[andro_squid_httperr]: noo<br />

YLegend[andro_squid_httperr]: Number of cache HHTP ERR<br />

ShortLegend[andro_squid_httperr]: HTTP ERR<br />

LegendI[andro_squid_httperr]:&nbsp;Number of cache HHTP ERR&nbsp<br />

PageTop[andro_squid_httperr]: del numero di HHTP ERR in cache<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:HTTP ERR <br />

Max %: 100%<br />

<br />

###SQUID Number of ICP msg Sent>> Descr: 'CPU' | Name: '' | Ip: '10.50.5.80' |<br />

Eth: '00-10-5a-be-bd-8a' ###<br />

Target[andro_squid_icpsent]:<br />

cacheIcpPktsSent&cacheIcpPktsSent:public@10.50.5.80:3401<br />

MaxBytes[andro_squid_icpsent]: 10000000<br />

Title[andro_squid_icpsent]: del numero di ICP msg inviati<br />

Options[andro_squid_icpsent]: noo<br />

YLegend[andro_squid_icpsent]: SQUID Number of ICP msg Sent<br />

ShortLegend[andro_squid_icpsent]: ICP SentMsg<br />

LegendI[andro_squid_icpsent]:&nbsp;SQUID Number of ICP msg Sent&nbsp<br />

PageTop[andro_squid_icpsent]: del numero di ICP msg inviati<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:ICP Sent MSG <br />

Max %: 100%<br />

<br />

164


Appendice B<br />

###SQUID Number of ICP msg Recv>> Descr: 'CPU' | Name: '' | Ip: '10.50.5.80' |<br />

Eth: '00-10-5a-be-bd-8a' ###<br />

Target[andro_squid_icprecv]:<br />

cacheIcpPktsRecv&cacheIcpPktsRecv:public@10.50.5.80:3401<br />

MaxBytes[andro_squid_icprecv]: 10000000<br />

Title[andro_squid_icprecv]: del numero di ICP msg Recv<br />

Options[andro_squid_icprecv]: noo<br />

YLegend[andro_squid_icprecv]: SQUID Number of ICP msg Recv<br />

ShortLegend[andro_squid_icprecv]: ICP RecvMsg<br />

LegendI[andro_squid_icprecv]:&nbsp;SQUID Number of ICP msg Recv&nbsp<br />

PageTop[andro_squid_icprecv]: del numero di ICP msg Recv<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:ICP Recv MSG <br />

Max %: 100%<br />

<br />

###SQUID Cache Current Swap Size>> Descr: 'CPU' | Name: '' | Ip: '10.50.5.80' |<br />

Eth: '00-10-5a-be-bd-8a' ###<br />

Target[andro_squid_currswap]:<br />

cacheCurrentSwapSize&cacheCurrentSwapSize:public@10.50.5.80:3401<br />

MaxBytes[andro_squid_currswap]: 10000<br />

Title[andro_squid_currswap]: della cacheCurrentSwapSize<br />

Options[andro_squid_currswap]: gauge,noo<br />

YLegend[andro_squid_currswap]: cacheCurrentSwapSize<br />

ShortLegend[andro_squid_currswap]: cacheCurrentSwapSize<br />

LegendI[andro_squid_currswap]:&nbsp;cacheCurrentSwapSize&nbsp<br />

PageTop[andro_squid_currswap]: della cacheCurrentSwapSize<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:cacheCurrentSwapSize <br />

Max %: 100%<br />

<br />

###SQUID Cache HTTP All service time>> Descr: 'CPU' | Name: '' | Ip: '10.50.5.80'<br />

| Eth: '00-10-5a-be-bd-8a' ###<br />

165


Target[andro_squid_httpalltime]:<br />

cacheHttpAllSvcTime.1&cacheHttpAllSvcTime.1:public@10.50.5.80:3401<br />

MaxBytes[andro_squid_httpalltime]: 10000<br />

Title[andro_squid_httpalltime]: del Cache HTTP All service time<br />

Options[andro_squid_httpalltime]: gauge,noo<br />

YLegend[andro_squid_httpalltime]: SQUID Cache HTTP All service time<br />

ShortLegend[andro_squid_httpalltime]: SQUID Cache HTTP All service time<br />

Appendice B<br />

LegendI[andro_squid_httpalltime]:&nbsp;SQUID Cache HTTP All service time&nbsp<br />

PageTop[andro_squid_httpalltime]: del Cache HTTP All service time<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:SQUID Cache HTTP All service time <br />

Max %: 100%<br />

<br />

###SQUID Cache HTTP HIT service time>> Descr: 'CPU' | Name: '' | Ip: '10.50.5.80'<br />

| Eth: '00-10-5a-be-bd-8a' ###<br />

Target[andro_squid_httphittime]:<br />

cacheHttpHitSvcTime.1&cacheHttpHitSvcTime.1:public@10.50.5.80:3401<br />

MaxBytes[andro_squid_httphittime]: 10000<br />

Title[andro_squid_httphittime]: del Cache HTTP Hit service time<br />

Options[andro_squid_httphittime]: gauge,noo<br />

YLegend[andro_squid_httphittime]: SQUID Cache HTTP Hit service time<br />

ShortLegend[andro_squid_httphittime]: SQUID Cache HTTP Hit service time<br />

LegendI[andro_squid_httphittime]:&nbsp;SQUID Cache HTTP Hit service time&nbsp<br />

PageTop[andro_squid_httphittime]: del Cache HTTP Hit service time<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:SQUID Cache HTTP Hit service time <br />

Max %: 100%<br />

<br />

###SQUID Cache ICP Query service time>> Descr: 'CPU' | Name: '' | Ip: '10.50.5.80'<br />

| Eth: '00-10-5a-be-bd-8a' ###<br />

Target[andro_squid_icpquerytime]:<br />

cacheIcpQuerySvcTime.1&cacheIcpQuerySvcTime.1:public@10.50.5.80:3401<br />

166


MaxBytes[andro_squid_icpquerytime]: 10000<br />

Title[andro_squid_icpquerytime]: del Cache ICP Query service time<br />

Options[andro_squid_icpquerytime]: gauge,noo<br />

YLegend[andro_squid_icpquerytime]: SQUID Cache ICP Query service time<br />

ShortLegend[andro_squid_icpquerytime]: SQUID Cache ICP Query service time<br />

Appendice B<br />

LegendI[andro_squid_icpquerytime]:&nbsp;SQUID Cache ICP Query service time&nbsp<br />

PageTop[andro_squid_icpquerytime]: del Cache ICP Query service time<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:SQUID Cache ICP Query service time <br />

Max %: 100%<br />

<br />

###SQUID Request Hit Ratio>> Descr: 'CPU' | Name: '' | Ip: '10.50.5.80' | Eth:<br />

'00-10-5a-be-bd-8a' ###<br />

Target[andro_squid_hitratio]:<br />

cacheRequestHitRatio.1&cacheRequestHitRatio.1:public@10.50.5.80:3401<br />

MaxBytes[andro_squid_hitratio]: 10000<br />

Title[andro_squid_hitratio]: del Request Hit Ratio<br />

Options[andro_squid_hitratio]: gauge,noo<br />

YLegend[andro_squid_hitratio]: SQUID Request Hit Ratio<br />

ShortLegend[andro_squid_hitratio]: SQUID Request Hit Ratio<br />

LegendI[andro_squid_hitratio]:&nbsp;SQUID Request Hit Ratio&nbsp<br />

PageTop[andro_squid_hitratio]: del Request Hit Ratio<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:SQUID Request Hit Ratio <br />

Max %: 100%<br />

<br />

###SQUID Request Byte Ratio>> Descr: 'CPU' | Name: '' | Ip: '10.50.5.80' | Eth:<br />

'00-10-5a-be-bd-8a' ###<br />

Target[andro_squid_byteratio]:<br />

cacheRequestByteRatio.1&cacheRequestByteRatio.1:public@10.50.5.80:3401<br />

MaxBytes[andro_squid_byteratio]: 10000<br />

167


Title[andro_squid_byteratio]: del SQUID Request Byte Ratio<br />

Options[andro_squid_byteratio]: gauge,noo<br />

YLegend[andro_squid_byteratio]: SQUID Request Byte Ratio<br />

ShortLegend[andro_squid_byteratio]: SQUID Request Byte Ratio<br />

LegendI[andro_squid_byteratio]:&nbsp;SQUID Request Byte Ratio&nbsp<br />

PageTop[andro_squid_byteratio]: del SQUID Request Byte Ratio<br />

<br />

System: Andromeda in "Net Lab"<br />

Maintainer: m.crucianelli@elis.org<br />

Description:SQUID Request Byte Ratio <br />

Max %: 100%<br />

<br />

Appendice B<br />

168


Appendice C<br />

Appendice C<br />

In questa appendice è riportato il file di configurazione, calamaris.conf utilizzato per<br />

l’analisi del file di log tramite il tool Calamaris. In questo file possono essere abilitate o<br />

meno differenti tipi di analisi statistiche effettuabili sui log di Squid.<br />

calamaris.conf<br />

###############################################################################<br />

################## CONFIGURATION FILE FOR CALAMARIS V3 ####################<br />

###############################################################################<br />

#<br />

# Configuration file for calamaris V3.x<br />

#<br />

# This configuration file follows the perl syntax. To define variables, just<br />

# do it as you are used to do it.<br />

# $var = value;<br />

# undef($var); # same as $var = 0;<br />

#<br />

# To run calamaris with a configuration file, use:<br />

# cat access.log | ./calamaris --config-file calamaris.conf<br />

#<br />

# All command line arguments overwrites the configuration file items.<br />

#<br />

# Most of the configration items can be configured by commandline<br />

# arguments. Try<br />

# ./calamaris --help<br />

#<br />

# Other commandline arguments:<br />

# -L or --dump-loop: Loop (dumps the generated internal loop to STDERR for<br />

# debugging.)<br />

#<br />

# -C or --copyright copyright (prints the copyright)<br />

# -h or --help help (prints out this message)<br />

# -V or --version Version (prints version-info)<br />

#<br />

# On each section, you find a small description, the command line argument if<br />

# available, an example output (to give you an idea of this section), the<br />

169


# default value and how to use in this configuration file.<br />

#<br />

Appendice C<br />

###############################################################################<br />

#<br />

# IMPORTANT:<br />

# (*) These options break the privacy of your users. Please read the README<br />

# on this.<br />

#<br />

# Some items have to be configured in this configuration file, because no<br />

# command line options are available. Otherwise default values are taken!<br />

#<br />

###############################################################################<br />

###############################################################################<br />

############################# REPORT SECTION ##############################<br />

###############################################################################<br />

###############################################################################<br />

#<br />

# show 'n' Top-level and 'n' second-level destinations,<br />

# -1 = unlimited<br />

#<br />

# command line argument: -d n | --domain-report n<br />

#<br />

# Example output:<br />

#<br />

# Request-destinations by toplevel-domain<br />

# destination request % Byte %<br />

hit-%<br />

# --------------------------------------- --------- ------ -------- ------ ----<br />

--<br />

# *.de 360753 51.58 4576770K 47.41<br />

22.48<br />

# *.com 202536 28.96 4684139K 48.52<br />

18.88<br />

#<br />

# Request-destinations by 2nd-level-domain<br />

# destination request % Byte %<br />

hit-%<br />

# --------------------------------------- --------- ------ -------- ------ ----<br />

--<br />

170


Appendice C<br />

# *.plaxo.com 36 10.00 84835 8.00<br />

0.80<br />

# *.ebay.com 20 7.40 44735 5.50<br />

1.10<br />

#<br />

#<br />

# Default:<br />

# undef($domain_report); # (no top- and second-level destinations are<br />

# reported)<br />

#<br />

# Usage:<br />

# $domain_report = n;<br />

#<br />

$domain_report = -1;<br />

###############################################################################<br />

#<br />

# limit the display of lines to those with a minimum of requests.<br />

#<br />

# command line argument: --domain-report-limit n<br />

#<br />

# Default :<br />

# undef($domain_report_limit); # no limit.<br />

#<br />

# Usage:<br />

# $domain_report_limit = n;<br />

$domain_report_limit = 50;<br />

###############################################################################<br />

#<br />

# change all 2nd-level-reports to N-level-reports. 'n' can be<br />

# any number from 2 up. -1 means full report.<br />

# This is only useful, if $domain_report is set (see above).<br />

#<br />

# command line argument: -N n | --domain-report-n-level n<br />

#<br />

#<br />

# Default:<br />

# undef($domain_report_n_level); # (reporting of second-level destinations)<br />

171


#<br />

# Usage:<br />

# $domain_report_n_level = n; # (reporting of n-level destinations)<br />

Appendice C<br />

###############################################################################<br />

#<br />

# Error code distribution<br />

#<br />

# command line argument: --errorcode-distribution-report<br />

#<br />

# Example output:<br />

#<br />

# TCP Response code distribution<br />

# status-code request % Byte %<br />

# ----------------------------------- --------- ------ -------- ------<br />

# 000 (Used mostly with UDP traffic) 727633 2.93 3625190K 1.97<br />

# 100 (Continue) 4 0.00 687 0.00<br />

# 200 (OK) 20145830 81.19 171223M 95.12<br />

#<br />

#<br />

# Default:<br />

# undef($errorcode_distribution_report); # (no reporting)<br />

#<br />

# Usage:<br />

# $errorcode_distribution_report = [0|1];<br />

$errorcode_distribution_report = 1;<br />

###############################################################################<br />

#<br />

# Object freshness report<br />

# Here you can find information about the freshness of objects in your cache.<br />

#<br />

# Calamaris looks for freshness tags like 'TCP_HIT', 'TCP_REFRESH_MISS', ...<br />

# and make statistics on it. With this information you can optimize the<br />

# caching behaviour of your cache depending on the objects content type.<br />

# E.g. squid admins could use this information to configure the<br />

# refresh_pattern.<br />

#<br />

172


# Default:<br />

# undef($object_freshness_report); # (no reporting)<br />

#<br />

# Usage:<br />

# $object_freshness_report = [0|1];<br />

$object_freshness_report = 1;<br />

# Here you have to define the 'TRANSACTION HEADER' for your cache software!<br />

#<br />

# Note: the variable $refresh_tags is not used at the moment<br />

# Usage: the hash keys have to be one of this (see --input-format):<br />

# squid, squid-old, nc, elff, its or nse<br />

# Please adjust the 'TRANSACTION HEADER' according your cache manual.<br />

#<br />

# $xxx_tags{'hash keys'} = [( 'TRANSACTION HEADER 1',<br />

# 'TRANSACTION HEADER 2',<br />

# 'TRANSACTION HEADER 3' ... )];<br />

#<br />

# $fresh_tags: all fresh hits<br />

# $stale_tags: all stale misses<br />

# $refresh_tags: not used at the moment<br />

# $mod_tags: hits which have been modified after an IMS<br />

# $unmod_tags: hits which have not been modified after an IMS<br />

#<br />

# Explanation:<br />

# all hits = $fresh_tags + $stale_tags<br />

# $stale_tags = $mod_tags + $unmod_tags<br />

#<br />

# The following list is not complete (as you can see) and may be incorrect.<br />

# If there is a need of improvement please notify.<br />

#Tags for squid<br />

$fresh_tags{'squid'} = [( 'TCP_HIT', 'TCP_MEM_HIT', 'TCP_IMS_HIT',<br />

'TCP_IMS_MISS' )];<br />

$stale_tags{'squid'} = [( 'TCP_REFRESH_HIT', 'TCP_REFRESH_MISS',<br />

'TCP_REF_FAIL_HIT' )];<br />

$refresh_tags{'squid'} = [( 'TCP_CLIENT_REFRESH' )];<br />

$mod_tags{'squid'} = [( 'TCP_REFRESH_MISS' )];<br />

$unmod_tags{'squid'} = [( 'TCP_REFRESH_HIT' )];<br />

Appendice C<br />

173


#Tags for squid-old<br />

$fresh_tags{'squid-old'} = [( 'TCP_HIT', 'TCP_MEM_HIT', 'TCP_IMS_HIT',<br />

'TCP_IMS_MISS' )];<br />

$stale_tags{'squid-old'} = [( 'TCP_REFRESH_HIT', 'TCP_REFRESH_MISS',<br />

'TCP_REF_FAIL_HIT' )];<br />

$refresh_tags{'squid-old'} = [( 'TCP_CLIENT_REFRESH' )];<br />

$mod_tags{'squid-old'} = [( 'TCP_REFRESH_MISS' )];<br />

$unmod_tags{'squid-old'} = [( 'TCP_REFRESH_HIT' )];<br />

#Tags for NetCache 5.5<br />

Appendice C<br />

$fresh_tags{'nc'} = [( 'TCP_HIT', 'TCP_HIT_ACCESS_DENIED', 'TCP_HIT_EJECT',<br />

'TCP_HIT_HIT_PARTIAL', 'TCP_HIT_HIT_VERIFY' )];<br />

$stale_tags{'nc'} = [( 'TCP_HIT_IMS_NOTMOD','TCP_HIT_PRECON<strong>DI</strong>TION_FAILED',<br />

'TCP_MISS_CACHE_VERSION', 'TCP_MISS_VERIFY', 'TCP_REF_FAIL_HIT' )];<br />

$refresh_tags{'nc'} = [( 'TCP_MISS_RELOAD' )];<br />

$mod_tags{'nc'} = [( 'TCP_MISS_VERIFY' )];<br />

$unmod_tags{'nc'} = [( 'TCP_HIT_IMS_NOTMOD' )];<br />

$fresh_tags{'elff'} = [( 'TCP_HIT', 'TCP_HIT_ACCESS_DENIED', 'TCP_HIT_EJECT',<br />

'TCP_HIT_HIT_PARTIAL', 'TCP_HIT_HIT_VERIFY' )];<br />

$stale_tags{'elff'} = [( 'TCP_HIT_IMS_NOTMOD','TCP_HIT_PRECON<strong>DI</strong>TION_FAILED',<br />

'TCP_MISS_CACHE_VERSION', 'TCP_MISS_VERIFY', 'TCP_REF_FAIL_HIT' )];<br />

$refresh_tags{'elff'} = [( 'TCP_MISS_RELOAD' )];<br />

$mod_tags{'elff'} = [( 'TCP_MISS_VERIFY' )];<br />

$unmod_tags{'elff'} = [( 'TCP_HIT_IMS_NOTMOD' )];<br />

###############################################################################<br />

#<br />

# measure peak requests<br />

#<br />

# command line argument: -p [new|old] | --peak-report [new|old]<br />

#<br />

# Example output:<br />

#<br />

# Incoming request peak per protocol<br />

# prt sec peak begins at min peak begins at hour peak begins at<br />

# --- ---- ------------------ ----- ------------------ ------- ----------------<br />

--<br />

# UDP 0 0 0<br />

# TCP 348 04.Apr 04 04:33:58 3059 04.Apr 04 02:01:18 82479 04.Apr 04<br />

23:00:00<br />

174


Appendice C<br />

# --- ---- ------------------ ----- ------------------ ------- ----------------<br />

--<br />

# ALL 348 04.Apr 04 04:33:58 3059 04.Apr 04 02:01:18 82479 04.Apr 04<br />

23:00:00<br />

#<br />

# Incoming transfer volume per protocol<br />

# proto kB/hour peak begins at<br />

# ----- -------- ------------------<br />

# UDP 0<br />

# TCP 1964368 04.Apr 04 22:00:00<br />

# ----- -------- ------------------<br />

# ALL 1964368 04.Apr 04 22:00:00<br />

#<br />

#<br />

# Default:<br />

# undef($peak_report); # (no peak measurement is reported)<br />

#<br />

# Usage:<br />

# $peak_report = ['new'|'old'];<br />

# old = make old request-peak mesurement<br />

# new = make new request&byte-peak measurement<br />

# (both slow Calamaris significantly down.)<br />

$peak_report = 'new';<br />

###############################################################################<br />

#<br />

# Performance: show throughput data for every 'n' minutes<br />

#<br />

# command line argument: -P n | --performance-report n<br />

#<br />

# Example output:<br />

#<br />

# Performance in 60 minute steps<br />

# incomin hit miss direct sibling<br />

fetch<br />

# date request Byte kB/sec kB/sec kB/sec kB/sec kB/sec<br />

kB/sec<br />

# --------------- --------- ----- ------- ------- ------- ------- ------- -----<br />

--<br />

175


# 04.Apr 04 00:00 20217 211M 8.69 53.23 6.35 7.38 4.03<br />

1.11<br />

# 04.Apr 04 01:00 14685 169M 7.93 77.43 5.16 5.64 2.79<br />

13.18<br />

# 04.Apr 04 02:00 23450 388M 15.45 44.42 13.13 16.09 5.76<br />

1.14<br />

# 04.Apr 04 03:00 15092 284M 10.50 3.76 8.52 8.15 16.98<br />

0.39<br />

#<br />

#<br />

# Default:<br />

# undef($performance_report); # (no performance is reported)<br />

#<br />

# Usage:<br />

# $performance_report = n;<br />

$performance_report = 60;<br />

Appendice C<br />

###############################################################################<br />

#<br />

# Time<br />

# adjust the Performance-Report in minutes<br />

#<br />

# command line argument: -T | --performance-report-adjust<br />

#<br />

#<br />

# Default:<br />

# undef($performance_report_adjust); # don't adjust the Performance-Report<br />

#<br />

# Usage:<br />

# $performance_report_adjust = [0|1];<br />

###############################################################################<br />

#<br />

# requester: show 'n' Requesters/User, -1 = unlimited<br />

#<br />

# command line argument: -r n | --requester-report n<br />

#<br />

# Example output:<br />

#<br />

176


# Incoming TCP-requests by host<br />

# host request hit-% Byte hit-% sec<br />

kB/sec<br />

Appendice C<br />

# --------------------------------- --------- ------ -------- ------ ---- -----<br />

--<br />

# 10.1.1.1 186643 3.80 6366926K 0.22 1<br />

55.18<br />

# 10.1.4.2 86331 0.00 26654655 0.00 0<br />

130.18<br />

# 10.1.1.3 48482 7.43 13294970 20.33 0<br />

53.73<br />

# 10.1.5.10 48474 7.43 13289730 20.34 0<br />

57.84<br />

#<br />

#<br />

# Default:<br />

# undef($requester_report); # (no requester is be monitored)<br />

#<br />

# Usage:<br />

# $requester_report = n;<br />

$requester_report = -1;<br />

###############################################################################<br />

#<br />

# no-lookup<br />

# don't look IP-Numbers up<br />

#<br />

# command line argument: -n | --requester-report-no-dns-lookup<br />

#<br />

#<br />

# Default:<br />

# undef($requester_report_no_dns_lookup); # don't lookup IP-Numbers<br />

#<br />

# Usage:<br />

# $requester_report_no_dns_lookup= [0|1];<br />

###############################################################################<br />

#<br />

# use ident information if available (*)<br />

177


#<br />

# command line argument: -u | --requester-report-use-user-info<br />

#<br />

#<br />

# Default:<br />

# undef($requester_report_use_user_info); # don't use login information<br />

#<br />

# Usage:<br />

# $requester_report_use_user_info= [0|1];<br />

Appendice C<br />

###############################################################################<br />

#<br />

# targets for requester: show 'n' targets for every Requester,<br />

# -1 = unlimited), implies $requester_report = n (*)<br />

# If $requester_report is not set, $requester_report is set to<br />

# $requester_report_with_targets.<br />

#<br />

# command line argument: -R n | --requester-report_with_targets n<br />

#<br />

# Example:<br />

#<br />

# Incoming TCP-requests by host<br />

# host / target request hit-% Byte hit-% sec<br />

kB/sec<br />

# --------------------------------- --------- ------ -------- ------ ---- -----<br />

--<br />

# 10.101.93.111 917 8.07 1529952 12.26 1<br />

1.94<br />

# *.the-arena.de 665 10.68 882366 14.49 0<br />

35.11<br />

# *.gmx.net 93 3.23 397865 15.00 0<br />

66.17<br />

# *.ebay.de 54 0.00 53779 0.00 0<br />

24.69<br />

#<br />

#<br />

# Default:<br />

# undef($requester_report_with_targets); # (no requester is monitored)<br />

#<br />

# Usage:<br />

# $requester_report_with_targets = n;<br />

178


$requester_report_with_targets = 3;<br />

Appendice C<br />

###############################################################################<br />

#<br />

# Response Time Diagram:<br />

# sum up the time distribution over all objects.<br />

#<br />

# command line argument: --response-time-report<br />

#<br />

# Example output:<br />

#<br />

# TCP-Request duration distribution in msec<br />

# time request % Byte %<br />

# --------------- --------- ------ -------- ------<br />

#


#<br />

# Usage:<br />

Appendice C<br />

# @response_time_report_interval = qw(0.001 0.1 0.2 0.5 1 2 5 10 20 50 100 200<br />

500 1000 2000 5000 10000 20000 50000 1e10);<br />

@response_time_report_interval = qw(0.001 0.1 0.2 0.5 1 2 5 10 20 50 100 200 500<br />

1000 2000 5000 10000 20000 50000 1e10);<br />

###############################################################################<br />

#<br />

# Size-Distribution-Report:<br />

# shows size-based distribution of requested<br />

# objects, smaller numbers result in more verbose reports.<br />

# choose 2, 10 or 100 for useful output. (You can also play<br />

# with this ;-))<br />

#<br />

# command line argument: -D [2|10|100] | --size-distribution-report [2|10|100]<br />

#<br />

# Example output:<br />

#<br />

# object-size (bytes) request hit-% Byte hit-% sec kB/sec<br />

# -------------------- --------- ------- ------- ------ ------- ------<br />

# 0-0 138146 33.70 0 0.00 4 0.00<br />

# 1-9 7 0.00 35 0.00 0 0.01<br />

# 10-99 38240 0.00 2772033 0.00 10 0.01<br />

#<br />

#<br />

# Default:<br />

# undef($size_distribution_report); # (no reporting)<br />

#<br />

# Usage:<br />

# $size_distribution_report = [2|10|100];<br />

$size_distribution_report = 100;<br />

###############################################################################<br />

#<br />

# status: show verbose status reports<br />

#<br />

180


# command line argument: -s | --status-report<br />

#<br />

# Example output:<br />

#<br />

# Summary<br />

# lines parsed: 699415<br />

# invalid lines: 0<br />

# unique hosts/users: 363<br />

# parse time (sec): 136<br />

#<br />

#<br />

# Default:<br />

# undef($status_report); # (no status reporting)<br />

#<br />

# Usage:<br />

# $status_report = [0|1];<br />

$status_report = 1;<br />

Appendice C<br />

###############################################################################<br />

#<br />

# show 'n' content-type, 'n' extensions and requested protocols,<br />

# -1 = unlimited<br />

#<br />

# command line argument: -t n | --type-report n<br />

#<br />

# Example output:<br />

#<br />

# Requested content-type<br />

# content-type request % Byte %<br />

hit-%<br />

# --------------------------------------- --------- ------ -------- ------ ----<br />

--<br />

# text/html 223479 31.95 4600042K 47.65<br />

11.02<br />

# text/plain 116291 16.63 1460336K 15.13<br />

0.74<br />

#<br />

# Requested extensions<br />

# extensions request % Byte %<br />

hit-%<br />

181


Appendice C<br />

# --------------------------------------- --------- ------ -------- ------ ----<br />

--<br />

# 202347 28.93 4720924K 48.90<br />

4.65<br />

# 139819 19.99 1480113K 15.33<br />

5.59<br />

# gif 115411 16.50 186475K 1.93<br />

62.50<br />

#<br />

#<br />

# Default:<br />

# undef($type_report); # (no reporting)<br />

#<br />

# Usage:<br />

# $type_report = -1;<br />

###############################################################################<br />

#<br />

# switch to case-insensitive reporting (useful for extensions-report)<br />

#<br />

# command line argument: -c | --type-report-ignore-case<br />

#<br />

#<br />

# Default:<br />

# undef($type_report_ignore_case); # make the reports case sensitive<br />

#<br />

# Usage:<br />

# $type_report_ignore_case= [0|1];<br />

$type_report_ignore_case= 1;<br />

###############################################################################<br />

############################# INPUT SECTION ###############################<br />

###############################################################################<br />

###############################################################################<br />

#<br />

# Logformat type:<br />

182


# sets the type of input logfiles<br />

# auto = tries to guess the input format<br />

# (This is the Default)<br />

# squid = Native-Logfile derived from Squid V1.1.beta26-V2.x<br />

# squid-extended = Native-Logfile with log_mime_hdrs enabled<br />

# derived from Squid V1.1.beta26-V2.x (*)<br />

# or Cisco Content Engines (*)<br />

# or Squid with SmartFilter-patch (*)<br />

# squid-old = Native-Logfile derived from Squid<br />

# V1.1.alpha1-V1.1.beta25<br />

# nc = Squid-style Logfiles derived from NetCache V?? (


# include:<br />

# no IPs are analyzed, except IP/range. (*)<br />

# command line argument: --ip-filter-include List<br />

#<br />

# List-Format: 1.1.1.1/32:1.1.2.0/24<br />

# 1.1.1.1/255.255.255.255:1.1.2.0/255.255.255.0<br />

#<br />

#<br />

# command line argument:<br />

# --ipfilter-exclude IP/range<br />

# --ipfilter-include IP/range<br />

#<br />

# Default:<br />

# undef($ipfilter_exclude); # no IPs are excluded<br />

# undef($ipfilter_include); # no IPs are included<br />

#<br />

# Usage:<br />

# $ipfilter_exclude = '1.1.1.1/255.255.255.255:1.1.2.0/255.255.255.0';<br />

# $ipfilter_include = '1.1.1.1/255.255.255.255:1.1.2.0/255.255.255.0';<br />

Appendice C<br />

###############################################################################<br />

#<br />

# no input via ST<strong>DI</strong>N<br />

# This is useful when reading cache files.<br />

#<br />

# command line argument: -z | --no-input<br />

#<br />

#<br />

# Default:<br />

# undef($no_input); # (calamaris expects logfile via ST<strong>DI</strong>N)<br />

#<br />

# Usage:<br />

# $no_input = [0|1];<br />

###############################################################################<br />

#<br />

# Interval<br />

# defines which time-interval should be parsed<br />

184


# t has to be the format yyyymmddhhmmss<br />

# omitting the beginning or ending is allowed.<br />

#<br />

# command line argument: -I t1-t2 | --time-interval t1-t2<br />

#<br />

#<br />

# Default:<br />

# undef($time_interval);<br />

#<br />

# Usage:<br />

# $time_interval= 't1-t2';<br />

$time_interval= '20050429090000-20050504230000';<br />

Appendice C<br />

###############################################################################<br />

############################# OUTPUT SECTION ##############################<br />

###############################################################################<br />

###############################################################################<br />

#<br />

# Graph colours:<br />

# These values cannot be configured by commandline arguments!<br />

# If you want to change the default values, you have to use this<br />

# configuration items.<br />

#<br />

# Define the colours of the columns and text/axis/legend/labels.<br />

# The colours for Hit-% are automatically darkend.<br />

#<br />

# Default:<br />

# $column1_color = '#6699cc';<br />

# $column2_color = '#ff9900';<br />

# $text_color = '#222266';<br />

###############################################################################<br />

#<br />

# image type<br />

# Sets the image type to gif, png, jpeg, gd or gd2. Only usefull when<br />

185


# --output-format graph is set. The supported images types are dependend<br />

# on your GD::Graph installation.<br />

# Calamaris tells you which formats are supported, if an error occurs.<br />

#<br />

#<br />

# Default:<br />

# $image_type = 'png';<br />

#<br />

# Usage:<br />

# $image_type = ['gif'|'png'|'jpeg'|'gd'|'gd2'];<br />

Appendice C<br />

###############################################################################<br />

#<br />

# output format of the tables<br />

#<br />

# Better don't play with this ;-), no warranty what happen with the output, if<br />

# not used correctly<br />

# Please consider:<br />

# - you can not change the order of the table columns.<br />

# - you can switch off the output of single columns by using the keyword 'off'.<br />

# - don't change the numbers or '%'. Do you know, what you are doing?<br />

# - you can change the output of Request/sec and Byte/sec by using the<br />

# following keywords:<br />

#<br />

# kbps = kByte/sec<br />

# spkb = sec/kByte<br />

# bps = Byte/sec<br />

# spb = sec/Byte<br />

# rps = req/sec<br />

# spr = sec/req<br />

# rpms = req/msec<br />

# mspr = msec/req<br />

# off<br />

# %<br />

#<br />

# Default: the output is optimized to 79 character per line.<br />

#<br />

# This units (keywords) are not influenced by $unit, see below.<br />

186


# Incoming requests by method<br />

$formats[3] = [ 30, 9, '%', 'spr', 8, '%', 'kbps' ];<br />

# Incoming UDP-requests by status<br />

$formats[4] = [ 30, 9, '%', 'mspr', 8, '%', 'kbps' ];<br />

# Incoming TCP-requests by status<br />

$formats[5] = [ 30, 9, '%', 'spr', 8, '%', 'kbps' ];<br />

# Outgoing requests by status<br />

$formats[6] = [ 30, 9, '%', 'spr', 8, '%', 'kbps' ];<br />

# Outgoing requests by destination<br />

$formats[7] = [ 30, 9, '%', 'spr', 8, '%', 'kbps' ];<br />

# Request-destinations by ${N}-level-domain<br />

$formats[8] = [ 26, 9, '%', '%', 'spr', 8, '%', '%', 'kbps' ];<br />

# Request-destinations by toplevel-domain<br />

$formats[9] = [ 16, 9, '%', '%', 'spr', 8, '%', '%', 'kbps' ];<br />

# TCP-Request-protocol<br />

$formats[10] = [ 16, 9, '%', '%', 'spr', 8, '%', '%', 'kbps' ];<br />

# Requested content-type<br />

$formats[11] = [ 26, 9, '%', '%', 'spr', 8, '%', '%', 'kbps' ];<br />

# Requested extensions<br />

$formats[12] = [ 16, 9, '%', '%', 'spr', 8, '%', '%', 'kbps', 11, 11 ];<br />

# Incoming UDP-requests by host<br />

$formats[13] = [ 16, 9, '%', '%', 'spr', 8, '%', '%', 'kbps' ];<br />

# Incoming TCP-requests by host<br />

$formats[14] = [ 16, 9, '%', '%', 'spr', 8, '%', '%', 'kbps' ];<br />

# Distribution Histogram<br />

$formats[15] = [ 16, 9, '%', '%', 'spr', 8, '%', '%', 'kbps' ];<br />

# Performance in $P steps<br />

Appendice C<br />

$formats[16] = [ 15, 9, '%', 5, '%', 6, 'kbps', 'kbps', 'kbps', 'kbps', 'kbps',<br />

'kbps' ];<br />

# UDP-Request duration distribution in msec<br />

$formats[17] = [ 16, 9, '%', '%', 'mspr', 8, '%', '%', 'kbps' ];<br />

# TCP-Request duration distribution in msec<br />

$formats[18] = [ 16, 9, '%', '%', 'mspr', 8, '%', '%', 'kbps' ];<br />

# UDP Response code distribution<br />

$formats[19] = [ 36, 9, '%', '%', 'spr', 8, '%', '%', 'kbps' ];<br />

# TCP Response code distribution<br />

$formats[20] = [ 36, 9, '%', '%', 'spr', 8, '%', '%', 'kbps' ];<br />

###############################################################################<br />

187


#<br />

# Hostname<br />

# Define the name for the Report Output<br />

# 'lookup' issues a lookup for the current host<br />

# FQDN means, give an full qualified domain name or any name you want.<br />

#<br />

# command line argument: -H ['FQDN|'lookup'] | --hostname ['FQDN|'lookup']<br />

#<br />

#<br />

# Default:<br />

# undef($hostname); # The report output headline is without any hostname<br />

#<br />

# Usage:<br />

# $hostname= ['FQDN|'lookup'];<br />

Appendice C<br />

###############################################################################<br />

#<br />

# logo<br />

# Here you can define a HTML-string which should be included into the report<br />

# head. You can also define a filename, then the file is included into the<br />

# report head. It works only in combination with<br />

# $output_format = 'html' or 'html,graph'.<br />

#<br />

# command line argument: -l [string|filename] | --logo [string|filename]<br />

#<br />

#<br />

# Default:<br />

# undef($logo); # no logo is included into the html head<br />

#<br />

# Usage:<br />

# $logo= ' HTML-TEXT '; # define string<br />

# $logo= './calamaris_head.html'; # or define file<br />

###############################################################################<br />

#<br />

# Meta<br />

# includes the given strings in html-. You can also give a filename, then<br />

188


# the file is included in html-. It works only in combination with<br />

# $output_format = 'html' or 'html,graph'.<br />

Appendice C<br />

# This is useful to include CSS or JavaScript. It's up to you, to include some<br />

# more CSS Tags in the calamaris output. You have to edit the source code.<br />

#<br />

# The following CSS tags are defined already:<br />

# .TableDefinition<br />

# .TableHeadline<br />

#<br />

# command line argument: -M [string|filename] | --meta [string|filename]<br />

#<br />

#<br />

# Default:<br />

# undef($meta); # (no meta information is included)<br />

#<br />

# Usage:<br />

# $meta = '<br />

# <br />

# '; # define string<br />

# $meta ='./calamaris.css'; # or define CSS-file<br />

###############################################################################<br />

#<br />

# output format (comma-seperated list)<br />

# (Default is plain formatted text)<br />

# mail = mail format<br />

# html = HTML format<br />

# html-embed = HTML format without HTML-headers<br />

# graph = enable graphics, needs GD::Graph, only useful with<br />

# html or html-embed (see also $output_path)<br />

# unformatted = plain unformatted output<br />

#<br />

# command line argument: -F [options] | --output-format [options]<br />

#<br />

#<br />

# Default:<br />

# undef($output_format); # Default is plain formatted text<br />

#<br />

# Usage:<br />

189


# $output_format = ['mail'|'html'|'html-embed'|'graph'|'unformatted'];<br />

$output_format = 'html,graph';<br />

Appendice C<br />

###############################################################################<br />

#<br />

# output path<br />

# writes output calamaris statistics to /path. In case of<br />

# html-embed,graph or html,graph output, the graphics destination is /path.<br />

# If $output_path is not given, all graphics are written to the working<br />

# directory. './'. The Filename is index.html for html-output and<br />

# calamaris.txt on plain-output.<br />

#<br />

# command line argument: --output-path 'path'<br />

#<br />

#<br />

# Default:<br />

# undef($output_path); # Default is output path is working directory './'<br />

#<br />

# Usage:<br />

# $output_path= '/path';<br />

$output_path= '/home/marco/calamaris';<br />

###############################################################################<br />

#<br />

# output file<br />

# alters the filename of the output path. Else it is index.html on html-output<br />

# and calamaris.txt on plain-text-output.<br />

#<br />

# command line argument: --output-file 'filename'<br />

#<br />

#<br />

# Default:<br />

# undef($output_file); # Default is index.html or calamaris.txt<br />

#<br />

# Usage:<br />

# $output_file= 'filename';<br />

190


Appendice C<br />

###############################################################################<br />

#<br />

# list Show<br />

# Shows only the defined reports (comma-seperated list) in the<br />

# specified order. The following numbers are defined (see ./calamaris -h):<br />

# 0 Summary<br />

# 1 Incoming request peak per protocol<br />

# 2 Incoming transfer volume peak per protocol<br />

# 3 Incoming requests by method<br />

# 4 Incoming UDP-requests by status<br />

# 5 Incoming TCP-requests by status<br />

# 6 Outgoing requests by status<br />

# 7 Outgoing requests by destination<br />

# 8 Request-destinations by 2nd-level-domain<br />

# 9 Request-destinations by toplevel-domain<br />

# 10 TCP-Request-protocol<br />

# 11 Requested content-type<br />

# 12 Requested extensions<br />

# 13 Incoming UDP-requests by host<br />

# 14 Incoming TCP-requests by host<br />

# 15 Size Distribution Diagram<br />

# 16 Performance in n minute steps<br />

# 17 UDP-Request duration distribution in msec<br />

# 18 TCP-Request duration distribution in msec<br />

# 19 UDP Response code distribution<br />

# 20 TCP Response code distribution<br />

#<br />

# Note: only putting out one report does not speed up Calamaris<br />

# as the internal operations were done based on the<br />

# report-switches. Default: Reports are displayed based on<br />

# activated reports.<br />

#<br />

# command line argument:<br />

# -S comma-separated-list | --show-reports comma-separated-list<br />

#<br />

#<br />

# Default:<br />

# undef($show_reports); # sort request size<br />

#<br />

191


# Usage:<br />

# $show_reports = 0,1,2,4,6;<br />

$show_reports = 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20;<br />

Appendice C<br />

###############################################################################<br />

#<br />

# Sort Order<br />

# changes the sort order in the reports to request size,<br />

# default is sorting by number of requests.<br />

#<br />

# command line argument: -O | --sort-order<br />

#<br />

#<br />

# Default:<br />

# undef($sort_order); # sort request size<br />

#<br />

# Usage:<br />

# $sort_order = [0|1];<br />

###############################################################################<br />

#<br />

# define the Unit for the Byte-values, else it will be auto<br />

# K(ilo), M(ega), G(iga), T(era)<br />

#<br />

# command line argument: -U option | --unit option<br />

#<br />

#<br />

# Default:<br />

# undef($unit); # Default is yoto formatting of unit.<br />

#<br />

# Usage:<br />

# $unit = [K|M|G|T];<br />

###############################################################################<br />

#<br />

# Define the graph size in pixel.<br />

# The image ratio (width : height) is 3 : 2.<br />

192


#<br />

# Default:<br />

# $width = 600; # the graph has a size of 600x400 Pixel<br />

# Usage:<br />

# $width = 300;<br />

Appendice C<br />

###############################################################################<br />

#<br />

# How many datasets should be drawn on the graph.<br />

# $x_scale = 30 is a good value, play with this -> no warranty what happens<br />

# if $x_scale is too big!<br />

#<br />

# Default:<br />

# $x_scale = 30;<br />

# Usage:<br />

# $x_scale = 10;<br />

###############################################################################<br />

############################# CACHE SECTION ###############################<br />

###############################################################################<br />

###############################################################################<br />

#<br />

# input-file<br />

# input-datafile for caching, to add many files separate them with a ':'.<br />

#<br />

# command line argument:<br />

# -i 'inputfile.dat' | --cache-input-file 'inputfile.dat'<br />

#<br />

#<br />

# Default:<br />

# undef($cache_input_file); # no input from cache file<br />

#<br />

# Usage:<br />

# $cache_input_file= 'file1:file2:file3';<br />

###############################################################################<br />

#<br />

193


# output-file<br />

# output-datafile for caching, can be the same as $cache_input_file<br />

#<br />

# command line argument: -o filename.dat | --cache-output-file filename.dat<br />

#<br />

#<br />

# Default:<br />

# undef($cache_output_file); # no cachefile will be written<br />

#<br />

# Usage:<br />

# $cache_output_file = 'cache.dat';<br />

Appendice C<br />

###############################################################################<br />

############################## MISC SECTION ###############################<br />

###############################################################################<br />

###############################################################################<br />

#<br />

# benchmark<br />

# prints a hash-sign (#) to STDERR for each n lines<br />

# processed<br />

#<br />

# command line argument: -b n | --benchmark n<br />

#<br />

#<br />

# Default:<br />

# undef($benchmark); # don't show hashes (#)<br />

#<br />

# Usage:<br />

# $benchmark = n;<br />

###############################################################################<br />

############################# DEBUG SECTION ###############################<br />

###############################################################################<br />

###############################################################################<br />

#<br />

194


# make some small tests (only for programmer)<br />

#$test = 1;<br />

Appendice C<br />

###############################################################################<br />

#<br />

# verbose<br />

# print information what Calamaris is doing. Useful for debugging.<br />

#<br />

# command line argument: -v | --verbose<br />

#<br />

#<br />

# Default:<br />

# undef($verbose); # don't write debug information<br />

#<br />

# Usage:<br />

# $verbose = [0|1];<br />

###############################################################################<br />

#<br />

#Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Cord Beermann.<br />

#Calamaris comes with ABSOLUTELY NO WARRANTY. It is free software, and you are<br />

#welcome to redistribute it under certain conditions. See source for details.<br />

#Calamaris-Homepage: http://Calamaris.Cord.de/<br />

#<br />

###############################################################################<br />

# $Id: calamaris.conf,v 3.0.0.4 2004/12/23 20:16:10 cord Exp $<br />

195


Appendice D<br />

Appendice D<br />

In questa appendice è riportato il file di configurazione spd.cfg necessario al<br />

funzionamento del programma SPD. Tale file è diviso in sezioni: la sezione di default deve<br />

necessariamente essere presente per il corretto funzionamento del programma stesso.<br />

Spd.cfg<br />

#####################################<br />

# File di configurazione del demone #<br />

#####################################<br />

[DEFAULT]<br />

# Dimensione della cache di squid<br />

dim_cache = 1000000000<br />

# Path assoluto del file di log da analizzare<br />

log_from = /usr/local/squid/var/logs/access.log.0<br />

[POSTA]<br />

# Abilita l'invio di posta per notificare il logging del demone [on|off]<br />

mail = on<br />

# Indirizzo del mittente della posta (demone)<br />

# Inseribile nei formati [indirizo@posta.com | Nome Cognome<br />

]<br />

from_addr = Marco Crucianelli <br />

# Indirizzo del destinatario della posta<br />

# Inseribile nei formati [indirizo@posta.com | Nome Cognome<br />

]<br />

to_addr = m.crucianelli@elis.org<br />

196


[SMTP]<br />

# Valido solo se mail = on<br />

# Indirizzo del server SMTP da usare per inviare la posta<br />

smtp = exchange2003.elis.org<br />

# Abilita, se necessario, il login per l'invio della posta [on| off]<br />

login = on<br />

# Login per l'accesso al server SMTP<br />

smtp_login = m.crucianelli<br />

# Password per l'accesso al server SMTP<br />

smtp_passwd = prova<br />

Appendice D<br />

197


Glossario<br />

Glossario<br />

ACK Aknowledgement, ovvero informazione di conferma di avvenuta<br />

ricezione dei dati. Usata per esempio nel protocollo TCP<br />

ARP Address Resolution Protocol, è un protocollo utilizzato per<br />

effettuare un mapping di un indirizzo IP con il relativo indirizzo<br />

MAC della scheda di rete ad esso associata<br />

ARQ Automatic Repeat-Request è un protocollo utilizzato per il controllo<br />

(trasmissione)<br />

broadband<br />

d’errore nelle trasmissioni dati<br />

Modalità di trasmissione che consente di trasmettere attraverso un<br />

unico mezzo trasmissivo una molteplicità di segnali<br />

Buffer Circolare Buffer di dimensione fissata che memorizza informazioni fino al<br />

Business-To-<br />

Business<br />

massimo supportato dalla propria dimensione per poi scartare man<br />

mano i dati più vecchi per inserirne di nuovi, il tutto in maniera<br />

continua<br />

Orientamento al mercato di una azienda che fornisce prodotti e/o<br />

servizi non per una utenza finale, bensì per altre aziende<br />

Cache Spazio di memoria utilizzato per mantenere una copia di<br />

informazioni accedute frequentemente così da diminuire la latenza<br />

necessaria al prelevamento tali informazioni<br />

Cache peer Cache inserita all’interno di una struttura di caching cooperativo, in<br />

cui ogni cache (cache peer appunto )scambia dati e informazioni su<br />

essi con le altre cache della struttura<br />

Client Computer collegato ad una rete che effettua una richiesta di un<br />

documento ad un computer server<br />

Cluster Un insieme di computer indipendenti combinati assieme come un<br />

Database<br />

Relazionale<br />

unico sistema attraverso del software e una rete sottostante. Lo<br />

scopo è sia quello di raggiungere alta disponibilità di risorse (High<br />

Availability) sia alte prestazioni (High Performance Computing)<br />

Modello di database che consiste di diversi file separati che sono<br />

correlati l'un l'altro attraverso campi chiave. Si può accedere alle<br />

198


Glossario<br />

informazioni memorizzate in un file attraverso uno o più degli altri<br />

file, grazie alle relazioni stabilite tra questi<br />

(protezione) DRM Termine di largo significato, usato per identificare tutto in insieme<br />

di tecniche che consentono ad un fornitore di contenuti in formato<br />

elettronico di controllare come i propri contenuti vengono utilizzati<br />

da apparecchiature elettroniche che implementano tali tecnologie<br />

FEC Forward Error Correction è un sistema per il controllo d’errore nelle<br />

trasmissioni dati che consente la correzione di un determinato<br />

numero di bit di errore introdotti durante la comunicazione<br />

Funzione di Hash Funzione necessaria al calcolo dell’hash di una documento (et<br />

similia), di un identificativo unico<br />

Gateway (Internet) Computer che mette in comunicazione la rete di residenza di un<br />

insieme di client con Internet<br />

(licenza) GPL Licenza software inizialmente scritta da Richard Stallman, anche<br />

nota come copyleft che assegna i seguenti diritti:<br />

libertà di usare un programma per qualsiasi scopo;<br />

libertà di studiare come funziona un programma ed eventualmente di<br />

modificarlo;<br />

libertà di ridistribuire copie del programma stesso;<br />

libertà di migliorare il programma e di rilasciare lo copie al<br />

pubblico.<br />

(cache) Hit Si ha un hit in cache quando il dato richiesto è stato trovato in cache<br />

Internet Un insieme di reti eterogenee interconnesse tra loro tali da formare<br />

una “ragnatela” di connessioni a livello mondiale<br />

IP virtuale Usato in contrapposizione all’IP reale per indicare un indirizzo IP<br />

normalmente non associato ad una interfaccia fisica, ma, molto più<br />

spesso ad una periferica di loopback.<br />

ISP Internet Service Provider, fornitore di servizi per l’accesso ad<br />

Internet<br />

Layer 7 switching Modalitàdi switching delle richieste effettuata a livello applicativo<br />

Load Balancing Bilanciamento di un carico di lavoro (siano essere richieste web o<br />

199


altro) tra più macchine in maniera equa<br />

Località temporale Principio adottato nelle cache secondo il quale un documento<br />

Glossario<br />

acceduto di recente ha buone probabilità di essere acceduto ancora<br />

nell’immediato futuro<br />

Log File di testo in cui vengono memorizzati tutte gli eventi (generati e<br />

non) registrati da un determinato programma: web server, proxy, etc<br />

MAC address Indirizzo fisico di una periferica di rete, assegnato direttamente dal<br />

produttore della stessa. Non ne possono esistere due uguali<br />

M-Bone Rete virtuale (via software) che consente di effettuare multicast su<br />

tutta l’Internet incapsulando i pacchetti multicast in normali<br />

pacchetti unicast, in modo da risultare trasparente ai router unicast<br />

(sito) Mirror Copia identica di un sito, usata allo scopo di snellire l’accesso al sito<br />

originario<br />

(cache ) Miss Si ha un miss in cache quando il dato richiesto non è stato trovato in<br />

MSS (Maximum<br />

Segment Size)<br />

cache<br />

Dimensione massima di dati inviati in un segmento (unità di misura<br />

di trasmissione dati) nel protocollo TCP<br />

Multicast Modalità di trasmissione dati che prevede l’invio degli stessi dati in<br />

contemporanea ad un gruppo di client ben identificato di una rete.<br />

Una risposta per più richieste<br />

NAK Negative ACK, usato in contrapposizione al normale ACK, inviato<br />

Open Source<br />

(software)<br />

per confermare la ricezione di una informazione. Al contrario, il<br />

NACK, viene inviato solamente in caso di non ricezione<br />

dell’informazione<br />

Software il cui dodice e tutte le altre informazioni che lo riguardano<br />

sono pubblicamente disponibili e modificabili<br />

Origin Server Server a cui è originariamente diretta la richiesta di un documento<br />

da parte di un client. Termine usato in contrapposizione al proxy<br />

che, facendo le veci dell’origin server, restituisce al client tale<br />

documento prelevandolo dalla propria cache<br />

Policy di Politica adottata in un algoritmo di caching per scegliere gli oggetti<br />

200


Rimpiazzamento da rimuovere in cache<br />

Prefetching Tecnica che consiste nel richiedere anticipatamente una<br />

Glossario<br />

informazione che si ritiene verrà richiesta in un prossimo futuro, ma<br />

che ancora attualmente non è stata richiesta<br />

Proxy Computer, posizionato nei pressi di un Internet Gateway, che si<br />

Push (caching vs.<br />

Pull caching)<br />

Regressione<br />

logistica<br />

occupa di servire tutte le richieste dei client, prelevando i documenti<br />

richiesti dalla propria cache o andando ad interrogare l’origin server<br />

e memorizzando in cache l’eventuale risposta, prima di restituirla al<br />

client<br />

Meccanismo di caching che prevede l’invio e la successiva<br />

memorizzazione di un oggetto direttamente in una cache, senza la<br />

necessità che tale oggetto venga preventivamente richiesto da un<br />

client<br />

Tecnica che stima la probabilità che si verifichi un evento, attraverso<br />

l’utilizzo di fattori osservati assieme all'occorrenza o non occorrenza<br />

dell'evento, per stimare la probabilità che l'evento si verifichi in<br />

determinate circostanze.<br />

Reverse Proxy Posizionato, invece che vicino all’utente finale, vicino al sito per il<br />

quale effettuerà le funzionalità di proxy/cache (da qui il termine<br />

reverse), ha lo scopo di alleggerire il carico per il sito interessato<br />

Round Trip Time Tempo necessario all’invio di un pacchetto e alla ricezione<br />

dell’acknowledgement del pacchetto stesso<br />

RSVP Protocollo utilizzato dagli host per richiedere specifiche qualità di<br />

Satelliti<br />

Geostazionari<br />

servizio alla rete per particolari flussi di dati. Esso viene anche<br />

utilizzato dai router per fornire una determinata qualità di servizio<br />

lungo tutti i nodi della comunicazione e per mantenere lo stato<br />

necessario a garantire il servizio richiesto<br />

Satelliti che operano ad una altezza di circa 30000KM e ruotano in<br />

“sincrono” con il globo terrestre, tali da rimanere quasi “fermi”<br />

rispetto ad esso<br />

Server Web Computer che ospita una serie di documenti web. Esso fornisce al<br />

201


client che lo richiede copia di tali documenti<br />

Sniffer Programma che sfruttando la modalità di funzionamento<br />

Slow Start<br />

Algorithm<br />

Glossario<br />

“promiscuo” di una scheda di rete, catturi tutto il traffico in transito<br />

su tale scheda, quindi anche quello a lei non direttamente indirizzato<br />

Algoritmo del protocollo TCP che regola la quantità di informazioni<br />

inviabili nel caso di una nuova connessione o di timeout di una già<br />

esistente<br />

SO-HO Small Office-Home Office, ovvero uffici di piccole dimensioni,<br />

spesso assimilabili a posti di lavoro rappresentati dai telelavoratori<br />

Streaming Tecnica che prevede l’invio di contenuti di carattere multimediale in<br />

forma di flusso live (e quindi non interrompibile) di informazioni<br />

Testbed network Rete dove ingegneri e ricercatori possono implementare nuovo<br />

Three-Way-<br />

Handshaking<br />

tecnologie di rete, testarle e valutarle<br />

Meccanismo utilizzato dal protocollo TCP per la creazione di una<br />

connessione, che prevede lo scambio di tre pacchetti: il primo, SYN,<br />

per richiedere la creazione della connessione (richiedente), il<br />

secondo, SYN-ACK, per accettare la richiesta (ricevente) e il terzo e<br />

ultimo, ACK, per confermare la ricezione dell’accettazione<br />

(richiedente)<br />

Timestamp Relativamente ad una pagina web salvata in cache, rappresenta<br />

l’informazione di data e ora in cui quella pagina è stata creata<br />

TCP Protocollo di livello trasporto che fornisce meccanismi di controllo<br />

della comunicazione<br />

Transparent proxy Proxy server completamente trasparente all’utente finale che dovrà<br />

utilizzarlo. Molto utile e usato in ambito aziendale, poiché consente<br />

notevoli risparmi in termini di configurazione per l’amministratore<br />

di sistema, dal momento che non richiede settaggi per l’utente finale<br />

UDP Protocollo di livello trasporto che non fornisce meccanismi di<br />

controllo della comunicazione<br />

Unicast Modalità di trasmissione dati che prevede l’invio di tali informazioni<br />

202


ad un unico client della rete. Una risposta per una richiesta<br />

Glossario<br />

Url Uniform Resource Locator, fornisce l’identificativo della posizione<br />

di una copia di una determinata risorsa<br />

Wormhole caching Modalità di caching che prevede lo scambio di dati tramite l’utilizzo<br />

di wormholes, ovvero link che saltano i normali collegamenti di<br />

rete, per collegare punto punto due postazioni geograficamente<br />

molto distanti (eliminando così i problemi di latenza dovuti alla<br />

lontananza e alla conseguente necessità di transitare su numerosi<br />

percorsi e apparati di rete)<br />

203


Bibliografia<br />

[And03] M. Andreolini, M. Colajanni, M. Nuccio, “Kernel-based Web switches<br />

Bibliografia<br />

providing content-aware routing”, Proc. of 2nd IEEE Int'l Symposium on<br />

Network Computing and Applications (NCA'03), Cambridge, MA, April<br />

2003<br />

[Apa05] The Apache Software Foundation, http://www.apache.org, May 2005<br />

[Arl99] M. Arlitt, L. Cherkasova, J. Dilley, R. Friedrich, T. Jin, “Evaluating Content<br />

Management Techniques for Web Proxy Caches”,<br />

http://www.hpl.hp.com/techreports/98/HPL-98-173.html, April 1999<br />

[Bha04] Bhalekar, J. Baras, “Cumulative Caching For Reduced User-Perceived<br />

Latency For WWW Transfer On Networks With Satellite Links”,<br />

http://www.isr.umd.edu/~anibha/ICT-2004-Paper.pdf, IECT 2004, March<br />

2004<br />

[Bal04] Balamash, M. Krunz, “An Overview Of Web Caching Replacement<br />

Algorithms”, IEEE Communication Survey, Vol.6, N° 2, Second Quarter<br />

2004<br />

[Bee05] C. Beermann, “Calamaris”,<br />

http://cord.de/tools/squid/calamaris/Welcome.html.en, January 2005<br />

[Bro05] E. Brown, “Guida a Cron per Gentoo Linux”, http://www.gentoo.it/doc/cron-<br />

guide, March 2005<br />

[Car02] V. Cardellini, E. Casalicchio, M. Colajanni, P. S. YU, “The State of the Art in<br />

Locally Distributed Web-Server Systems”, ACM Computing Surveys, Vol.<br />

34, No. 2, June 2002<br />

[Che99] H. Chen, M. Abrams, T. Johnson, A. Mathur, I. Anwar, J. Stevenson,<br />

“Wormhole Caching with HTTP PUSH Method for a Satellite-Based Web<br />

Content Multicast and Replication System”,<br />

http://citeseer.ist.psu.edu/rd/93912320%2C100392%2C1%2C0.25%2CDown<br />

load/http://citeseer.ist.psu.edu/cache/papers/cs/5111/http:zSzzSzwww.ircache<br />

204


.netzSzCachezSzWorkshop99zSzPaperszSzchen-<br />

final.pdf/chen99wormhole.pdf, 1999<br />

[Cis02] “Simple Network Management Protocol”,<br />

http://www.cisco.com/univercd/cc/td/doc/cisintwk/ito_doc/snmp.pdf,<br />

February 2002<br />

[Coh95] Y. Cohen, “SNMP – Simple Network Management Protocol”,<br />

http://www2.rad.com/networks/1995/snmp/snmp.htm, 1995<br />

Bibliografia<br />

[Coo02] J. Cooper, “Designing a Web Caching Infrastructure for Your Network”,<br />

http://www.swelltech.com/support/sizecache/index.html, May 2002<br />

[Dil99] J. Dilley, M. Arlitt, S. Perret, “Enhancement and Validation of Squid's Cache<br />

Replacement Policy”, http://www.hpl.hp.com/techreports/1999/HPL-1999-<br />

69.html, May 1999<br />

[DRA05] Linux VS, “TCPHA Project”, http://dragon.linux-vs.org/~dragonfly/, May<br />

2005<br />

[Gen05] “HOWTO SNMP and MRTG Made Easy”, http://gentoo-<br />

wiki.com/HOWTO_SNMP_and_MRTG_Made_Easy, May 2005<br />

[Gnu05] GNU Wget 1.10 Manual,<br />

http://www.gnu.org/software/wget/manual/wget.html, May 2005<br />

[Gue97] D. Guerrero, “Network Management & Monitoring with Linux”,<br />

http://www.david-guerrero.com/papers/snmp/, June 1997<br />

[Hof99] M. Hofmann, T. S. Eugene Ng, K. Guo, S. Paul, H. Zhang, “Caching<br />

Techniques For Streaming Multimedia Over The Internet”, Bell-Lab<br />

Technical Memorandum, April 1999<br />

[Ino96] H. Inoue, K. Kanchanasut, S. Yamaguchi, “Adaptive WWW Cache<br />

Mechanism in the AI3 Network”, http://www.ai3.net/pub/inet97/inet97-<br />

w3cache.html, 1996<br />

[Ino97] H. Inoue, K. Kanchanasut, S. Yamaguchi, “An Adaptive WWW Cache<br />

Mechanism in the AI3 Network”,<br />

http://www.ai3.net/pub/inet97/cache_ppt/foils.html, June 1997<br />

[Ipr05] Linux routing manipulation tools, http://developer.osdl.org/dev/iproute2, June<br />

05<br />

205


[Irc05] IRCache, http://www.ircache.net/, June 2005<br />

[Jav05] JavaScript.com (TM) - The Definitive JavaScript Resource:<br />

JavaScript Tutorials, Free Java Scripts, Source Code and Other<br />

Scripting Resources, http://www.javascript.com, May 2005<br />

[Kri01] Krishnamurthy, J. Rexford, “Web Protocols and Practice. HTTP/1.1,<br />

Bibliografia<br />

Networking Protocols, Caching, and Traffic Measurement”, Addison Wesley,<br />

May 2001<br />

[Lin01] H. Linder e R. Donadio, “WestSees, issue 4: SatCAST - Satellite Multicast<br />

for Web Applications”,<br />

http://www.west.nl/whitepapers/SatCAST/TechArticle.html, April 2001<br />

[Lin05a] Linux Virtual Server, “Linux Virtual Server: how”,<br />

http://www.linuxvirtualserver.org/how.html, May 2005<br />

[Lin05b] Linux Virtual Server, “Virtual server via IP-tunnelling”,<br />

http://www.linuxvirtualserver.org/VS-IPTunneling.html, May 2005<br />

[Lin05c] Linux Virtual Server, “ARP problem in VS/TUN and VS/DR“,<br />

http://www.linuxvirtualserver.org/docs/arp.html, May 2005<br />

[Mat99] Mathur, M. Abrams, H. Chen, T. Oishi, T. Johnson, I. Anwar, “Adding<br />

Intelligence To Satellite-Based Internet Links: Architecture Of A Second-<br />

Generation Satellite-Based Internet Delivery System”,<br />

http://www.isoc.org/inet99/proceedings/4q/4q_2.htm, Inet99, 1999<br />

[Mog97] J. Mogul, F. Douglis, A. Feldmann, “Potential Benefits of Delta Encoding<br />

and Data Compression for HTTP”, Proceedings of SIGCOMM (1997)<br />

[MRT05] “MRTG Reference”, http://people.ee.ethz.ch/~oetiker/webtools/mrtg/mrtg-<br />

reference.html, May 2005<br />

[Mys05] MySQL: The World's Most Popular Open Source Database,<br />

http://www.mysql.com, May 2005<br />

[Net05] Netem, http://developer.osdl.org/shemminger/netem/, June 2005<br />

[Nis05] NIST net, http://www-x.antd.nist.gov/nistnet/, June 2005<br />

[Nok05] “Python for Series 60”,<br />

http://www.forum.nokia.com/main/1,6566,1_49,00.html, June 2005<br />

[Php05] PHP: Hypertext Preprocessor, http://www.php.net, May 2005<br />

206


[Pru04] F. Prunoiu, “MRTG Implementation Manual”,<br />

Bibliografia<br />

http://www.enterastream.com/whitepapers/mrtg/mrtg-manual.html, August<br />

2004<br />

[Pyt05a] Python, http://www.python.org/, May 2005<br />

[Pyt05b] Python Library Reference - SMTP protocol client,<br />

http://www.python.org/doc/2.4.1/lib/module-smtplib.html, June 2005<br />

[Pyt05c] Python Library Reference - Regular expression operations,<br />

http://www.python.org/doc/2.4.1/lib/module-re.html, June 2005<br />

[Pyt05d] Python Library Reference - Configuration file parser,<br />

http://www.python.org/doc/2.4.1/lib/module-ConfigParser.html, June 2005<br />

[Pyt05e] Python Library Reference - Logging facility for Python,<br />

http://www.python.org/doc/2.4.1/lib/module-logging.html, June 2005<br />

[Rab01] M. Rabinovich, O. Spatscheck, “Web Caching and Replication”, Addison<br />

Wesley, December 2001<br />

[Rou97] Rousskov, V. Soloviev, I. Tatarinov, “Static Caching”,<br />

http://www.cs.ndsu.nodak.edu/~rousskov/research/papers/wcw97/index.html,<br />

April 1997<br />

[Squ05a] Squid Web Proxy Cache, http://www.squid-cache.org/, May 2005<br />

[Squ05b] Squid FAQ, ”Squid Log Files”, http://www.squid-cache.org/Doc/FAQ/FAQ-<br />

6.html, May 2005<br />

[Tag05a] S. Tagliaferri, “I file sorgenti di Squid“, http://merlino.merlinobbs.net/Squid-<br />

Book/HTML/sec-source-code.html, April 2005<br />

[Tag05b] S. Tagliaferri, “Capire il funzionamento delle ACL”,<br />

http://merlino.merlinobbs.net/Squid-Book/HTML/sec-liste-di-controllo-<br />

acl.html, April 2005<br />

[Tag05c] S. Tagliaferri, “Due parole su SNMP”, http://merlino.merlinobbs.net/Squid-<br />

Book/HTML/sec-parole-snmp.html, April 2005<br />

[Tag05d] S. Tagliaferri, “MRTG e Squid”, [Tag05] S.Tagliaferri, “Due parole su<br />

SNMP”, http://merlino.merlinobbs.net/Squid-Book/HTML/sec-parole-<br />

snmp.html, April 2005<br />

207


Bibliografia<br />

[TCP05] TCPIP Guide, ”TCP Operational Overview and the TCP Finite State Machine<br />

(FSM)”,<br />

http://www.tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFinite<br />

StateMachineF.htm, May 2005<br />

[Zha04] Q. Zhang, Z. Xiang, W. Zhu, L. Gao, “Cost-Based Cache Replacement And<br />

Server Selection For Multimedia Proxy Across Wireless Internet”, IEEE<br />

Transaction On Multimedia, Vol.6, N°4, August 2004<br />

[Wes04] D. Wessels, “Six Things First-Time Squid Administrators Should Know”,<br />

http://www.onlamp.com/pub/a/onlamp/2004/02/12/squid.html, December<br />

2004<br />

208


L’autore, Marco Crucianelli, ringrazia vivamente l’Ing. Cardellini per<br />

il sostegno, la pazienza e i preziosi consigli dispensati; il Prof. Tucci<br />

per la disponibilità accordata; l’Elis tutta per il sostegno tecnico e<br />

umano dimostrati.<br />

Si ringrazia inoltre l’Università degli studi di Roma “Tor Vergata” e<br />

tutti coloro che hanno reso possibile questo lavoro.<br />

209

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!