kad目前有1.0和2.0两个版本。主要包含以下协议

Low ID

emule通常使用下面几个端口

当这些端口不可及的时候或者IP地址以0结尾(例如61.51.3.0)的时候就会判定为Low ID。Low ID之间不能相互通信。

文件hash

每个文件都有一个叫做文件hash的唯一标识,它用MD4算法生成。

每个标准的eD2k链接都含有它,例如:

ed2k://|file|name|12043984|6744FC42EDA527B27F0B2F2538728B3E|/

其中的6744FC42EDA527B27F0B2F2538728B3E便是文件hash。

文件hash是通过将整个文件切分成9.28MB大小的块,并对每块使用同样的MD4算法生成一组Hashset计算而来。同样以上面的链接为例:

ed2k://|file|name|12043984|6744FC42EDA527B27F0B2F2538728B3E|p=264E6F6B587985D87EB0157A2A7BAF40:17B9A4D1DCE0E4C2B672DF257145E98A|/

前面的p=表示是后面的是Hashset,每个hash值用:隔开。这个文件大小为12043984字节,被分成 两块计算hash,分别是264E6F6B587985D87EB0157A2A7BAF4017B9A4D1DCE0E4C2B672DF257145E98A

ICH - Intelligent Corruption Handling

每当emule下载完成一块时,它会验校下载的块hash值是否正确,如果正确的话,这块就完成并可用用于上传。

如果不正确,这块需要重新下载。为了避免重下整个9.28MB,ICH从开头的180KB开始重下,下载完毕后再进行一次验校,没通过的话,再重新下载后面的180KB,以此类推,直到验校通过。

如果错误在第一个180KB,那么只用重下第一个180KB,如果在最后一个180KB,那么要重下整个9.28MB块。平均下来能减少一半的重新下载。

AICH, Advanced Intelligent Corruption Handling

从上面看出ICH作用是在不大。它只验证单个的块,如果有恶意的主机伪造了这块数据并且不断的散播这块数据,或者干脆伪造了块的hash,ICH是无能为力的,下面就轮到AICH闪亮登场了。

我们还是从9.28MB大小的块说起吧。这块被切分成180KB的小块,总共53小块。每个小块使用SHA1 hash算法得出hash值。这些hash值是AICH Hashset的最底层

剩下的具体实现部分以后再写吧。

参考资料:

http://www.emule.org.cn/topic/lowid/

http://www.emule-project.net/home/perl/help.cgi?l=1&rm=show_topic&topic_id=589