【05】第二章 | 进阶下载,从半中心化到完全去中心化(一)

Fairyex
01月11日

第二章 | 进阶下载,从半中心化到完全去中心化(一)

| 本文为付费栏目文章,您已订阅,可阅读全文 |
欢迎你来到本篇科普和教程的第二章,相信你已经在第一章对基本的互联网下载方式有了一定的了解。HTTP 和 FTP 下载优点很明显,但是缺点也很突出,其中最为致命的缺点是这些下载方式都是中心化并且是 C/S 结构(全写:Client/Server,简单理解:客户端 - 服务器模型)。

什么是下载中心化?什么是下载去中心化?

顾名思义,中心化的核心是中心——在下载中指的是储存着文件数据的一个或者确定数量的服务器,中心化意味着只有特定的储存着文件数据的服务器没有关闭并且开放数据,用户才能获取到它所储存的文件数据,一旦服务器遭遇不可抗力挂掉或者它的的所有者关闭对外开放的下载端口,我们就没办法再下载上面的东西。
中心化在文件下载时的缺陷再明显不过,加上基础下载方式的种种缺点,早期顶着拨号上网龟速的网民们在下载文件(特别是大文件)的时候往往是提心吊胆的,生怕突然就弹出一个下载失败的框框。最可怕的是,有时候下载失败的文件需要重新下载而不是继续下载。

俗话说没有解决不了的困难,程序猿们怎么会屈服于中心化的淫威之下呢。于是「去中心化」的对等式网络应运而生。
对等式网络(英语:peer-to-peer,简称 P2P),核心就是去掉中心服务器(即去中心化),所有的信息交互都由每一个用户「peer」之间完成,在整个对等式网络中的每一个用户即是一个节点,每一个节点都不能单独定位其他节点,必须通过整个节点网络(所有用户)才能定位目标节点。对等式网络也是现在和未来文件下载和数据交互的趋势。
关于节点的定位,我们来举个例子帮助理解:
小明想要找到一本很特别的书,可是他没法直接知道同一个城市里面谁有这本书(或这本书的一部分),这时候他开始问认识的朋友们(在 P2P 中就是随机或附近的几个节点)有没有谁有这本书(或这本书的一部分)。
假设小明的朋友们都没有,那么小明的朋友们就会继续问他们的朋友们……这个过程一直持续,直到找到足够数量的拥有这本书的人。然后拥有者(们)的联系信息会沿着原路一层一层地返回,直到传到小明耳朵里。
这样子小明就可以向拥有者(们)直接复制这本书,或者复制他们每个人拥有的一部分来合成一本完整的书。当小明开始复制这本书的一部分,他也变成了拥有者,也可以被别的需要这本书的人用同样的方法找到,这本书也就成功地脱离了图书馆(中心服务器)并在用户间传播开来。

这个例子只是为了解释用户之间是如何联系的,接下来我会列举一些常用的 P2P 下载方式,并从中让你逐渐地、轻松并准确地理解各种下载原理和概念。

eD2k 下载

说到 eD2k(全写:eDonkey2000 Network) 国人最熟悉的莫过于电驴(英语:VeryCD)了吧,不过与大家想象中的巨量文件不同,电驴整个站只储存了文件的 eD2k 链接(整个电驴储存的文件链接填入 TXT 可能就几十 MB) ,那么它是如何 24*7 不间断提供巨量资源下载的呢?这要从 eD2k 网络的原理讲起。
严格来讲 eD2k 并不是文件下载协议而是文件共享协议,用户在使用 eD2k 客户端的时候必须在本地设置一个共享目录和公网端口,所有放在共享目录里的文件都可以被其他 eD2k 用户检测并读取。
只要用户数量足够多,并且每一个用户都自觉将文件放到共享目录里面分享出去,作为一个小小的下载源。这样子所有用户就能组成一个全面又实时保持更新迭代的超巨型下载服务器。像是电驴这种服务器只是提供获取文件的方法,也就是文件链接,所有文件都是由独立的用户分享的。
eD2k 还支持通过文件指纹将不同文件名的同一文件成功识别为一个文件,并把大文件「>= 9.28 MB」切成一个个小小的文件块,当同一个文件有多个人共享的时候就会同时从每一处提取不同的文件块,达到加速下载的效果。

ed2k://|file|eMule0.5c.zip|2868871|0F88EEFA9D8AD3F43DABAC9982D2450C|/
它的结构简单清晰:
ed2k://|file|<文件名>|<文件大小>|<文件指纹>|/
每一个共享目录里面的文件都会生成一个像这样子的链接(一般还会包含本机的地址),当别人在客户端打开这条链接或者在文件站点(如电驴)里面搜索 eMule0.5c.zip 这个文件名时,所有文件指纹为 0F88EEFA9D8AD3F43DABAC9982D2450C 的共享文件都会提供下载数据,从而实现去中心化的下载。

