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



这一次从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及以上版本, 但是保留了对旧版客户端的兼容性。

(0)

相关推荐

  • solidworks文件损坏怎么修复(solidworks已损坏且无法打开)

    一.什么是文件损坏?当SOLIDWORKS文件中有许多数据丢失或损坏时,该文件就会损坏,软件就无法读取该文件.由于软件识别错误后,打开或保存损坏的文件通常会产生错误消息.但错误可能会稍有变化,但通常会 ...

  • WinRAR压缩文件损坏怎么办?压缩包损坏内置修复方法

    对于文件比较大的文件我们常常会进行压缩或者要传输一个大一点的文件也会用到压缩,这样不仅占用空间会变小,而且传输过程中也容易保存文件的完整性,但是我们有的时候遇到这样的问题,就是压缩文件受到了损坏。那么 ...

  • PPT文件打不开怎么办? PPT文件损坏修复工具使用图文教程

    PPT对于大家都不陌生,PPT是office套件之一。我们在使用的过程中经常会出现ppt文件打不开,怎么办呢?PPT打不开的原因有很多,比如断电或者电脑死机,这种情况如果没有及时保存的话,辛苦制作的P ...

  • Excel文件损坏 打开时全是乱码的解决方法

    对于一些办公人员来说,Excel是运用比较多的一款统计软件,那么有一天Excel文档出现了问题,要怎么办呢?今天小编就来教大家excel文件损坏打开全是乱码怎么解决的方法教程,下面我们一起来看看具体内 ...

  • XP磁盘碎片整理提示文件损坏是怎么回事如何解决

    有时候经常对电脑进行清扫,今天在对C盘进行磁盘碎片整理时,系统提示“由于C:Windowsprefetch WMIPRVSE.EXE-28F301A9.pf”文件损坏,扫描不能进行”。于是便先整理下其 ...

  • windows开机显示explorer.exe文件损坏且桌面上图标不见

    电脑开机后出现explorer.exe文件损坏,而且电脑桌面上的有些图标就不见了,这是怎么回事,该如何解决此故障?今天小编就为大家解答。 explorer.exe是用户壳程序。桌面图标、任务栏等都是由 ...

  • 为什么在安装字体时会出现文件损坏?

    为什么在安装字体时会出现文件损坏? 这个是因为你下载的字库与你的系统产生冲突,特别是xp系统,因为有很多字体都是在win98或更早的版本下开发的,与现在的XP以上的系统不兼容,比如 早期的金桥字体、昆 ...

  • 文件损坏?在线酷盘轻松帮你恢复如初

    酷盘Kanbox可以跨平台云存储文件,并且会实时同步;因此一些用户在文件存储和使用时就有些大意,比如一不小心导致文件被删除、被轻度损坏等情况也时有发生。其实也不用慌乱,酷盘既然提供了方便安全的云存储机 ...

  • 提示"某文件损坏请运行chkdsk工具"解决方法

    故障现象:电脑右下角一直提示某文件损坏请运行chkdsk工具,而且频率很高,过两下就弹出这个提示,很烦人。 解决方法: 点“开始”、在“运行”里输入:CMD,确定: 出现这个界面后,输入 chkdsk ...