Facoltà di Ingegneria
Appunti
del corso di
Impianti Informatici
Disclaimer:
ATTENZIONE!
Questo documento è stato scritto da uno studente, utilizzando come fonte gli appunti
presi a lezione.
L'autore sconsiglia di basare il proprio studio unicamente su questo testo, esso è da
intendersi come una base su cui prendere i propri appunti durante le lezioni.
Questo documento non è stato visionato nè approvato da alcun professore, usatelo a
vostro rischio e pericolo! L'autore non si prende alcuna responsabilità riguardo al
risultato dei vostri esami!
Licenza:
Quest'opera è stata rilasciata sotto la licenza Creative Commons Attribuzione-Non
commerciale-Condividi allo stesso modo 2.5 Italia. Per leggere una copia della
licenza visita il sito web http://creativecommons.org/licenses/by-nc-sa/2.5/it/ o
spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San
Francisco, California, 94105, USA.
Contatti:
Se sentite il bisogno di contattare l'autore per comunicargli suggerimenti, critiche
costruttive, la presenza di errori di qualsiasi tipo presenti nel testo, oppure se volete
ringraziarlo per il lavoro svolto;
potete mandare una e-mail all'indirizzo: stbenna@hotmail.it
Questo documento è rilasciato sotto licenza Creative Commons; quindi, se desiderate,
potete modificarlo nei limiti concessi dalla licenza. In caso apportiate modifiche al
testo e vogliate pubblicarlo, siete pregati di comunicarlo all'autore all'indirizzo
riportato sopra.
Se invece sentite il bisogno di contattare l'autore per comunicargli insulti, denunce,
ricatti, minacce o simili; potete mandare una e-mail all'indirizzo fake@nomail.nil
Indice
Molteplicità (distribuzione) 5
Architettura di un impianto informatico 6
Communication abstraction 6
Terminologia 7
Stratagemmi per ridurre il tempo di comunicazione 7
Tipi di atti comunicativi 8
Artifactual Communication 8
Tipi di elaborazioni eseguite dagli impianti informatici 9
Organizzazione delle architetture parallele 9
Tassonomia di Flynn 9
Architetture Multi-Processore a Memoria Condivisa 10
UMA (Uniform Memory Access) 10
Split-Transaction Bus 15
Shared Cache 16
Gestione software dei sistemi multiprocessore 17
Sincronizzazione 18
Scheduling 18
Multiprogrammazione scalabile (+ di 60 CPU) 19
Tipologie di messaggio 19
Deadlock 19
NUMA (Not Uniform Memory Access) 20
Directory Memory Based 21
Directory Cache Based 25
COMA (Cache Only Memory Access) 27
Caratteristiche di Workload 28
High Performance I/O Interconnect 32
Tipologie 32
Routing 35
Esempi di architetture reali 35
I/O Ad alte prestazioni 37
RAID (Redundant Array of Inexpensive Disks) 38
Architetture di storage 41
Canali di I/O (Peer to Peer) 42
Availability 44
Cluster 45
Load Balancing 46
Failover Failback 48
Architettura NOW (Net Of Workstation): Organizzazione SW 50
Paradigma client/server 50
Stratificazione delle applicazioni client/server 50
Middleware 52
Tipi di middleware 54
Remote Procedure Call 54
Object Request Brocker 57
Problematiche di progetto client/server 58
Tecniche di base per sistemi distribuiti 59
Mutua esclusione 60
Deadlock distribuiti 62
Distributed snapshot 63
Messaggi “falsificati” (o dei generali bizantini) 67
Replicazione 67
Name Service 69
DNS (Domain Name System) 69
NetBios 71
Esecuzione Remota 71
Grid Computing 75
File System Remoti 75
FTP (File Transfer Protocol) 76
NFS 76
SMB Server Message Block (Samba-CIFS) 79
Protocolli di supporto all'amministrazione 80
DHCP (Dynamic Host Configration Protocol) 80
SNMP (Simple Network Management Protocol) 83
Protocolli per la gestione di utenti e informazioni di amministrazione e configurazione 84
NIS/YP (Network Information Service/Yellow Pages) 84
Directory Service 84
LDAP (Lightweight Directory Access Protocol) 84
Posta Elettronica 85
HTTP 86
Programmazione Web 86
WEB SERVICE 87
SICUREZZA 97
HASH FUNCTION 99
AUTENTICAZIONE 101
IPSEC 105
Security Socket Layer (SSL) / Transport Layer Security (TLS) 107
Secure Shell (SSH) 109
Pretty Good Privacy (PGP) 109
Firewall 111
Architetture di Firewall 112
Metodi di attacco 113
Molteplicità (distribuzione)
In genere un impianto informatico possiede dei componenti interni che sono ripetuti; la molteplicità
in un impianto informatico può essere di due tipi:
intrinseca, cioè necessaria al funzionamento dell'impianto (ad esempio risorse che risiedono in
luoghi differenti),
oppure preferita (n è meglio di 1); la molteplicità dei componenti di un impianto fornisce diversi
vantaggi:
– più potenza/prestazione.
– maggiore fault tollerance (affidabilità).
– più specializzazione dei componenti.
– più progressività /scalabilità (cluster).
I principale svantaggi della molteplicità sono il maggiore costo di realizzazione/manutenzione, e
l'aumento della complessità dovuta a:
– sincronizzazione.
– amministrazione.
– configurazione.
– gestione e sfruttamento: è difficile ottenere doppia velocità con un doppio processore o
doppio disco.
– overhead (sovraccarico di comunicazione): per comunicare si utilizza una parte della
potenza di elaborazione (creazione/lettura degli header, cifratura).
– consistenza delle copie.
– interdipendenza: se un componente si guasta, tutti i componenti che richiedono i suoi servizi
durante il loro normale funzionamento potrebbero bloccarsi.
– bottleneck: alcuni componenti possono rallentare il sistema.
Communication abstraction
La communication abstraction permette la portabilità di una soluzione tra architetture diverse
perché rende uniformi le comunicazioni grazie all'astrazione.
La communication abstraction comprende un insieme di atti comunicativi, cioè primitive di
comunicazione che sottostanno a dei vincoli; ogni atto comunicativo ha una denominazione
(mittente, destinatario, contenuto) e specifica come passare dal nome all'oggetto vero e proprio che
è riferito a quell'atto.
La communication abstraction fornisce anche delle garanzie, come la garanzia di sequenzialità
temporale su atti eseguiti dall'oggetto richiedente o da altri oggetti (ad esempio consegna ordinata
dei pacchetti TCP).
Terminologia
Latency: Il tempo trascorso fra l'inizio e la fine di una singola operazione, la latenza è dovuta a
fenomeni fisici ed è quindi sempre presente.
Cost: tempo fra l'inizio e la fine di un insieme di operazioni. Cost= # operazioni/ Bandwidth
Bandwidth: Numero di operazioni svolte nell'unità di tempo
1 # s t a g e
B a n d w i d t h il valore minimo si ottiene in caso di istruzioni
Latency Latency
strettamente sequenziali, il valore massimo in caso di operazioni eseguite in parallelo (pipeline).
Costo totale di comunicazione: Numero atti comunicativi * tempo di comunicazione.
Tempo di comunicazione: Si compone di:
– Overhead, che viene generato dal communication assist e non è eliminabile. L'overhead si
divide in Fisso, ad esempio gli header del protocollo di comunicazione), e Variabile cioè che
dipende dal tipo della comunicazione, ad esempio la copia dei dati ricevuti in un buffer.
– Tempo di accesso al mezzo: genera altro overhead che può essere anche qui Fisso, come ad
esempio il tempo di setup della connessione, e Variabile, come ad esempio il ritardo dovuto alla
saturazione del mezzo trasmissivo (Bandwidth) e tempo di attesa dovuto alla contesa del mezzo
trasmissivo causato da traffico elevato (Contention).
– Tempo in rete: In questo caso l'overhead è dovuto al ritardo di comunicazione (Delay) che non
è eliminabile e idealmente è fisso, e alla quantità di dati trasmessi, quindi variabile, secondo la
formula: Overhead variabile= Numero di bit /Capacità di canale .
Artifactual Communication
Sono le comunicazione che si sarebbero potute evitare se si fosse organizzata meglio la
trasmissione; possono essere dovute a:
– Poor allocation of data: ad esempio eseguire un programma in remoto.
– Unnecessary data in a transfer: dati che avrebbero potuto non essere trasferiti.
– Unnecessary data in a transfer due to system granularities: dati che sono stati trasferiti,
anche se non necessari, a causa di come è strutturato il sistema; ad esempio trasferire un byte da
un dispositivo a blocchi non è possibile, è necessario trasferire l'intero blocco che lo contiene.
– False sharing: è causato dai precedenti due casi, quando si verifica i dati sono bloccati a causa
di un trasferimento che però non li interessa, ad esempio per trasferire due byte da disco
appartenenti allo stesso blocco sono necessari due trasferimenti.
– Redundant repeated communication: un dato viene modificato più volte in breve tempo senza
essere mai letto, sarebbe sufficiente modificarlo solo l'ultima volta.
– Finite replication capacity: il fenomeno del thrashing, dovuto anche all'associatività delle
cache.
Tassonomia di Flynn
Le architetture parallele sono organizzate in base al livello di parallelismo di dati ed istruzioni
– SISD (Single Instruction Single Data): Sono le architetture non parallele, cioè tutte le
architetture che rispecchiano la macchina di Von Neumann.
– SIMD (Single Instruction Multiple data): Sono architetture nelle quali una singola istruzione
è applicata contemporaneamente su più dati. Vengono utilizzate nell'elaborazione vettoriale (es.
GPU) e sono realizzate come CPU che contengono una sola CU e molte ALU, oppure come
normali CPU che contengono registri pensati per l'elaborazione vettoriale.
– MISD (Multiple Instruction Single Data): Questa tipologia non è mai stata realizzata.
– MIMD (Multiple Instruction Multiple Data): Sono le architetture con il più elevato grado di
parallelismo nelle quali più istruzioni vengono eseguite in contemporanea su più dati, tra queste
ci sono le architetture con Thread Level Parallelism.
Le architetture MIMD si suddividono in due sottocategorie:
– Architetture Multiprocessore: Sono composte da un unico computer che ha diversi
processori ed una memoria condivisa alla quale ogni CPU può accedere.
– Architetture Multicomputer: sono composte da numerosi computer a processore singolo o
multiplo collegati fra loro, ciascuno con la sua memoria.
Nell'approccio UMA ogni CPU impiega un tempo costante per accedere a ciascuna porzione della
memoria.
Spesso le CPU e la memoria sono collegate fra loro attraverso un bus condiviso che fa da collo di
bottiglia per le prestazioni dell'intero sistema, è quindi necessario implementare un sistema di cache
per garantire che le prestazioni siano costanti; sorge quindi il problema della consistenza delle
cache.
Con l'introduzione delle cache è necessario che i dati contenuti in memoria siano sempre coerenti
con i dati contenuti in tutte le cache.
Nei sistemi non paralleli si sono sviluppati due metodi che permettono la coerenza fra cache e
memoria:
– Write Through: come un dato viene modificato nella cache viene subito scritto in memoria.
– Write Back: Un dato modificato viene copiato in memoria solo quando sta per essere
cancellato dalla cache, questo evita che ci siano trasferimenti inutili e quindi spreco di risorse.
Nelle architetture parallele a memoria condivisa entrambi i metodi non garantiscono la coerenza
delle cache, infatti anche utilizzando il write through se due processori modificano lo stesso dato in
modo diverso contemporaneamente, in memoria finirà uno dei due valori (quello scritto per ultimo),
mentre nelle cache saranno presenti due valori diversi.
Per garantire la coerenza delle cache è necessario utilizzare il metodo Write Through affiancato
con la Snooping Cache.
Una cache che ha la capacità di snoop è in grado di controllare il bus e accorgersi di eventuali
modifiche che vengono compiute da altri processori su dei dati che sono contenuti al suo interno, e
quindi in grado di aggiornarli (se utilizza la tecnica del write update) o renderli invalidi (se utilizza
la tecnica del write invalidate) senza procedere all'aggiornamento immediato.
Questo automa funziona correttamente anche nel caso due processori tentino di modificare lo stesso
dato contemporaneamente, infatti le modifiche non vengono eseguite contemporaneamente perché i
due processori si contendono il bus di sistema, quindi entrambi sono in grado di accorgersi della
modifica effettuata dall'altro.
Per ottimizzare le risorse, diminuendo i trasferimenti inutili da cache a memoria, si può utilizzare la
tecnica del write back al posto della tecnica di write through; in questo caso però l'automa si
complica e prende il nome di MESI (Modified Exclusive Shared Invalid) dal nome degli stati di
cui è composto.
Per ogni CPU viene implementato il seguente automa, i cui stati hanno il seguente significato:
– Modified: il dato è stato modificato nella cache locale e si trova solo lì, cioè non ci sono delle
copie non aggiornate in cache remote.
– Exclusive: il dato è presente in memoria e solo nella cache locale, non è stato modificato.
– Shared: il dato è in più di una cache ed è valido.
– Invalid: il dato è presente nella cache locale ed è invalido.
Split-Transaction Bus
In un sistema multiprocessore il bus di comunicazione tra le CPU e la memoria è un collo di
bottiglia e penalizza la velocità dell'intero sistema; per migliorare le performance si è sviluppato lo
Split-Transaction Bus, il cui obiettivo è di ridurre i tempi di inutilizzo del bus e quindi
massimizzarne lo sfruttamento.
In un sistema a bus standard, durante una comunicazione fra una CPU e la memoria, il bus viene
riservato per la comunicazione e le altre periferiche si mettono in attesa che la trasmissione finisca e
che il bus torni libero; questo porta ad un tempo di inutilizzo del bus pari al tempo necessario alla
memoria per identificare la cella di memoria, eseguire l'operazione richiesta e produrre una risposta.
Per eliminare questo spreco di tempo, che rispetto alla velocità delle CPU è significativo, lo Split-
Transaction Bus divide la comunicazione in due parti: l'invio della richiesta e la ricezione della
risposta.
Una volta che il mittente ha finito di inviare la richiesta, il bus viene rilasciato e una nuova
comunicazione può iniziare o terminare; una volta che il destinatario è pronto all'invio della risposta
si mette in attesa che il bus gli sia riassegnato per completare la comunicazione.
Una comunicazione che non è conclusa perché il mittente è in attesa della risposta viene chiamata
Outstanding Request.
Le scelte progettuali che possono essere effettuate sviluppando uno Split-Transaction Bus sono:
– Numero di stage (parti in cui suddividere la trasmissione) e il loro ordine.
– Algoritmi di arbitraggio.
– Numero massimo di Outstanding Request.
– Numero massimo di Outstanding Request generate da uno stesso processore.
– Come identificare a quale richiesta corrisponde la risposta.
– Ordine di arrivo delle risposte (ordinate o casuali).
– Buffering.
– Ottimizzazione delle Conflicting Requests e gestione (NACK o Retry).
Shared Cache
Alcuni sistemi multiprocessore implementano una cache condivisa, che porta i seguenti vantaggi:
– Nessun problema di coerenza.
– Sinergia ci comunicazione (i thread dello stesso programma comunicano molto velocemente).
– Possibilità di prefetching (se un thread carica un dato, esso diventa disponibile a tutti gli altri).
– Maggiore sfruttamento della cache.
– Dimensione della cache condivisa minore della somma della dimensione delle cache dedicate,
quindi costo minore.
Ci sono però anche degli svantaggi:
– Maggiore larghezza di banda necessaria.
– Cache condivisa più grande e quindi più lenta delle cache dedicate.
– Presenza di false sharing fra gruppi a causa dell'organizzazione della cache (aumento di
dimensioni ed associatività).
Sincronizzazione
Quando un processo deve attendere, ad esempio che una risorsa si liberi, utilizza la tecnica del Busy
Waiting / Spinlock. Il busy waiting è meno dannoso che nelle architetture mono-processore, ma
solo se viene effettuato per breve tempo.
Per evitare race condition nel caso due processi tentino di entrare in spinlock simultaneamente si
usano delle istruzioni ad atomicità estesa. Sono una serie di istruzioni che non possono essere
interrotte (atomiche), hanno il difetto di rallentare il sistema perché sorge il problema di garantire la
coerenza delle cache.
– Test & Set con Backoff: dopo aver eseguito un istruzione T&S, se il test fallisce aspetto del
tempo prima di effettuare il prossimo test, per non intasare il bus.
– Test + Test&Set: l'istruzione test è di sola lettura, quindi ammette stato shared e non accede al
bus, in caso il test abbia successo si procede con il T&S.
Scheduling
In un sistema multi-processore lo scheduling è diverso rispetto ad un sistema mono-processore, ad
esempio un loop infinito non rende il sistema inutilizzabile perché blocca un solo processore; le
ottimizzazioni del caso mono-processore sono meno cruciali.
Soluzioni di scheduling
I processi vengono suddivisi fra i processori secondo criteri di:
– Priorità: Un processore è riservato ai processi con priorità maggiore (real time).
– Affinità: Un processo viene assegnato al processore sul quale è stato già eseguito, per
avvantaggiarsi di eventuali dati rimasti in cache dalla precedente esecuzione.
Più thread di uno stesso processo possono venire schedulati assieme, in questo caso si parla di
Gang Scheduling.
Fault Tollerance
Con gli algoritmi di scheduling visti fin'ora la fault tollerance non viene aumentata rispetto ad un
sistema mono-processore, infatti se una CPU si guasta mentre sta eseguendo il S.O. il sistema va in
crash perché vanno persi i dati nella sua cache.
Una possibile soluzione, anche se poco efficiente, e quella di implementare una cache L2 condivisa
fra le CPU e usare una politica di write through fra le cache L1 e la cache L2.
Se un dato critico è nei registri questa soluzione è inutile; per evitare che i dati nei registri vadano
persi si implementa a livello HW un Hard Core, cioè una parte di CPU a bassissima probabilità di
guasto che in caso di fail copia tutti i dati nei registri nella cache L2.
Tipologie di messaggio
1. Non blocking send (asincrono): la trasmissione è completa quando il mittente invia al suo
Communication Assist.
2. Blocking Send: la trasmissione è completa quando il mittente invia nel mezzo trasmissivo.
3. Reliable blocking send: la trasmissione è completa quando il messaggio arriva al
Communication Assist del destinatario (serve un meccanismo di ACK).
4. Explicit blocking send (sincrono): la trasmissione è completa quando il messaggio è ricevuto
dall'Unità Funzionale del destinatario.
5. Request/reply (sincrono): il mittente aspetta la risposta del destinatario.
Deadlock
Nei sistemi che comunicano con messaggi il deadlock può presentarsi quando un mittente ed un
destinatario cercano di comunicare fra loro attraverso un canale bufferizzato.
Ipotizziamo per semplicità che sia il buffer del mittente che il buffer del destinatario possano
contenere un solo messaggio; se il mittente invia una richiesta e contemporaneamente il destinatario
invia una risposta si entra in deadlock, perché entrambi aspettano che l'altro buffer si liberi prima di
liberare il proprio. Questa situazione di chiama Fetch Deadlock.
Una soluzione è quella di usare un buffer d'ingresso e uno di uscita, questa soluzione però porta ad
un altro tipo di deadlock: il Buffer Deadlock.
In questo caso può capitare che due nodi A e B debbano inviare ciascuno una risposta all'altro nodo,
M(A) M(A)
Con questa soluzione le prestazioni di accesso alla memoria non sono costanti, infatti ciascun
nodo può accedere molto più velocemente alla sua memoria locale rispetto che al resto della
memoria, collocata in nodi diversi e accessibile solo da remoto; inoltre ciascun nodo può avere
caratteristiche e prestazioni diverse dagli altri e quindi tempi di accesso alla memoria locale diversi.
Esistono due tipi di architetture NUMA:
– NC-NUMA (No cache NUMA): In questa tipologia di NUMA ogni CPU può inserire nella sua
cache (sempre presente nonostante il nome faccia pensare il contrario) solo i dati che sono
memorizzati nella sua memoria locale; si ottengono prestazioni molto disuniformi ma il
problema della coerenza è ristretto ad un nodo e alla sua memoria locale. Per aumentare le
prestazioni si cerca di localizzare i dati in memoria in modo che ogni processore abbia i dati che
gli servono nella sua memoria locale (placing dei dati).
– CC-NUMA (Cache Coherent NUMA): In questo approccio ciascuna CPU ha una directory
che contiene le informazioni che garantiscono la coerenza.
Ci sono poi altri 3 stati transitori (busy) ed uno stato Poison, nel quale si sta fermi aspettando che un
dato sia trasferito da una memoria ad un'altra.
È composta da 3 stati parte M: Home, Fresh (che equivale a Shared) e Gone (che equivale ad
Exclusive).
29 stati stabili parte C, questi si dividono in stati di posizione: Only, Head, Mid, Tail,... ; e stato del
dato: Dirty (che equivale a Modified), Clean (cioè modificabile ed Exclusive), Fresh (valido ma non
modificabile senza informare la home), Copy, Invalid,...
Ci sono anche altri stati transitori che non elenchiamo
Ibridi
Esistono delle architetture in cui le directory sono organizzate in modo ibrido, ad esempio può
esistere una directory per ogni nodo, formato da n processori con rispettiva memoria
Quando un nodo richiede un dato da remoto lo mette in una delle sue cache; quando ha finito di
usarlo lo salva nella sua memoria cache condivisa.
Per colpa di questo meccanismo non si può sapere dove sono memorizzati i dati; per risolvere
questo problema si può aggiungere una memoria che tiene traccia delle posizioni e degli
spostamenti; oppure si può chiedere ad un nodo dopo l'altro se ha il dato richiesto in cache,
seguendo l'ordine indicato in un elenco che contiene la priorità di tutti i nodi.
E inoltre necessario che il sistema tenga conto di quante cache memorizzano ogni dato per evitare
che venga cancellata l'ultima copia del dato rimasta in memoria, prima che sia stata copiata su
disco.
Per questi motivi non esistono esempi concreti di architetture COMA.
Caratteristiche di Workload
Il maggiore sforzo nello sviluppo di software parallelo si ha nel progettare strumenti di base, come
compilatori e DBMS che traggono vantaggio dalla parallelizzazione; utilizzando questi strumenti
diventa semplice sviluppare software che sfrutta appieno la parallelizzazione.
Tipo Scopo Classi Esempi e
Commenti
Load Balancer, NQS/
Batch Exec, ecc.
Non sono richieste Interattive NCLOGIN, ecc.
Seriale Throughput modifiche nelle Boulder-size
applicazioni granularity: cioè jobs
Multijob parallelo separati in un
uniprocessore
Nessun HW seriale
Grand Challenge potrebbe farlo, quindi
non c'è scelta
Il parallelismo è il
futuro, e gli studenti
Ricerca diplomati sono
economici, intelligenti
e motivati
Un'altra soluzione è dividere il ciclo in due parti,e far elaborare prima le righe pari e
successivamente quelle dispari, oppure effettuare una divisione a scacchiera; in questo modo
ottengo gli stessi vantaggi di prima senza sprecare memoria.
Questi algoritmi però sono concettualmente diversi dall'algoritmo iniziale, e quindi portano a
risultati diversi perché compiono operazioni diverse.
L'algoritmo originale elabora per ciascuna cella due valori modificati e due valori non modificati.
Con questa soluzione il principio è lo stesso ma livello di parallelismo è tempovariante; inoltre con
questo algoritmo i dati sono posizionati in modo tale che il principio di località non è rispettato, e
quindi la cache diventa inutile.
Per poter sfruttare la cache posso eseguire l'algoritmo su dei blocchi quadrati della tabella, dentro ai
quali utilizzerò l'algoritmo originale seriale.
I dati sono memorizzati in modo contiguo; quindi per ogni blocco della tabella posso caricare in
cache una sola riga per volta, perché la successiva si troverà in un altro blocco di cache.
Tipologie
Lineare bidirezionale
I nodi sono connessi fra di loro in serie.
– Numero di nodi: N
– Diametro: N-1
– Diametro medio: 2/3 N
– Dimensionality: 1
– Bisection Bandwidth: 1*2 (un link bidirezionale)
Ring unidirezionale
È come la tipologia lineare, ma il primo e l'ultimo nodo sono collegati fra loro.
– Numero di nodi: N
– Diametro: N-1
– Diametro medio: N/2
– Dimensionality: 1
– Bisection Bandwidth: 1
Ring bidirezionale
– Numero di nodi: N
– Diametro: N/2
– Diametro medio: N/3
– Dimensionality: 2
– Bisection Bandwidth: 2*4
Albero binario
Un albero binario con N nodi (foglie) ha log2N livelli; quindi sono necessari
X
l o gn N N
con X= ; ∑ 2 switch per far comunicare i nodi fra loro.
l o g2 k =1 2 2
– Diametro: 2 log2N
– Bisection Bandwidth: 1
– Dimensionality: 1
Butterfly Network
Ipercubo
Ogni nodo ha dei vicini che si differenziano da lui solo per
un bit.
Routing
Esistono due algoritmi di routing che vengono usati per inoltrare dati e messaggi nelle reti di
interconnessione dei multi-computer:
– Virtual Cut-Through Routing: I pacchetti sono inviati in sequenza, e il pacchetto X viene
inoltrato prima che il pacchetto X-1 sia stato ricevuto; questo algoritmo viene spesso utilizzato
perché fornisce ottime prestazioni, in quanto si può utilizzare la velocità di trasferimento
completa. Questo algoritmo è implementabile solo se la velocità di trasferimento del
destinatario è maggiore o uguale a quella del mittente.
– Wormhole Routing: Questo algoritmo divide i pacchetti in pezzi più piccoli, detto flow unit;
quando viene instaurata una comunicazione i router intermedi ricevono la prima flow unit del
pacchetto, esaminano l'indirizzo e la instradano verso il successivo router; ciascuna flow unit
successiva, facente parte dello stesso pacchetto, seguirà la stessa strada della prima.
Tipi di routing
– Aritmetico: É un routing deterministico, il percorso viene calcolato mano a mano che il
pacchetto viene ricevuto dai router intermedi tramite semplici operazioni matematiche; è facile
da implementare e non soffre di deadlock, ma c'è il rischio di intasamento della rete (un esempio
è l'algoritmo usato nelle reti di interconnessione butterfly).
– Table Driven: I percorsi fra un nodo ed un altro vengono cambiati periodicamente e
memorizzati in tabelle, non è deterministico ma utilizza molte risorse e soffre di deadlock.
– Source Based: Il percorso viene stabilito dalla sorgente all'inizio della trasmissione, è non
deterministico ma la sorgente necessita di conoscere la mappa e lo stato di congestione della
rete, inoltre soffre di deadlock.
Per eliminare il deadlock negli ultimi due tipi si “vincolano” gli algoritmi, cioè si vietano alcuni
percorsi che potrebbero portare a deadlock.
Ecco un esempio di architettura NUMA ibrida; internamente è un'architettura NUMA con snooping
cache, esternamente è una CC-NUMA con SCI.
RAID 5
Questa versione di RAID è uguale alla versione 4 tranne per il fatto che non c'è più un disco
destinato a contenere i blocchi di parità, ma questi ultimi sono sparsi in tutti i dischi.
Questo accorgimento porta ad eliminare il collo di bottiglia dovuto al disco dedicato alla parità.
Avendo un disco dedicato alla parità si genera un collo di bottiglia perché non è possibile servire
richieste contemporanee, in quanto tutte le operazioni richiedono di accedere al disco di parità.
Sparpagliando fra i dischi i blocchi di parità con buona probabilità si possono effettuare richieste
contemporanee: ad esempio scrivere il blocco A contenuto nel disco 1 che ha parità nel disco 2, ed il
blocco B contenuto nel disco 3 che ha parità nel disco 4.
Architetture di storage
In un sistema distribuito le unità di
memorizzazione possono essere separate
dall'architettura di elaborazione, e possono
essere accedute in remoto come fossero file
system locali, oppure essere viste come
periferiche remote fornitrici di blocchi.
Myrinet:
Questa tecnologia di
interconnessione non ha una
tipologia predefinita, però
supporta il source routing;
Utilizza un crossbar-switch
e l'OS bypass per rendere
più veloce la comunicazione.
Availability
L'availability indica quanto un sistema è in grado di fornire un servizio; un sistema 100% available
non deve guastarsi mai. Per avere availability sono necessari:
– Ridondanza
– Backup
– Disaster recovery
Classi di availability
Numero Classe % di funzionamento Tempo di fermo tollerato
Classe 1 Fra il 90% ed il 99% Da 1 mese a 4 gg
Classe 2 Fra il 99% ed il 99,9% Da 4 gg a 9 h
Classe 3 Fra il 99,9% ed il 99,99% Da 9 h a 1 h
Classe 4 Fra il 99,99% ed il 99,999% Da 1 h a 5 min
Classe 5 Fra il 99,999% ed il 99,9999% Da 5 min a 3 sec
Cause di fermo macchina (outage)
– Planned: Upgrade, manutenzione, regulations (modifiche dovute alla legge).
– Unplanned: Fisiche (usura, rottura), design (bug del SW), environmental (rottura dell'impianto
elettrico o di condizionamento), operator (errore umano).
– Disaster (danneggia molti componenti): Naturali, umani non voluti, umani voluti.
Backup
Per effettuare un backup efficace bisogna sapere:
– Di quali informazioni fare il backup (dati, applicazioni, configurazione, DB, ecc.).
– Con quale frequenza (giornaliera, settimanale, ecc.).
– Per quanto conservare le copie (effettuare la rotazione dei supporti, dove conservarli, eliminare
quelli la cui vita utile è terminata, ecc.).
– Quando fare il backup (quando il sistema non deve erogare il servizio o il carico di lavoro è
basso, se non è possibile interrompere l'erogazione dei servizi bisogna considerare la possibile
inconsistenza dei dati).
– Se è maggiore il costo di down-time (interruzione) o il costo dovuto alla perdita dei dati.
Tipi di backup
– Full: salva tutti i dati.
– Incrementale: salva tutti i dati variati dall'ultimo backup (backup veloce, ripristino dei dati lento
perché possono essere stati salvati dati inutili).
– Differenziale: salva tutti i dati modificati dall'ultimo backup full.
È conveniente creare più copie di backup che vengono conservate in luoghi diversi, per evitare che
un disaster distrugga sia il sistema che il backup.
Cluster
Un cluster è un raggruppamento di calcolatori indipendenti ed economici che cooperano per
risolvere un problema; i calcolatori che compongono un cluster sono indipendenti perché se staccati
dagli altri possono continuare a funzionare autonomamente, e sono economici perché sono prodotti
“di serie” e a basso costo.
Gli obiettivi dei cluster sono fornire:
– Fault Tollerance: si usa spesso il termine RAIC (Redundant Array of Inexpensive/Independent
Computer).
– Scalabilità di costo: per aumentare il numero di nodi non è necessario acquistare hardware
dedicato, appositamente progettato, costoso, ma che può portare ad un decadimento di
prestazioni.
– Scalabilità di performance: Aggiungere nodi porta ad un aumento di performance notevole, se
si tralasciano i possibili colli di bottiglia dovuti all'HW non specializzato.
Classificazione: hardware
– Commodity: sono cluster in cui tanti elaboratori standard sono collegati fra loro, senza nessun
hardware appositamente creato, hanno prestazioni scarse ma costo limitato.
– Proprietary: sono cluster che usano componenti specifici (ad esempio una connessione di rete
ad alte performance) per eliminare i colli di bottiglia.
– Constellations: Cluster in cui ogni nodo è un sistema NUMA.
Classificazione: rete
– Exposed: Cluster per i quali un utente che accede tramite la rete dall'esterno riesce a vederne la
struttura.
– Enclosed: Cluster per i quali un utente che accede tramite la rete dall'esterno non riesce a
vederne la struttura; sono più usati perché forniscono maggiore fault tollerance: se un nodo si
guasta un altro nodo può prendere il suo posto in modo invisibile dall'esterno.
Classificazione: distribuzione geografica
– Campus wide: il cluster è formato da PC sparsi all'interno di un intero edificio, un esempio è un
cluster formato dai PC dei dipendenti, che vengono sfruttati per le elaborazioni durante i tempi
morti.
– Rack Mounted (Glass House): Tutti i nodi sono in formato Rack e sono contenuti in appositi
armadi all'interno di un'unica stanza, la maggior parte dei cluster esistenti sono fatti così.
Metodi di clustering
Metodi di clustering Descrizione Benefici Limitazioni
Passive standby Un server secondario Facile da implementare Alti costi perché il server
interviene nel caso il secondario non è
primario si guasti disponibile per altri usi
Active Secondary Il server secondario viene Costi ridotti perché il Maggiore complessità
usato anche come server secondario viene
elaboratore usato per altri scopi
Server separati I server hanno i loro Alta disponibilità Alto overhead di rete e
dischi. I dati sono del server dovuto alle
costantemente copiati da operazioni di copia
un server all'altro
Server connessi ai Ogni server è collegato ai Ridotto overhead di rete e Di solito richiede il
dischi dischi dell'altro. Se uno del server grazie mirroring o RAID per
cade i suoi dischi sono all'eliminazione delle compensare il rischio di
utilizzati dall'altro operazioni di copia rottura dei dischi
Server condividono i I server condividono Basso overhead di rete e Necessario gestire la
dischi simultaneamente del server. Ridotti rischi concorrenza. Di solito
l'accesso ai dischi di downtime dovuto al viene usato con disk
fail dei dischi mirroring o RAID
Ruolo Connessione Condivisione Accesso Visione Visione Visione
server dischi dati dati admin programmatore esterna
aggiuntivi
Passive Passivo Esterna No Any Separata Tradizionale Single
Standby
Failover Passivo Interna Replicazione Any Separata Tradizionale Single
Separate Attivo Interna Si (basse Read Separata Trad. o message Single o
server prestazioni) Only passing multi
Parallel Attivo Interna No Read Separata Trad. o message Single o
Cluster Only passing multi
Dischi Attivo Esterna No Any Single Trad. o message Single o
esterni passing multi
Shared Attivo Esterna Si RW Single Trad. o message Single o
disks passing multi
Load Balancing
Per evitare sovraccarichi ad un singolo server si utilizza la tecnica del load balancing; questa tecnica
consiste nel suddividere le richieste che pervengono ad un server fra più macchine in modo da
distribuire il lavoro ed evitare rallentamenti e sovraccarichi.
Il load balancing può essere effettuato in vari modi:
– Fatto dagli utenti: all'utente viene proposta una serie di mirror tra qui scegliere, e l'utente
normalmente sceglierà il server meno carico e con la maggiore velocità.
– Rotating DNS: Il server DNS associa più mirror allo stesso nome simbolico e ad ogni richiesta
ritorna l'indirizzo di un server diverso, compiendo una rotazione; oppure controlla quale server è
al momento meno carico e ritorna il suo indirizzo. Per funzionare il cluster deve essere exposed.
La soluzione precedente non è efficiente, infatti il load balancer fa due volte da collo di
bottiglia, infatti sia le richieste che le risposte passano attraverso di esso.
Una soluzione più efficiente è effettuare un tunnel IP (che consiste nell'aggiungere un secondo
header IP che ha come mittente l'indirizzo del load balancer e come destinatario l'indirizzo del
server), in questo modo il server conosce l'IP del client che ha effettuato la richiesta e può
rispondere direttamente, sgravando il load balancer dalla gestione delle risposte.
Grazie al tunneling si può effettuare anche il load balancing geografico, cioè smistare fra server
localizzati in posti diversi.
Il Load balancer conosce gli indirizzi MAC dei server, che sono collegati allo stesso ramo della
rete locale; il load balancer modifica l'indirizzo MAC dei pacchetti in ingresso e li smista ai
server a livello data-link, senza modificare l'header IP, in questo modo i server riconoscono
come proprio l'IP del load balancer e conoscono l'IP del client e quindi possono rispondere
direttamente.
Failover Failback
Il failover è una tecnica per garantire l'operatività di un cluster in caso di guasto di uno o più nodi.
Il failover prende varie forme, in base al tipo di cluster su cui viene applicato.
– Cluster passive standby: sostituzione del nodo guasto con un nodo “di scorta”.
– Cluster active secondary: distribuzione del carico di lavoro del nodo guasto fra quelli attivi.
Esistono vari tipi di failover a vari livelli:
Failover dati: può essere ottenuto introducendo replicazione e ridondanza nei dati (Multi attached
disk), oppure introducendo ridondanza nei collegamenti (rete con percorsi multipli SAN).
Failover comunicazione: in questo caso il cluster è visto come un'entità che comunica con degli
utenti.
– IP Failover: quando un nodo si guasta, se il cluster è enclosed il Load Balancer elimina dalla
tabella di natting il suo IP; se il cluster è exposed, e se la rete interna è configurata per
supportare gli IP dinamici, allora un nodo si prende carico del lavoro del nodo guasto e
risponde alle richieste che vengono sia dal suo IP che da quello del nodo guasto.
– Session Failover: quando un nodo si guasta si possono perdere i dati delle sessioni che lo
coinvolgono, una prima soluzione è quella di ignorare il guasto (se lo stato non è cruciale). Se
invece lo stato è cruciale non può essere perso; può essere salvato come dato permanente sul
server oppure può essere salvato sul client, con lo svantaggio di doverlo caricare sul server ad
ogni comunicazione.
Failover Applicazioni:
– Processi equivalenti: si generano dei processi uguali ma distinti su nodi diversi, cosicché in
caso di guasto di uno dei nodi il processo continui ad essere eseguito.
– Riavvio: se un nodo si guasta i processi su quel nodo saranno riavviati in un altro, richiede
tempi piuttosto lunghi.
– Process Mirroring: si tiene una copia dell'intero stato del processo in un altro nodo, oneroso
in termini di memoria e trasmissione.
Heartbeat: è un metodo per la rilevazione degli errori, il suo funzionamento consiste nel
controllare periodicamente lo stato dei nodi.
L'heartbeat ha diverse problematiche:
È un processo real-time che deve funzionare su una rete (internet o lan) che per definizione non è
real-time; questo porta a vedere delle “finte morti” in caso di eccessivi ritardi nella rete.
Un'altra problematica è che deve essere implementato su vari livelli con vari campi d'utilizzo; ad
esempio posso implementare l'heartbeat su link punto-punto, sul livello IP utilizzando il ping, a
livello del S.O. o a livello delle applicazioni per controllare il loro corretto funzionamento.
A causa di queste problematiche è necessario aggiungere nuove funzionalità anche a livello di S.O.
Paradigma client/server
Nel paradigma client/server vi è una distinzione di ruoli tra client e server.
Il client ha un ruolo attivo: inizia l'attività e manda richieste.
Il server invece ha un ruolo passivo: fornisce servizi, attende richieste e fornisce risposte.
É presente anche una distinzione di specializzazioni: il client è vicino all'utente, solitamente ha
un'interfaccia grafica e poche risorse hardware (potenza elaborativa e spazio di archiviazione); il
server al contrario spesso non ha un'interfaccia grafica ma in compenso ha abbondanti risorse
hardware.
A volte una stessa macchina può essere sia client che server.
Il client può essere di due tipi:
– Thin Client: Il client si occupa solamente di presentare all'utente le informazioni, sono
necessarie risorse hardware modeste.
– Fat Client: Il client si fa carico di una parte dell'elaborazione, è necessario che il client abbia
buone caratteristiche hardware che gli permettono di eseguire le elaborazioni con fluidità.
– Wiesberg (3 livelli).
Wiesberg ha notato che nel modello Gartner Group i primi due tipi possono essere raggruppati
in uno solo, mentre l'ultimo è indipendente dagli altri.
Remote Presentation: il client si
occupa solo di presentare i risultati (thin
client), può portare ad un sovraccarico
del server.
Distributed Logic: la logica viene
ripartita fra client e server.
Remote Data Access: Il server fa solo
da gestore dei dati (fat client).
Middleware
In queste architetture spesso capita che i nodi coinvolti utilizzino applicazioni e sistemi operativi
differenti, è quindi utile avere un'Application Logic standard che mascheri le differenze HW e SW
fra i nodi. Questo livello software prende il nome di middleware.
Il concetto di middleware può essere definito in modo vago come la “/” in client/server, cioè quello
che sta in mezzo fra il client e il server.
Il middleware fornisce un'interfaccia per le applicazioni (API) standard e le tramuta in richieste
standard per i server e viceversa.
Come nel paradigma client/server esistono tre classi di middleware che si differenziano in base al
livello in cui questo si colloca: il middleware può essere a livello di presentazione, di logica
applicativa, o a livello di gestione dei dati.
Il middleware, che si trova al livello applicativo del modello ISO/OSI, si preoccupa di rendere
standard le API verso le applicazioni sia del client che del server, le richieste verso il livello di
trasporto e le richieste tra due middleware distinti (middleware interaction).
Tipi di middleware
Esistono quattro tipi di middleware:
a) Message-oriented middleware:
fornisce il servizio base di scambio di
messaggi, a sua volta si divide in
– Socket (TCP/UDP): permette la
comunicazione diretta tramite
socket, è un middleware minimale.
– Message Queuing (MQ): permette
una comunicazione indiretta
tramite code asincrone.
b) RPC (Remote Procedure Call): si
basa sull'invocazione di procedure
remote, la comunicazione viene gestita
implicitamente dal linguaggio.
c) ORB (Object Request Brocker):
Simile all'RPC ma vengono invocati
oggetti remoti, viene utilizzato con i
linguaggi di programmazione ad
oggetti.
d) TPM (Transaction Processing
Monitor): Si pone fra il database ed il
software che lo utilizza.
Parameter marshalling
La stub converte i dati in un formato neutro (XDR, NDR, ...) per evitare problemi con architetture
diverse (ad esempio fra un architettura big endian ed una little endian, fra S.O. che usano set di
caratteri o rappresentazioni numeriche differenti). Una volta effettuato il marshalling si aggiungono
l'IP e la porta di destinazione, più altre informazioni utili nella gestione: il numero (standard) del
servizio RPC, il numero di versione del programma, il numero della procedura invocata dal
programma ed il numero di versione del protocollo RPC (due versioni diverse dello stesso RPC
possono associare numeri diversi alla stessa procedura).
Copy/Restore
Per passare i puntatori ad un server remoto si invia tramite la rete il valore del puntatore che il
server copierà nella casella della memoria locale corrispondente all'indirizzo puntato, una volta
ricevuta la risposta viene sostituito il valore del puntatore con il valore ritornato. Questa procedura
funziona finché non ci sono due puntatori allo stesso oggetto o strutture dati dinamiche.
Tipi di autenticazione nell'RPC
– None: nessuna, il messaggio è in chiaro e senza informazioni di identificazione.
– System: il messaggio è in chiaro ma contiene dei dati relativi all'identità del mittente o del
destinatario.
– Servizio esterno: L'autenticazione viene compiuta da un servizio esterno all'RPC, ciò permette
di avere sempre un sistema di autenticazione aggiornato senza dover modificare l'RPC.
IDL (Interface Description Language)
Definisce l'interfaccia (nel senso SW della stessa) delle procedure da chiamare. Esistono dei
compilatori per ricavare delle stub dagli IDL, ed esistono anche degli interpreti on-the-fly.
Localizzazione
Esistono due metodi per effettuare la localizzazione dei servizi RPC:
– Tutto statico: il client conosce a priori l'indirizzo del server.
– Registro/Brocker: il client cerca il server in un registro, offre maggiore flessibilità e semplicità
di gestione.
ONC-RPC (RFC 1831)
– Sincrono/asincrono: di solito l'RPC è sincrono cioè gli stub prima di proseguire aspettano la
risposta alla richiesta precedente, possono esistere RPC asincroni nei quali le stub effettuano
chiamate non bloccanti.
– Error handling: ci possono essere errori che in locale non si verificano o che in locale hanno
conseguenze diverse (ad esempio la divisione per zero che in remoto blocca solo il server,
bisogna quindi comunicare al client l'errore).
– Global Variables + Side effects: non si possono avere variabili globali e non si possono
sfruttare i side effects.
– Authorization/authentication: i client devono essere autenticati dal server, che hanno una lista
di client autorizzati a richiedere i loro servizi.
– Performance: le procedure remote sono ovviamente più lente di quelle locali.
– Livello di trasporto utilizzato: si possono utilizzare sia TCP che UDP, ma è consigliato UDP
perché non si preoccupa dell'affidabilità e dell'ordinamento dei pacchetti, quindi offre
handshaking veloce e header leggeri. Siccome le trasmissioni di RPC consistono in una richiesta
ed una risposta non hanno bisogno di ordinamento, l'affidabilità è garantita dalla trasmissione
sincrona e con il TCP avrei overhead maggiore dello stesso messaggio.
– Info nell'header: Identificazione procedura da chiamare (remote procedure number),
identificazione del contenitore di procedure (remote program number), remote program version,
altre informazioni che non riguardano la chiamata (corrispondenza richiesta/risposta sotto forma
di ID pseudocasuale, autenticazione in forma basilare e poco sicura).
Questa distinzione viene effettuata a livello applicazione, quindi è indipendente dal livello
di trasporto. Lo stato ha un costo di gestione (memoria occupata) e crea problemi in caso di
guasti (se un nodo cade bisogna modificare lo stato) ma porta informazioni che permettono
protocolli più leggeri e potenti.
3) Infrastruttura d'appoggio: Quali middleware, livello di trasporto e livelli inferiori usare.
4) Garanzie ai vari livelli della pila: ACK, ritrasmissione, timeout, heartbeat.
5) Autenticazione.
6) Molteplicità di client e server: possono verificarsi problemi di standardizzazione e race-
condition.
7) Gestione anomalie:
1. Il client non trova il server: messaggio all'utente, il programma non deve piantarsi.
2. Messaggi di richiesta vanno persi: il client ha un timeout allo scadere del quale
rispedisce.
3. Messaggi di risposta persi: in questo caso il client non sa se si è verificato 2. o 3. , quindi
rimanda la stessa richiesta. Se le istruzioni sono idempotenti la loro riesecuzione non
comporta problemi; se non lo sono invece il server deve ricordarsi delle richieste recenti,
quindi avere uno stato.
4. Cade il server: se lo stato è volatile allora viene perso e non si sa se cade prima della
richiesta o dopo la risposta; se lo stato è permanente non ci sono problemi.
Esistono 3 strategie: insistere fino alla risposta (at least once), è possibile che si attenda
all'infinito; rinunciare subito (at most once); timeout.
5. Cade il client: se il server ha stato rimangono memorizzati residui del client (orfani), si
prevede quindi un meccanismo di sterminio degli orfani. Può anche accadere che il
client si riavvii subito, e ricominci a mandare messaggi le cui risposte si confondono con
gli orfani; allora all'interno del timeout, dopo il quale si inizia lo sterminio, non possono
esserci due id ripetuti.
L'header ha 4 timestamp che indicano quando la richiesta è stata trasmessa, elaborata, spedita e
ricevuta; e tramite gli algoritmi è possibile stimare l'ora.
Sincronizzazione dei clock logici
In certi casi è sufficiente preservare la relazione “accade prima” tra degli eventi di cui sono sicuro
dell'ordine temporale. Si usa l'Algoritmo di Lamport che quando arriva una trasmissione imposta
l'orologio del destinatario al tempo di invio del messaggio aumentato di 1.
Mutua esclusione
Per garantire la mutua esclusione nel caso due nodi debbano accedere ad una risorsa condivisa, si
può nominare un coordinatore che gestisce gli accessi a questa risorsa; diventa però un collo di
bottiglia e single point of failure.
Un'altra soluzione è quella di implementare il classico token ring; in questo caso se uno dei nodi
cade l'anello si apre ed il token può andare perso.
Deadlock distribuiti
Per gestire i deadlock distribuiti si possono prendere quattro strade:
La prima è quella di ignorarli.
La seconda è quella di renderli impossibili logicamente:
– wait and die
I processi sono ordinati in base alla loro età (si usa Lamport per sincronizzare le età dei
processi). Quando un processo A possiede una risorsa ed un altro processo B la richiede possono
capitare due cose: se B è più vecchio di A, si mette in attesa che venga rilasciata e più rimane in
attesa più ringiovanisce; se B è più giovane di A, muore. In questo modo i cicli sono impossibili.
– wond wait
Anche in questo caso possono capitare due cose: se B è più vecchio di A, effettua la prelazione
sulla risorsa; se B è più giovane di A, si mette in attesa e più aspetta più diventa vecchio. I cicli
sono impossibili.
La terza strada è quella di prevenirli durante l'esecuzione, ma non è una strada praticabile.
La quarta è rilevarli:
– Algoritmo con coordinatore
Esiste un coordinatore che gestisce le risorse, è possibile che il coordinatore rilevi falsi stalli: se
il processo C richiede la risorsa S e contemporaneamente A comunica al coordinatore che ha
rilasciato S, se il messaggio di A arriva dopo il messaggio di B il controllore pensa che sia
avvenuto un deadlock distribuito fra la macchina 0 e la macchina 1.
Se ad un processo arriva un messaggio con il primo e l'ultimo nome uguali significa che è in
atto un deadlock, anche qui è possibile rilevare falsi deadlock.
Distributed snapshot
Si fa una fotografia dello stato distribuito, in questo modo però si perdono le informazioni sulla
parte dinamica, come i messaggi in viaggio in quel momento; questo può portare ad ignorare i
messaggi in transito, oppure a contarli due volte, se gli orologi non sono sincronizzati.
Per permettere il riconoscimento e l'isolamento del nodo traditore il numero dei nodi totale deve
essere maggiore di tre volte il numero dei traditori.
Replicazione
La replicazione può essere sincrona; oppure asincrona, cioè esiste una finestra temporale in cui le
copie non sono uguali.
La replicazione asincrona si divide in:
– Near Real-Time: esiste una finestra temporale molto piccola.
– Event driven (planned): il momento in cui eseguire le copie è pianificato (ad esempio una
volta al giorno).
– On demand.
La replicazione può essere suddivisa secondo altri criteri:
1. Creazione delle repliche:
- di gruppo: la creazione è sincrona.
- lazy: si crea la prima copia e poi si propaga in modo asincrono.
2. Modifica:
- Read one primary: ogni lettura è sempre fatta sulla copia primaria, le
altre sono di backup.
- Read one: le copie sono tutte uguali e si può leggere da una qualsiasi.
- Read quorum.
- Write one primary: ogni scrittura è sempre fatta sulla copia primaria, poi si propaga alle
altre in modo lazy; la propagazione lazy ha l'inconveniente di non funzionare se la copia
primaria diventa irraggiungibile (guasto).
- Write all: scrivo su tutte le copie, in caso una non sia disponibile devo aspettare (anche
all'infinito) che lo diventi.
- Write all available: come la write-all ma ha un timeout.
- Write quorum.
- Write gossip: consiste in una write one primary in cui la copia primaria è scelta a caso, è
inaffidabile.
Quorum
Esistono due tipi di quorum:
– Nr (quorum di lettura), un dato è valido se ci sono almeno Nr copie uguali.
– Nw (quorum di scrittura), la scrittura termina se sono state scritte Nw copie.
Questi due valori devono rispettare le seguenti condizioni:
– Nr+Nw >Ntot, cioè deve accadere che almeno una lettura avvenga su un dato già scritto, in
modo da rendere impossibile che vengano lette solo copie non ancora modificate dalla scrittura.
– Nw>N/2, cioè devo scrivere almeno la metà più uno.
Name Service
Il Name Service è un servizio che offre uno spazio dei nomi, dei meccanismi di localizzazione e
traduzione, e un'infrastruttura informativa per immagazzinare i nomi esistenti.
Le tabelle dei DNS sono formate da Resource Record: la prima colonna indica il nome della
risorsa, la seconda la scadenza in secondi dell'informazione, la terza il tipo di rete (l'unica utilizzata
è IN che sta per Internet), la quarta il tipo di record e la quinta il valore del record.
L'header è composto da
ID Campo di 16bit
QR Bit che indica se è una richiesta o una risposta.
AA Bit che indica se la risposta arriva da una cache o da un authority.
RD Recursion desired, indica che è preferibile la modalità ricorsiva.
RA Recursion available, indica che è disponibile la modalità ricorsiva.
NetBios
É nato per condividere file e stampanti nelle reti locali senza bisogno di configurazione, NetBios è
l'interfaccia standardizzata verso le applicazioni (SMB).
Servizi NetBios
– Session Service: simile al TCP, fornisce scambio di messaggi full-duplex ordinato con ack.
– Datagram Service: simile all'UDP, invio di datagrammi inaffidabile, senza connessione, non
ordinato.
– Name Service: Name Space non gerarchico a 16 caratteri; siccome non è gerarchico due client
non possono avere lo stesso nome anche se sono in due workgroup diversi (i workgroup sono
solo uno stratagemma di visualizzazione).
All'inizio le comunicazioni erano effettuate in broadcast, perché questo sistema non richiede
gestione e centralizzazione e funziona anche da metodo di mutua esclusione. Successivamente,
a causa della sua inefficienza, sono stati introdotti i NetBios Name Server (WINS); i WINS non
supportano però un sistema gerarchico dei nomi, quindi i nomi devono rimanere univoci e
l'elenco deve quindi essere replicato in ogni server WINS, con conseguente spreco di risorse;
inoltre per propagare le modifiche si rischia di sovraccaricare la rete. Per questi motivi questo
sistema non è scalabile e non può essere usato efficientemente in reti di grandi dimensioni.
Esecuzione Remota
Con il termine esecuzione remota si intende sia la fornitura di servizi remoti, sia l'esecuzione di
codice remoto.
Remote Service:
Un server fornisce dei servizi remoti che permettono di eseguire sul client dei comandi presenti sul
server; alcuni di questi servizi sono: RPC, RSH, Comandi FTP, Telnet e SSH.
Remote Execution:
Un server permette ai client di eseguire dei programmi che risiedono su di esso. Questo tipo di
esecuzione remota richiede: location indipendance, cioè il codice deve poter essere eseguito
indipendentemente in locale ed in remoto; I/O e comunicazioni devono essere implementate nel
codice in modo funzionare sia se il programma viene eseguito in locale, sia se viene eseguito in
remoto; portabilità del codice, per eseguire il software in remoto quando il client ha un S.O.
diverso dal server.
Migrazione
Per migrazione si intende lo spostamento di un processo o di una parte di esso da un processore ad
un altro. Quando un processore è sovraccarico alcuni processi migrano dalla sua coda a quella di un
altro processore per bilanciare il carico del sistema, vediamo in dettaglio la migrazione nei più
diffusi tipi di sistemi multiprocessore.
a) Sistema multiprocessore.
b) UMA.
c) Cluster; la migrazione in questo caso
richiede un costo , bisogna capire se in
questo caso conviene migrare
confrontando il costo e la differenza di
prestazioni.
– Receiver Initiated:
Quando un processore ha poco lavoro comunica in broadcast la sua disponibilità a ricevere
processi; questa soluzione ha il vantaggio di eliminare il thrashing ma l'invio di molti messaggi
broadcast può intasare la rete.
– Coordinatore:
Il coordinatore conosce il carico di ogni processore e gestisce la migrazione; questo è
l'algoritmo migliore ma sorge il problema che il controllore diventa un collo di bottiglia e single
point of failure.
Grid Computing
Grid viene tradotto con “rete elettrica”; l'obiettivo del grid computing è far arrivare tutta la potenza
di calcolo necessaria al sistema in modo trasparente all'utente, come la corrente elettrica arriva alle
apparecchiature.
Il sistema comunica con un middleware che cerca un nodo libero, gli invia i dati e li riporta al client
una volta elaborati.
NFS
Il protocollo NFS è basato su RPC, utilizza un formato XDR per i file ed il protocollo UDP per le
comunicazioni.
Di solito una stessa macchina è sia server che client NFS, perché sia condivide file sia vede file
remoti.
Metodi per montare directory remote
Una macchina può montare una directory remota nel proprio albero locale delle cartelle:
– al boot: se la macchina remota è spenta il boot fallisce, viene utilizzato solo per effettuare il
boot del S.O. via rete.
– a mano.
– automount: la cartella viene montata la prima volta che si tenta di accedere.
Cascading mount
La tecnica del mount a cascata consiste nel montare una directory remota all'interno di una directory
remota; si possono avere più livelli di directory remote annidate.
No transitive mount
Il transitive mount si ha quando viene montata una directory remota che a sua volta contiene un
riferimento ad un'altra directory su una terza macchina. Questa possibilità viene vietata per ragioni
di sicurezza: la directory sulla terza macchina, che non è considerata affidabile, non viene montata
nell'albero locale delle directory.
NFS Lookup
Viene effettuato per accertarsi che un file su cui si vuole lavorare esista e per creare un
collegamento ad esso.
Remote Operations
NFS 2
È stata la prima versione di successo, è definita in una RFC di 28 pagine ed usa server stateless ed
idempotenti, non prevede caching quindi ogni operazione viene eseguita immediatamente.
Include procedure per leggere, scrivere ed ottenere attributi; il lookup restituisce un handle (un
numero identificativo con valenza illimitata che viene utilizzato per identificare la transazione).
L'autenticazione molto debole: il client dichiara un nome utente ed il server verifica in una tabella le
autorizzazioni dell'utente. Si può utilizzare un metodo di autenticazione esterno.
NFS 3
Definito in una RFC di 127 pagine, è una revisione di NFS2.
Vengono aggiunti il concetto di stato “non troppo critico” (anche se rimane stateless) ed il
caching lato server.
In caso il server effettui caching e ritardi le operazioni di modifica si avvisa il possibile pericolo.
NFS4
Definito in una RFC da 213 pagine, le novità introdotte in questa versione sono:
– server statefull.
– operazioni di open e close.
– la concorrenza viene gestita con lock (a livello di range di byte).
– Viene gestito lo stato della cache del client: si usa il meccanismo di delegation e recall, cioè
quando un client prende dei dati dal server effettua una delegation ed il server si ricorda che il
dato è posseduto da esso. Se un altro client effettua modifiche su quel dato il server invia una
recall ai client associati con quel dato per comunicare che il dato nella loro cache non è più
valido.
Funzionamento dinamico
È necessario che ciascun calcolatore della rete possa comunicare via broadcast con almeno un
server DHCP. Ogni client all'accensione invia una richiesta DHCP in broadcast identificandosi
tramite il proprio indirizzo MAC, il server risponde comunicandogli gli IP disponibili ed i parametri
di configurazione della rete; a questo punto il client sceglie un IP e chiede al server conferma, una
volta che il server ha confermato la transazione termina. Quando il client si disconnette invia un
segnale di release che comunica al server la disconnessione; per evitare il problema degli orfani gli
IP hanno una scadenza entro la quale vanno rinnovati (gli orologi di server e client devono essere
sincronizzati, per evitare problemi il rinnovo viene effettuato un po' prima della scadenza).
Messaggio Descrizione
Get-request Richiede il valore di una o più variabili.
Get-next-request Richiede il valore della variabile successiva.
Get-bulk-request Richiede una tabella grande.
Set-request Aggiorna una o più variabili.
Inform-request Messaggio da gestore a gestore per descrivere il MIB locale.
SnmpV2-trap Segnalazione di trap da agente a gestore.
Questo protocollo si basa su UDP e può utilizzare un qualsiasi metodo di autenticazione. Sono
previsti i Proxy Agent, cioè dei software che convertono SNMP in protocolli proprietari per
comunicare con periferiche che non supportano SNMP.
Oggetti MIB (RFC 1156) Esempi MIB
● Sistema ● System (molto semplice)
● Interfacce ○ sysDescr (descrizione testuale)
● Traduzione degli indirizzi ○ sysObjectID (Codice prodotto)
● IP ○ sysUpTime (tempo da “last reboot”)
● ICMP ● ICMP: 26 dati statistici
● TCP ○ # totale messaggi ICMP
● UDP ○ # di quelli errati
● EGP ○ # per tipo
● e via complicando...
Directory Service
Un Directory Service permette di gestire delle informazioni su qualsiasi tipo di dati organizzabili ad
albero.
Lo standard X.500 (DAP, Directory Access Protocol) prevede la presenza di DSA (Directory
System Agents), DIT (Directory Information Tree) e “classi” di informazioni associabili a soggetti.
Esistono entries con un tipo ed un nome unico, il tipo identifica la classe di appartenenza, il nome
identifica l'oggetto ed è univoco.
Ogni entry ha un DN (Distinguished Name, cioè il path a partire dalla cartella radice) ed un RDN
(Relative DN, cioè il nome del file senza il path).
Questo standard non è stato usato per il DNS perché è molto pesante.
Posta Elettronica
Client SMTP Server SMPT Server pop3/ Client
posta relay posta imap posta
Il server relay deve essere un server fidato, in caso non si ritenga fidato lo si può escludere inviando
i messaggi direttamente dal client al server di posta.
Protocollo SMTP (Simple Mail Transfer Protocol):
È il protocollo standard per l'invio di e-mail fra i mail server, e viene utilizzato anche per l'invio di
mail da client al mail server. Le comunicazioni SMTP avvengono tramite comandi testuali, ed i
messaggi sono trasmessi in chiaro e con codifica ASCII a 7 bit; non è previsto il controllo delle
credenziali dell'utente.
MIME (Multipourpose Internet Mail Extension):
Questo standard è stato definito per colmare alcuni difetti dell'SMTP, permette infatti di gestire le
lingue esotiche e gestire gli allegati. Ciascun messaggio MIME è composto da varie MIME
Entities, ognuna delle quali e composta da:
– Content: è formato da un tipo e un sottotipo; ad esempio text, image, audio, video; i sottotipi
non standard hanno il nome che inizia per X.
– Encoding: può essere:
– Base, ASCII a 7 bit come nell'SMTP.
– Quoted Printable, ASCII con l'aggiunta di alcuni caratteri non comuni che sono codificati
nella forma ”=C1C2” dove C1 e C2 sono due numeri esadecimali.
– Base64, in questa codifica è stato creato un alfabeto di caratteri a 6 bit; quando si trasmette il
file viene suddiviso in gruppi da 3byte che sono convertiti tramite l'alfabeto a 6bit in 4
caratteri a 6bit; a questo punto vengono aggiunti a ciascun carattere 2 bit non significativi e
viene trasmesso con codifica ASCII, quindi i messaggi trasmessi in Base64 hanno una
dimensione maggiore del 33% rispetto ai normali messaggi ASCII.
– ID, descrizione e contenuto.
POP Vs IMAP
Entrambi sono protocolli per la ricezione di mail. Il protocollo POP è pensato per i fat client, infatti
il client scarica la posta ed esegue tutte le operazioni in locale senza coinvolgere il server, l'IMAP
invece per i thin client perché la posta rimane sul server, il quale si preoccupa anche di eseguire
tutte le operazioni. Entrambi si basano su TCP.
Il funzionamento del protocollo POP si divide in tre fasi:
– autenticazione.
– accesso al maildrop.
– invio di comandi al maildrop (stat, list, retr, dele, rset).
L'IMAP ha un maggior numero di comandi rispetto al POP, ad esempio può organizzare la posta in
cartelle e cercare nella posta.
HTTP
Versione 1.0: RFC di 60pagine scritte da W3C. Questa versione è stateless e basata su
richiesta/risposta, nonostante ciò si basa su TCP e viene aperta una connessione per ciascuna risorsa
(testo, immagini, ecc...) da trasferire.
Sono previste tre azioni effettuabili dal client:
– Get: prendere una risorsa.
– Head: prendere l'intestazione di una risorsa.
– Post: il client deve inviare informazioni al server.
Ciascuna risposta è formata da una linea di stato, da un header e dal body (usa MIME). Non è
prevista autenticazione, e vengono usati HTML, URI (Uniform Resource Identifier, un modo di
descrivere risorse tramite stringhe) ed URL (Uniform Resource Locator, è un URI particolare che
contiene modalità di accesso).
Versione 1.1: Introduce le Persistent Connections e le Outstanding Requests (pipelining delle
richieste), supporta il caching lato client con scadenza (quindi utilizza il write through), introduce le
azioni put, delete, option e trace.
Programmazione Web
Lato client: Le pagine contengono qualcosa di eseguibile (javascript, applet, flash,...).
Lato server: Le pagine sono generate da un programma prima di essere spedite al client.
– CGI (Common Gateway Interface): standard per l'interfacciamento fra server e programmi
esterni, se un client invoca un programma CGI il server lo esegue e invia al client la pagina
generata dinamicamente dal CGI.
– Linguaggi interpretati (php,asp,...): Le pagine HTML hanno inserti di codice che vengono
interpretati dal server prima di inviare la pagina, funziona bene per problemi di complessità
limitata.
– Architetture complesse (J2EE, .NET,...).
Per il funzionamento di tutte queste applicazione è necessario il concetto di stato, che HTML non
ha, si crea quindi il concetto di “sessione”. Sul server vengono memorizzati la sessione (che
contiene lo stato del client) ed il suo ID, ogni volta il client invia l'ID della sessione in modo che il
server possa conoscerne lo stato.
Il server può ricevere l'ID di sessione tramite:
– Cookie: File di testo contenente l'ID di sessione che il server deposita sul client e che il client
rimanda al server. Esistono quattro tipi di cookie: persistenti, cioè con una scadenza; non
persistenti, cioè che vengono cancellati alla chiusura del browser; locali, cioè provenienti dal
server che si sta visitando; e third party, cioè provenienti da un server diverso da quello che si
sta visitando (vengono utilizzati per monitorare e registrare i siti visitati dagli utenti).
– URL Rewriting: l'ID di sessione viene inserito in tutti i link della pagina, così che per ogni
pagina inviata il server conosce l'ID della sessione relativa al client che l'ha richiesta.
WEB SERVICE
Definizione di Web Service:
Un Web Service è un software che rende se stesso disponibile su internet e usa un sistema di
messaggi basato sullo standard XML.
Un Web Service può avere un'interfaccia pubblica definita con comune grammatica XML.
L'interfaccia descrive tutti i metodi disponibili al client e specifica la firma di ciascun metodo. La
definizione delle interfacce è specificata tramite il Web Service Description Language WSDL.
Esistono dei semplici meccanismi per pubblicizzare la creazione di un Web Service e per
localizzare il Service e la sua interfaccia pubblica. Essi sono disponibili via UDDI (Universal
Description, Discovery and Integration).
Lo stack protocollare di un Web Service consiste principalmente in quattro aree:
– Service Transport: È responsabile del trasporto di messaggi fra applicazioni in rete ed include
protocolli come HTTP, SMTP, FTP e BEEP (Block Extensible Exchange Protocol).
– XML Messaging: È responsabile di codificare i messaggi in un formato XML comune, così che
possano essere compresi da tutti i dispositivi in rete. Questa area include protocolli come XML-
RPC, SOAP e REST.
– Service Description: È usato per descrivere l'interfaccia pubblica di un Web Service, viene
comunemente usato il protocollo WSDL.
– Service Discovery: Centralizza i servizi in un registro comune, così che il Web Service possa
pubblicare la loro locazione e descrizione, e rende più semplice scoprire quali servizi sono
disponibili in rete. Normalmente l'API UDDI è utilizzata per il service discovery.
Concettualmente è uguale a CORBA, ma è più pesante; si basa su RPC.
La differenza fra RPC e un Web Service è XML, che è parte integrante del Web Service e fornisce
un linguaggio comune per descrivere le chiamate a procedure remote, i servizi e la Web Service
Directory.
Il client fa una richiesta HTTP che viene trasformata in un oggetto dall'HTTP servlet request.
Questo oggetto viene elaborato e viene prodotta una risposta sotto forma di oggetto (applicando il
Business Tier Database) che viene trasformata a sua volta in una richiesta HTTP e inviata al client.
Lo schema è completamente basato su servlet.
Per lo sviluppatore è più comodo integrare codici nell'HTML (JSP). Le JSP vengono trasformate in
servlet ed eseguite.
SICUREZZA
Tipi di minacce:
Requisiti:
Per definite una trasmissione sicura, essa deve soddisfare quattro requisiti fondamentali:
– Segretezza o riservatezza dei dati.
– Autenticità.
– Integrità.
– Non disconoscimento, cioè l'autore della trasmissione deve essere identificabile univocamente
in modo che non possa negare di aver inviato il messaggio.
Tecniche di crittografia:
M EK C Dk D
plaintext ciphertext plaintext
– Sostituzione.
Per sapere se un algoritmo di cifratura è veramente robusto deve essere reso pubblico; in questo
modo dovrà resistere a degli attacchi da parte di persone che conoscono perfettamente la struttura
interna dell'algoritmo. L'unica cosa che deve rimanere segreta è la chiave.
Tipi di attacco:
Il tipo di attacco possibile varia in base ai pezzi di trasmissione che l'attaccante riesce ad
intercettare:
– Solo ciphertext: l'attaccante conosce l'algoritmo esatto e conosce il contenuto in maniera
approssimativa; per risalire al plaintext può effettuare brute force oppure un analisi statistica.
– Plaintext e ciphertext: l'attaccante cerca di risalire alla chiave.
– Chosen plaintext e ciphertext: approfittando di una connessione cifrata lasciata aperta
l'attaccante invia messaggi predefiniti ed intercetta gli stessi messaggi cifrati.
– Chosen ciphertext e plaintext: l'attaccante modifica un file cifrato e osserva le modifiche che
subisce il file una volta decifrato.
Tipi di algoritmi:
– A chiave simmetrica (privata): In questi algoritmi la chiave per cifrare e per decifrare è la
stessa, l'autenticità è verificata solo se la chiave è conosciuta solo da mittente e destinatario;
mentre non è verificato il non disconoscimento in quanto la chiave è conosciuta da due soggetti.
Il problema principale è come scambiarsi la chiave in modo sicuro.
– A chiave asimmetrica (pubblica): Il meccanismo dipende da due chiavi tali che un file cifrato
con una possa essere decifrato solo con l'altra, e tali che sia impossibile risalire ad una chiave
conoscendo l'altra.
L'utente genera due chiavi: una privata ed una pubblica; la chiave privata la tiene segreta mentre
la pubblica la rende disponibile a tutti.
Quando vuole mandare un messaggio cifrato ha due possibilità:
1. Cifrare con la sua chiave privata: in questo modo chiunque può decifrare il messaggio grazie
alla sua chiave pubblica che ha reso disponibile; il messaggio non è segreto ma è autentico,
integro e non ripudiabile.
2. Cifrare con la chiave pubblica di un altro: in questo caso l'unico a poterlo decifrare è il
proprietario della chiave pubblica, tramite la sua chiave privata; in questo caso l'unico
requisito soddisfatto è la segretezza.
Combinando questi due metodi (cifrando due volte) si possono verificare tutti e quattro i
requisiti, al prezzo di avere un algoritmo pesante; l'algoritmo a chiave asimmetrica più famoso è
l'RSA.
Spesso vengono utilizzati entrambi gli algoritmi per effettuare una trasmissione cifrata: si generano
delle chiavi simmetriche di sessione, che vengono scambiate con un algoritmo a chiave
asimmetrica; in questo modo la chiave simmetrica viene scambiata in sicurezza, e si può
successivamente usare il più efficiente algoritmo a chiave simmetrica per cifrare la trasmissione.
HASH FUNCTION
Queste funzioni ricevono in ingresso una sequenza di bit arbitraria e producono in uscita una
sequenza di bit di lunghezza fissata.
M, lunghezza arbitraria F(X) Message Digest, lunghezza 128bit
Queste funzioni non sono invertibili e non esistono due ingressi diversi che producono lo stesso
Message Digest.
Gli algoritmi più diffusi sono:
– MD5: digest di 128bit
– SHA-1: digest di 160bit
– RIPEMD-160: digest di 160bit
– HMAC: usa una hash function a scelta più una chiave segreta
Firma digitale:
Permette di inviare messaggi autentici, ma non segreti; funziona così:
1. Il mittente genera l'MD del messaggio che vuole firmare.
2. Il mittente cifra il MD con la sua chiave privata.
3. Viene trasmesso il messaggio con allegato il MD cifrato.
4. Il destinatario riceve il messaggio e l'MD cifrato.
5. Il destinatario decripta il MD con la chiave pubblica del mittente.
6. Il destinatario calcola l'hash del messaggio.
7. Il destinatario confronta il MD ottenuto dal messaggio con quello inviato.
Se i due MD coincidono il messaggio non è stato alterato, inoltre l'autenticità è garantita dalla
cifratura asimmetrica.
La firma digitale viene utilizzata per distribuire le chiavi pubbliche.
AUTENTICAZIONE
Replay Attack:
Un trasferimento cifrato può essere intercettato, e essere successivamente rimandato più volte,
anche senza essere riusciti a decifrarlo. Questa possibilità deve essere impedita per evitare problemi
(come l'invio di più richieste di trasferimento di fondi), servono dei meccanismi che garantiscano la
“freschezza” dei messaggi.
Meccanismi di freschezza:
– time stamp: la data dell'invio è inserita nel messaggio.
– nonce: un numero random inserito nel messaggio.
Metodi di autenticazione:
R è il nonce, K è la chiave condivisa. Il problema è come condividere la chiave in sicurezza.
Questa è una versione ottimizzata dell'algoritmo precedente in cui è ridotto al minimo il numero di
trasferimenti effettuati.
Esempio di reflection attack. L'attaccante apre due sessioni identificandosi come Alice; nella prima
invia un nonce generato da lui; nella seconda invia il nonce di Bob ricevuto nella prima sessione, ed
in risposta ottiene il nonce di Bob criptato con la chiave condivisa fra Alice e Bob; a questo punto
utilizza questa chiave per chiudere la prima sessione ed autenticarsi come Alice.
Esempio di attacco Men In The Middle: Trudy decifra i messaggi in ingresso e cifra quelli in uscita,
in entrambi i sensi; così Alice e Bob hanno l'impressione di parlarsi direttamente.
Alice invia il contenuto del messaggio 2, ottenuto interagendo con il KDC, a Bob come prova di
autenticità; la chiave di sessione Ks viene generata dal KDC.
Funzionamento del protocollo Kerberos: Kerberos è basato su KDC, per reti di grandi dimensioni
sono previsti due KDC, il primo svolge il ruolo di Authentication Server (AS), il secondo Ticket
Granting Server (TGS).
Alice comunica con il AS che le fornisce la chiave di sessione per parlare con il TGS al quale, dopo
aver comunicato un timestamp K(t) per garantire la freschezza, chiede un'altra chiave di sessione
che userà per comunicare con Bob; il TGS le comunica sia la chiave di sessione KAB che una prova
di autenticità KB(A,KAB).
IPSEC
IPSec è la versione sicura del protocollo IP, può garantire che il messaggio abbia segretezza,
autenticità, oppure entrambe.
Tipi di funzionamento Modo Trasporto Modo Tunnel
Funzionamento:
Si comprimono i messaggi per togliere la ridondanza e le proprietà statistiche del testo, per rendere
più difficile la decifratura (MAC=MD generato con una chiave particolare).
Initialization Vector: serve a perturbare la sequenza dei blocchi: la cifratura di un blocco dipende
anche dal blocco precedente, quella del il primo blocco dipende dall'inizialization vector.
Firewall
Quando si sceglie o progetta un firewall bisogna effettuare delle scelte riguardo a:
– Tipo di firewall (hardware o software).
– Statefull o stateless: un firewall stateless esamina i pacchetti singolarmente, ed in genere è più
performante e robusto, un firewall statefull tiene in memoria le connessioni TCP aperte e può
quindi accorgersi se un pacchetto non è richiesto, è più completo ma meno performante.
– Livello ISO/OSI nel quale opera: Se opera al livello 3 o 4 controlla solo gli header di questi
due livelli. La decisione di far passare o meno un pacchetto viene presa analizzando:
● L'indirizzo IP sorgente: contenuto nell'header IP.
● L'indirizzo IP destinazione: contenuto nell'header IP.
● Il tipo di protocollo: l'header IP specifica se i dati incapsulati nel datagramma appartengono
al protocollo TCP, UDP o ICMP.
● Porta sorgente: contenuta nell'header TCP o UDP.
● Porta destinazione: contenuta nell'header TCP o UDP.
● Bit di ACK: contenuto nell'header TCP, specifica se il pacchetto è l'acknowledgment di un
pacchetto TCP ricevuto.
È facilmente aggirabile cambiando la porta di default del protocollo applicativo (redirigere sulla
porta 80).
Se opera al livello applicazione prende il nome di Proxy e permette di controllare anche gli
header di livello applicativo e può quindi distinguere che tipo di dati vengono trasferiti; la
connessione viene spezzata in due ed il client si collega al proxy il quale si collega al server, il
proxy può anche svolgere le funzioni di NAT, cache, ecc. Il proxy può essere non trasparente, se
il client è configurato per passare dal proxy, oppure trasparente se non è necessaria alcuna
configurazione.
I firewall funzionano in entrambe le direzioni, perché se una macchina è infetta il firewall deve
proteggere il resto della rete da quella macchina.
Architetture di Firewall
Screening Router: Lavora al livello 3-4 del modello ISO/OSI.
Firewall
Rete Locale Screening Router Internet
Architetture miste: Esiste un router che effettua l'IP forwarding (client e server comunicano
direttamente) solo su alcune porte; tutte le connessioni che sono bloccate dal router vengono girate
ad un proxy (Screened host) il quale le controlla a livello applicativo e decide se farle passare
oppure bloccarle, il proxy è l'unico abilitato all'IP forwarding per quei tipi di traffico.
Se ci sono dei server che devono offrire dei servizi devono esistere delle regole specifiche che
permettano alle macchine esterne alla rete di comunicare con i server.
Si usano due proxy, uno esterno che fa passare le connessioni verso i server, ed uno interno che le
blocca; in questo modo si crea una rete perimetrale (demilitarized zone DMZ) alla quale si può
accedere dall'esterno, ed una rete protetta che è inaccessibile, i server vengono inseriti della DMZ,
le altre macchine nella rete interna.
Metodi di attacco
– Scanning o fingerprinting: Sono due metodi per ottenere informazioni sulla rete che si vuole
attaccare; come indirizzi IP, porte aperte, Sistemi Operativi installati nelle macchine della rete,
servizi offerti (server web, mail, ecc.).
Dumb scanning: Si utilizza se si vuole effettuare scanning su un server A senza essere
individuati; per effettuarla si identifica un altro server B, soggetto a poco traffico, e si inviano
una serie di richieste ping. A questo punto si invia una richiesta di connessione (SYN) verso la
porta di A che si vuole controllare, modificata in modo da sembrare inviata da B. Se la porta è
aperta il server A invierà un pacchetto SYN/ACK a B, il quale risponderà a sua volta con un
messaggio SYN/ACK. L'aggressore individua l'avvenuta risposta sotto forma di un incremento
maggiore di 1 nel parametro ID delle risposte ICMP relative alle sue richieste di ping. Se la
porta è chiusa invece A risponderà con un pacchetto RST/ACK, che sarà ignorato da B.
– Sniffing: Consiste nel controllare la rete locale alla quale si ha accesso per ottenere
informazioni, viene spesso utilizzato per ottenere le chiavi di protezione delle reti wireless.
Lo sniffing può essere identificato tramite:
1. Ping con IP vero e MAC falso, quando una scheda di rete effettua sniffing risponde alle
richieste di ping anche se il MAC nella richiesta non corrisponde al proprio.
2. Informazioni ARP broadcast: si inviano in broadcast le informazioni riguardanti un server,
dopodiché si controllano le connessioni effettuate, se un client effettua una connessione
senza fare una richiesta ARP significa che ha ricevuto l'informazione in broadcast e quindi
sta sniffando.
3. Trappola (false coppie utente/password): si finge un collegamento con una password fasulla
in chiaro, se viene effettuata una connessione con quella password è sicuramente stata fatta
da uno sniffer.