实际上最早的 eD2k 网络也是需要中心服务器来实现用户间的通讯,eD2k 在这个阶段只能说是半中心化,同时 eD2k 还深受钓鱼服务器的困扰(会在后续关于下载安全性问题的章节进行讲解),直到后来新的 eMule(中文:电骡)客户端支持 KAD 网络(全写:Kademlia,简单理解:能实现前面小明例子的网络协议)之后才实现完全去中心化。
很多同学可能就有问题了,为什么我在用迅雷/旋风下载 eD2k 文件的时候不用设置共享目录呢?这就涉及到一个名为「吸血驴」的违反互联网精神的行为。简单来讲,就是「又想马儿跑,又想马儿不吃草」,这些客户端利用 eD2k 的优点吸引用户,又不能因为 eD2k 麻烦的配置和对上传速度的要求吓跑用户,所以很狡猾地利用各种伪装方法从 eD2k 网络下载文件但是一丁点儿数据都不会共享给 eD2k 网络(详细内容可以参见第七章关于下载安全性问题的章节)。
这种方法显然是非常不道德的。试想一下当用「吸血驴」客户端的人越来越多,那么实际提供文件的用户会越来越少,也就是说能下的东西越来越少,能下的东西越少就越少人用,构成一个恶性循环。事实上吸血驴也是 eD2k 没落的重要原因。

eD2k 的现状

之所以把它放在第一个来讲,是因为现在 eD2k 这种下载方式已经没落了。主要原因有那么几个:
对于正常使用客户端用户来讲,相比于其他的更加新的下载方式,配置更为麻烦不说,为了鼓励共享,eD2k 文件的下载速度是和共享目录里面的文件数量相关的,如果你的共享目录里面什么也不放,那么下载速度会慢得可怜。
对于那些使用不用设置共享目录的客户端的用户,由于「吸血驴」问题,其他「不吸血」的客户端会使用内置过滤器把这些「吸血驴」过滤掉。当「吸血驴」客户端的用户发现 eD2k 下载没有速度,也就不再使用了。
再来就是国情的问题,eD2k 共享目录里面的文件需要不断地上传,这显然不适合国内上下传不对等的小水管宽带。而且某些地区的运营商还会直接砍掉 KAD 网络的支持,让 eD2k 下载变得更加艰难。
一个 eD2k 链接只能下载一个文件,没办法像 BT 那样下载一个文件夹。不过最多人使用的 eD2k 客户端 Emule 提供一种将多个文件生成为一个收藏夹(Emulecollection)的功能,任何人获取到 .emulecollection 文件都可以下载里面包含的多个文件。 它的原理其实就是将多条 eD2k 链接写入一个文本文件提供给客户端读取。
eD2k 我们说完了,那么在这之后就要谈到大家喜闻乐见的 BT 下载和磁力链接的原理。由于篇幅所限,BT 下载和磁力链接的原理将会以一个独立的章节来进行讲解。

上一期
答疑汇总 01
下一期
答疑汇总 02
 
精选评论(4) 我的评论
  • HelloLucas
    意思是eD2K只是P2P的一种方式,P2P还有其他方式,对吗?P2P和PT下载有什么关系吗?比较关心怎么用NAS下载PT网站的资源~~
    01月13日
    • Fairyex 作者
      这个下一章就会讲到啦,PT 主要是按照你的上传贡献分配下载量,只适合玩很大数据(例如几百 G 一部的视频原片)的专业下载者,而且 PT 站对用户的审核和任务都很严格。一般来讲普通用户是没有精力去折腾 PT 的。
      01月13日
  • LetITFly
    为什么目前 msdn.itellyou.cn 这个分享 Windows / Office 镜像的网站仍然用 ED2K 而不用 BT 呢,还有为什么 www.zimuzu.tv 里的比较新的美剧的链接也仍然用 ed2k 呢? ED2K 不是没落了吗?
    01月13日 1
    • Fairyex 作者
      没落不代表消失额,而且没落只是相对的,全范围内几百万用户(安装客户端人数,不是这么多人同时用)还是有的。至于为什么用 eD2k,一方面是站长偏好,另一方面就是网站尽可能提供更多的下载方式,像是 zimuzu.tv 除了 eD2k 还有好几种下载方式。
      01月13日 1
  • gl09025
    后面会介绍一些黑科技的工具或者网站之类的吗
    01月13日
    • Fairyex 作者
      在能力范围之内当然会,不过真正可以安全,匿名和有¥%&@%优势的工具我被告知是「绝对」不能写的(残念),如果的确有需求的话可以私信我。
      01月13日 4
  • CYM
    沙发!
    这一章感觉有点短,电驴的历史没有怎么涉及,觉得博主可以说多一点的。以前用过一段时间的刀疤驴,感觉好难用,kad就从来没连接成功过。另外,那个大文件为什么是>=9.28MB呢?
    01月11日
    • Fairyex 作者
      连不上可能是因为你的客户端没有 nodes.dat 或者太旧了,这玩意儿储存着你周围的邻居节点,没有或者节点都变了自然就连不上。然后 eD2k 是以 9.28MB 为单位分块(chunk)的,所以大于它的就要分块了,至于为什么是 9.28 这个数字,官方好像木有说。
      Emule Wiki 里面相关的就一句话:Each chunk is 9.28MB in size (9500kB == 9728000 byte)
      01月11日 1