Gestione delle parti corrotte
|
eMule usa diversi sistemi per assicurare che i file sulla rete vengano
condivisi e scaricati senza errori. Nel caso si verifichino degli errori
(evento non totalmente eliminabile ) utilizzerà alcune
funzioni avanzate per cercare di correggerlo ed allo stesso tempo scaricare
nuovamente una
quantità di dati minima. File Hash e ICH - Intelligent Corruption Handling
Per ogni file condiviso in rete viene creato un valore identificativo
unico usando l'algoritmo matematico di crittografia chiamato MD4. Questo
valore è chiamato file hash e viene inserito in ogni collegamento eD2k
ad esempio
ed2k://|file|name|12043984|6744FC42EDA527B27F0B2F2538728B3E|/
|
dove 6744FC42EDA527B27F0B2F2538728B3E è il file hash che identifica in
modo univoco questo file su tutta la rete. Questo File hash è calcolato
dividendo l'intero file in parti di 9.28 MB. Per ognuna di queste parti viene
calcolato un altro valore di hash chiamato Part Hash sempre usando l'algoritmo
MD4. Questi valori di Hash, chiamati hashset (ovvero 'insieme di hash')
vengono quindi usati per calcolare il File Hash finale. Per esempio un file di
600 MB verrebbe diviso in 65 parti ognuna con il suo valore di Part hash.
Questi valori poi verrebbero usati per creare il File Hash definitivo e finale
associato al file di 600 MB.
Per assicurarsi che eMule riceva sempre il corretto Hashset può essere
creato un link speciale che lo contenga ad esempio
ed2k://|file|name|12043984|6744FC42EDA527B27F0B2F2538728B3E|p=264E6F6
B587985D87EB0157A2A7BAF40:17B9A4D1DCE0E4C2B672DF257145E98A|/
dove p = valore denota l'hashset. Ogni Part hash è diviso dai due
punti ':'. Questo file ha dimensione 12043984 Bytes (=11.49 MB). Verrà quindi
diviso in una parte di 9.28 MB ed un altra costituita dai restanti byte. Quindi l'Hashset
sarà costituito da due Part Hash ( evidenziate sopra in verde e rosso)
ICH Intelligent Corruption Handling
Ogni volta che eMule scarica una parte di file (chiamata in gergo
chunk)
questa verrà analizzata per verificare se i dati scaricati corrispondono al
valore di Part Hash. Se la verifica ha esito positivo allora la parte è messa
in condivisione sulla rete e si aiuta a diffonderla agli altri client a cui
manca.
Se invece la verifica non ha esito positivo ci sia stato un errore nel
trasferimento e parte dei dati sono corrotti. Quella parte deve essere
nuovamente scaricata. Per evitare di scaricare nuovamente l'intera parte (9.28 MB), l'ICH ( una funzione intelligente di eMule per il recupero delle
parti corrotte ) scarica solo i primi 180 KB dell'inizio di quella parte e
quindi fa una nuova verifica per vedere se il Part hash ora è corretto. Se non
lo è allora vengono scaricati di nuovo i successivi 180 KB quindi si ripete la
verifica. Questo processo continua fino a quando non si ottiene un valore del
Part hash corretto. Nella migliore delle ipotesi eMule deve riscaricare solo
180 KB se i dati corrotti si trovano all'inizio della parte. In media l'ICH
salva il 50% di dati da riscaricare in caso di parti corrotte.
AICH - Advanced Intelligent Corruption Handling
L'ICH standard è molto efficace sebbene abbia le sue limitazioni poiché
solo l'intera parte di 9.28 MB può essere verificata e non blocchi più
piccoli. Se è corrotta più di una posizione o se client malvagi si mettono a
diffondere dati corrotti in continuazione o falsificano interi Part Hash,
l'ICH non è più efficiente.
E' qui che entra in gioco l'AICH che si occupa di assicurare la completa
integrità dei dati con un minimo costo di ri-download o di overhead creando
hash su pezzi più piccoli.
Root Hash, Block Hashes & AICH Hashset
Questa volta il nostro punto di partenza sono le parti di 9.28 MB in un
file. Ciascuna parte è divisa in blocchi di 180 KB per un totale di 53 blocchi
per parte e per ogni blocco viene calcolato un valore di hash usando
l'algoritmo di hash SHA1. Questi valori sono chiamati Block Hash e formano il
livello più basso di un completo AICH Hashset.
L'immagine sopra mostra come questo completo albero di hash (hash tree) sia costruito sui
blocchi di un file di 4 parti. Ogni parte contiene 53 blocchi per un totale
quindi di 212 Block Hash che a loro volta danno vita ad un hash tree di altri
7 livelli finché non si raggiunge il Root Hash. L'intero albero è chiamato
AICH hashset.
I cerchietti verdi e gialli mostrano le dipendenze matematiche dal Block
Hash più piccolo verso il Root Hash. Questo significa che se abbiamo un Root
Hash di cuoi abbiamo verificato la correttezza resta verificato l'intero
albero.
eMule può creare link che contengono il Root Hash per esempio
ed2k://|file|name|12043984|6744FC42EDA527B27F0B2F2538728B3E|h=A2NWOTYURUU3P3GCUB6KCNW3FTYYELQB|/
dove h= è il Root Hash. Per i nuovi rilasci questo valore dovrebbe essere
incluso poiché migliorerebbe significativamente la resistenza alla corruzione
del file fornendo un Root Hash verificato. Vedi Verificare il Root Hash
Recupero di dati corrotti
Ogni volta che eMule individua dati corrotti in una parte richiede un
Pacchetto di Recupero da un client casuale con un insieme di Hash AICH
completo. Questo pacchetto di recupero contiene tutti i 53 Block Hash della
parte corrotta ed un certo numero di hash di verifica per l'intero albero di
Hash. L'immagine sopra mostra un Pacchetto di Recupero di un file con 4
parti. Il numero di hash di verifica è determinato dal conteggio totale di
parti (2^x >= 'conteggio totale parti', con x = numero degli hash di
verifica).
Dopo aver ricevuto il Pacchetto di Recupero eMule analizza gli hash di
verifica per il Root Hash verificato. Se c'è corrispondenza eMule analizza
tutti i 53 blocchi della parte corrotta e li confronta con i Block Hash del
Pacchetto di Recupero. L'AICH quindi conserva tutti i blocchi per cui c'è
corrispondenza mentre scarica nuovamente quelli che sono corrotti e per cui
non c'è corrispondenza.
Nel Log di eMule un recupero dati di successo farà comparire le seguenti
righe:
09.09.2004 02:43:43: Downloaded part 6 is corrupt ([file])
09.09.2004 02:43:46: AICH successfully recovered 8.22 MB of 9.28 MB from part
6 for [file]
Verificare il Root Hash
La cosa migliore è scaricare il file da un link con il Root Hash integrato.
Assumendo che la fonte di quel link sia di fiducia il Root Hash sarà
verificato sin da principio e salvato sul disco per quel file.
Se non viene fornito Root Hash nel link eMule dovrà verificare l'esattezza
di quello che riceve dalle fonti di quel file. Considererà valido un Root Hash
solo se lo riceve identico da almeno 10 diverse fonti e se almeno il 92% di
tutte le fonti concordano su quel valore. Poiché questo Root Hash non è
comunque affidabile come quello che viene direttamente inserito in un link il
suo valore non verrà salvato sul disco ma sarà valido solo per la durata di
una sessione e non potranno essere creati link con integrato il valore di
questo Root hash.
Una volta che eMule ha costruito il suo intero insieme AICH, cioé il file è
completo, inizia a propagare il Root Hash agli altri client.
Note
- I nuovi rilasci o i file molto rari non avranno un numero sufficienti di
fonti per generare un Root Hash affidabile. Si raccomanda allora di
rilasciare questi file con allegato il Root Hash.
- Se non c'è un valore di Root Hash oppure se è presente uno inesatto
eMule sarà ancora in grado di terminare con successo quel download e
completare il trasferimento in condizioni normali. Tuttavia la
caratteristica AICH non potrà essere usata in questo caso.
- Poiché gli insieme di hash AICH possono essere molto grandi non vengono
memorizzati in memoria ma nel file known2.met e vengono letti solo su
richiesta.
- L'AICH funziona solo su client eMule v.44a o superiori ma conserva una
retro-compatibilità con gli altri client