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,分别是264E6F6B587985D87EB0157A2A7BAF40 和17B9A4D1DCE0E4C2B672DF257145E98A 。
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