Advanced Intelligent Corruption Handling (kurz AICH) ist ein Fehlerkorrektursystem, das dazu gedacht ist, Übertragungsfehler im P2P-Netzwerk eDonkey2000 mit minimalem Aufwand zu beheben. Es soll langfristig das ältere, aber wesentlich schlechtere Intelligent Corruption Handling (kurz ICH) ablösen.
Intelligent Corruption Handling
Obgleich ICH recht wirkungsvoll ist, hat es die Beschränkung, dass immer nur vollständige 9500-kB-Chunks überprüft werden können, aber keine kleineren. Wenn ein 9500-KB-Chunk einen Fehler enthält, wird er in 180-KB-Blöcken erneut heruntergeladen. Jeweils nachdem ein 180-KB-Block neu geladen wurde, wird der gesamte 9500-KB-Chunk auf Korrektheit überprüft. Im Schnitt spart dies also 50 % der Bandbreite, wenn man von statistischer Gleichverteilung von Fehlern in Chunks ausgeht. Wenn es in solch einem Block mehr als eine fehlerhafte Position gibt, oder wenn böswillige Clients fehlerhafte Daten immer wieder oder sogar ein gesamtes Teilstück fälschen, kann ICH nicht mehr wirkungsvoll eingesetzt werden, da die fehlerhaften Blöcke dennoch komplett, also wieder 9500 kB, übertragen werden müssen (ferner noch können bereits korrekte Daten durch fehlerhafte Daten ersetzt werden - auch dies erkennt ICH nicht).
Advanced Intelligent Corruption Handling
Hier setzt AICH an, um eine Datenintegrität mit minimalen Redownloading-Aufwand herzustellen. Dazu wird das zu übertragende Objekt in 9500 kB große Chunks geteilt. Jeder Chunk wird in 180 kB Blöcke zerlegt, das ergibt 53 Blöcke pro Chunk. Für jeden Block wird mit Hilfe des SHA1-Algorithmus ein Hashwert errechnet. Diese Werte werden Block Hash genannt und bilden die unterste Ebene eines kompletten AICH-Hash-Baumes. Im Bild ist ein vollständiger Hash-Baum für eine Datei, bestehend aus vier Chunks, zu sehen. Jeder Chunk enthält 53 Blöcke, das macht zusammen 212 Node-Hashes auf der untersten Ebene und 423 auf allen 7 Baum-Ebenen bis zum Root Hash. Der gesamte Baum wird AICH-Hashset genannt.
Die blauen und gelben Punkte zeigen die mathematischen Abhängigkeiten der kleinsten Block-Hashes bis zum Root-Hash. Dies bedeutet, mit einem Root-Hash kann man überprüfen, ob eine Datei vollständig und fehlerfrei geladen wurde.
Fehlerbehebung
Immer wenn ein Fehler entdeckt wird, wird von einem beliebigen, anderen Client ein Recovery-Paket mit einem kompletten AICH-Hashset angefordert. Das angeforderte Hashset enthält für alle 53 Blöcke deren Block-Hashes und zusätzlich Verify-Hashes für den gesamten Hashbaum. Die Anzahl der Verify-Hashes hängt von der Anzahl der Teilstücke der Datei ab (2x >= 'Anzahl Teilstücke', wobei x die Anzahl der Verify-Hashes angibt).
Nach dem Empfang werden die Verify-Hashes aus dem Recovery-Paket gegen den vertrauenswürdigen Root-Hash geprüft. Wenn sie zusammenpassen, werden alle 53 Blöcke des fehlerhaften Teils gegen Block-Hashes vom Recovery-Paket geprüft. Passen Block-Hashes nicht zusammen, werden die entsprechenden Blöcke nochmals zum Herunterladen angefordert.
Vertrauenswürdiger Root-Hash
Am besten erhält man vertrauenswürdige Root-Hashes, indem man Dateien über deren Root-Hash zum Download anfordert. In der Annahme, dass die Quelle dieser Verbindung vertrauenswürdig ist, wird dem Root-Hash sofort vertraut und dieser für diese Datei gespeichert. Wenn kein Root-Hash vorhanden war, so muss dem Root-Hash vertraut werden, der vom sendenden Client zur Verfügung gestellt wird. eMule vertraut dieser Quelle nur dann, wenn mindestens zehn unterschiedliche Quellen den gleichen Wert senden und wenn mindestens 92 % aller Quellen diesem Wert zustimmen. Wenn dieser als nicht vertrauenswürdig eingestuft wird, ist er nur für diese Sitzung gültig und wird weder gespeichert, noch können darüber Hashlinks erzeugt werden.