萬盛學電腦網

 萬盛學電腦網 >> 媒體工具 >> eMule文件損壞如何處理

eMule文件損壞如何處理

   eMule(電騾)使用多種方法來確保網絡中下載和共享的文件沒有錯誤。當錯誤發生時,或稱作損壞時,eMule擁有的高級功能僅需要重新下載最少量的數據就能修復這種損壞。

eMule文件損壞如何處理 三聯

  文件Hash和ICH - 智能損壞處理

  文件Hash,文件段Hash值和Hashset

  每一個被共享的文件在網絡中都會由MD4數學加密算法計算出一個理論上唯一的特征值。這個數值被稱作文件Hash值(也作:哈希),並且被包含在每個標准的eD2k鏈接中。例如:ed2k://|file|name|12043984|6744FC42EDA527B27F0B2F2538728B3E|/

  其中6744FC42EDA527B27F0B2F2538728B3E就是該文件的文件Hash值,也即文件在網絡的獨一無二的特征值。

  文件Hash值通過將文件分割成每個9.28 MB的文件段然後計算得來,每一個文件段都用相同的MD4算法得到一個文件段Hash值。用這些被稱作Hashset的文件段Hash值,可以接著計算出最終的文件Hash值。例如,一個600MB的文件將被切分成65塊文件段,每一個都有自己的文件段Hash值,然後用它們計算得到最終的文件Hash值。

  為了確保eMule始終接收到正確的Hashset,可以創建一個特殊的包含Hashset的鏈接,例如:  ed2k://|file|name|12043984|6744FC42EDA527B27F0B2F2538728B3E|p=264E6F6B587985D87EB0157A2A7BAF40:17B9A4D1DCE0E4C2B672DF257145E98A|/

  其中p=後面的數值表示了Hashset。每一個文件段Hash值使用一個半角冒號“:”來分隔開。例子中的文件大小為12043984字節(=11.49 MB),也就是說它被分割成兩個文件段,一個完整的9.28MB的文件段和一個剩余大小的文件段,各自擁有自己的文件段Hash值。

  ICH 智能損壞處理

  當eMule完成一個文件段的下載後,它將檢查數據是否符合該部分的文件段Hash值。如果正確,則該部分就可以上傳來幫助文件傳播。

  如果錯誤,則會報告損壞並重新下載該部分。為了避免重新下載整個9.28MB的數據,ICH將重新下載該文件段開頭180KB大小的部分,然後再次檢查該文件段Hash值是否正確。如果依舊錯誤,將繼續下載接下來的180KB,並再次檢查。直到該部分的Hash值正確為止。最理想的情況下,eMule僅需要重新下載這個文件段開頭180KB的正確數據。最壞的情況下,如果損壞的部分在文件段的結尾,則整個文件段都會被重新下載。平均來說,ICH在文件段損壞時可以節省50%的重新下載需要。

  AICH - 高級智能損壞處理

  標准的ICH功能已經非常高效,但是有一個限制是只有整個9.28MB的部分能夠被校驗,而不是切細。如果不止一個位置出現了損壞,或者一些有害的客戶端一次又一次的故意發送一些損壞的數據,甚至偽造整個文件段Hash值,則ICH將不再有效。

  而AICH通過更精細的Hash,只需要最小的開銷或重新下載的消耗,來照顧到整個數據的完整性。

  根Hash,塊Hash & AICH Hashset

eMule文件損壞如何處理

  這一次從9.28MB的文件段開始進行。每一個文件段都被切細成180KB大小的文件塊,這樣每個文件段可以切分成53個文件塊,並且每一個文件塊都使用SHA1哈希算法來計算出一個Hash值。這些數值被稱作塊Hash值,構成了一個完整的AICH Hashset中的最底層。

  上圖展示了一個包含4個文件段的文件如何構造了一個完整的Hash樹。每一個文件段包含了53個文件塊總計212個塊Hash值,這些一直到根Hash構成了一個7級的Hash樹。整個Hash樹被稱作AICH Hashset。

  這些綠色和黃色圓點顯示了這些最小的塊Hash並直到根Hash之間的數學依賴關系。這意味著如果我們信任根Hash值,那麼就可以反過來驗證整個Hash樹。

  eMule可以創建包含根Hash值的鏈接,例如:  ed2k://|file|name|12043984|6744FC42EDA527B27F0B2F2538728B3E|h=A2NWOTYURUU3P3GCUB6KCNW3FTYYELQB|/

  其中h=後面跟著的為根Hash值。對於發布來說提供一個可信的根Hash值可以顯著提高文件損壞的修復能力。

  恢復損壞的數據

  當eMule檢測到一個文件段的數據損壞時,會隨機向某個客戶請求一個包含完整AICH Hash Set的數據恢復包。恢復包裡包含了損壞文件段的全部53個塊Hash值,以及一個Hash樹的校驗Hash數量。上圖展示了一個包含4個文件段的文件的數據恢復包。校驗Hash的數量由文件的文件段計算得來(2^x >= '文件段數量',其中x = 校驗Hash的數量)。

  在接收到數據恢復包以後,eMule會檢查校驗Hash來反算可信的根Hash。如果它們匹配,eMule將檢查損壞部分的全部53個文件塊是否和恢復包裡的塊Hash值相對應。然後AICH會保存所有匹配它們的塊Hash值的文件塊,僅僅重新下載損壞的文件塊。

  在日志中一次成功的數據恢復會顯示類似如下的信息:

  09.09.2004 02:43:43: 下載的文件段 6 已經損壞:([文件名])

  09.09.2004 02:43:46: AICH 成功的恢復了8.22 MB/ 9.28 MB 文件段:6 文件:[文件名]

  信任根Hash(Root Hash)

  最好是從一個帶有根Hash的鏈接進行下載。並假設鏈接的來源是可靠的,則此文件的根Hash將被信任一次並保存到磁盤中。

  如果鏈接中沒有提供根Hash,則eMule將不得不信任從文件來源那裡發送的根Hash值。而且僅會信任至少10個不同來源所發送的相同的根Hash,並且必須有92%的來源都信任這個值。因為這個根Hash是不可靠的,並且僅在當前會話中有效,不會被保存也不會被用來創建帶根Hash的鏈接。

  當eMule建立好一個AICH Hashset時,例如當文件下載完成時,它將傳播這個根Hash給其他客戶。

  注意:

  新發布的或稀有文件可能沒有足夠來源來生成一個可信的根Hash。所以強烈建議發布者在發布文件時添加相關的Hash值。

  如果沒有根Hash或者甚至得到了一個偽造的,eMule在一般情況下同樣可以成功下載並完成文件。但此時AICH功能將無法使用。

  由於AICH Hashset值非常大,它們不會被載入內存中,但是會被保存到known2.met文件,並僅在需要時讀取。

  AICH僅僅支持eMule v.44a及以上版本, 但是保留了對舊版客戶端的兼容性。

copyright © 萬盛學電腦網 all rights reserved