文件損壞處理

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

這一次從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及以上版本, 但是保留了對舊版客戶端的兼容性。

文件損壞處理》,由uralhan翻譯自eMule官方網站英文版幫助與支持《Corruption Handling》並首發於eMuleFans.com。原文版權歸屬於eMule官方和原文作者。翻譯內容版權歸屬於翻譯者並遵守CC 3.0 BY-NC-SA協議。適用於eMule 0.44a以上版本。已編入eMule官網簡體中文版幫助與支持《文件損壞處理》。英文原文最後由Monk更新。

2條評論隱藏

  1. #1 無敵稻草人
    2014年4月10日 周四 11:00 | 回復

    看的不大明白啊,最近在使用中遇到一個問題,原來的共享的文件,數據找回後,部分壓縮包損壞了,但是在電騾共享中他們的連接沒有變化。把正常的文件放在另一個目錄,hash的時候提示重複,這不科學啊。是哪裡設置有問題么?
    WIN8.1 64位 X-MOD 1.6.1

  2. 2021年3月5日 周五 18:01 | 回復

    2021中國考古人員前來考古

1條Trackback/Pingback顯示

發表評論

您的Email將不會顯示出來。頭像請至Gravatar.com註冊上傳。*號標註項為必填。

*
*
*
標籤用法
字數:0