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
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]: CPU Utilization (percentage) <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]: Squid CPU Utilization (percentage) <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]: Squid Swap Space size <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]: Squid Number of object stored in cache <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]: SQUID Number of available FD <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]: SQUID Number of HHTP request received <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]: Number of cache HHTP HITS <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]: Number of cache HHTP ERR <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]: SQUID Number of ICP msg Sent <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]: SQUID Number of ICP msg Recv <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]: cacheCurrentSwapSize <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]: SQUID Cache HTTP All service time <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]: SQUID Cache HTTP Hit service time <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]: SQUID Cache ICP Query service time <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]: SQUID Request Hit Ratio <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]: SQUID Request Byte Ratio <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