不懂下载开不好车

迅雷还是一个好同志的时候,我不关心下载是怎么一回事,现在好同志不再为人民服务,我打算干掉它再提拔一个上来。于是,我研究了一下下载的历史。

P2P

以前,人们下载资源是靠服务器,比如

  1. X是个电影网站
  2. 电脑A要下载,找X
  3. 电脑B要下载,找X

这种方式存在几个问题

  1. X太重要了,它一瘫痪,所有人都没电影看
  2. X能力有限,大家都找它,它肯定忙不过来,所以人一多,下载速度就很慢

为了解决这些问题,出现了一个叫 P2P 的技术,它的特点是无中心服务器,也就是没有X,用户要下载,得靠自己。比如

  1. 电脑A要下载《猫和老鼠》,于是A在网络上问,谁有《猫和老鼠》
  2. 电脑B有《猫和老鼠》,于是B说,我有,到我这下吧
  3. 于是A找到B,开始下载
  4. 过了一会,电脑C也要下载《猫和老鼠》,它也在网络上问,谁有《猫和老鼠》
  5. B回答,我有,到我这下吧
  6. A回答,我也在下,还没下完,你可以找我下载,我下好的这一部分
  7. 于是C找到A下一部分,找到B下另一部分
  8. 因为C能同时到两个地方下载,所以C的下载速度比A还快
  9. 过了一会,电脑D也要下载《猫和老鼠》…

技术的灵感来源于现实生活,上面的流程用一句歌词就能概括,只要人人都献出一点爱,世界将变成美好的人间。每一个用户,下载资源的时候,既是索取者,同时也是提供者,它索取自己没有的,提供已经拥有的。这样就解决了原来的问题

  1. 没有X,或者说人人都是X,不存在谁挂掉了,大家都没得看
  2. 下载的人越多,速度越快

P2P技术发展到第三代,终于成熟起来,人们下载资源不再找网站,而是找种子。关于P2P的详细介绍,参考 p2p科普

BT

P2P之前存在一些问题

  1. 我怎么知道我要的资源谁有,一个一个问?就算问到了,可对方网速太慢,那我下到什么时候去
  2. 搭便车问题,我是有资源,但我凭什么给别人下载?他只会拖我的网速。我只想下载别人的,但别人不能下我的

对应的解决方法是

  1. 找一个中介,上传资源找它登记,下载资源找它查询,登记时还会记录上传速度
  2. 下载时,如果你的上传速度很慢,甚至不上传,中介就不告诉你速度最快的下载位置,这样你下载也会变慢

由此又引发了一个疑问,虽然中介没那么多事,只维护一个名单,不提供具体的上传和下载,但世界上那么多资源,它全都要记录,它扛得住么?一家中介当然扛不住,很多家一起呢?可是,这就绕回来了,原本我是不知道谁有我想要的资源,现在变成,我不知道有我资源的人,登记在哪个中介,有意思么?有意思,因为有个东西会告诉你应该找哪个中介,这个东西就是种子。还是举刚才的例子

  1. 电脑B要共享《猫和老鼠》,先联系中介Y做登记
  2. 登记后B生成一个种子,里面记录着《猫和老鼠》的名字、大小以及Y的地址
  3. B把种子公布到网上
  4. 电脑A要下载《猫和老鼠》,它先下载种子
  5. 打开种子后,A找到了Y
  6. Y查到记录说,你去找B,B有资源
  7. A连上B,一边下载一边上传
  8. 电脑C要下载《猫和老鼠》,它先下载种子
  9. 打开种子后,C找到了Y
  10. Y查到记录说,你去找A和B,它们有资源
  11. C连上A和B,一边下载一边上传

这一下载方式就是 BT,它有两个要素

  1. Tracker,也就是中介Y,掌握着网络中谁要这个资源以及谁有这个资源
  2. 种子,实际是.torrent后缀的文件,记录着Tracker在哪以及我要哪个资源

现在BT升级了,人们下载资源不再求种,而是找磁力链接。

Magnet

BT做到了互联网人人平等,但版权商急眼了,要什么平等?你不买就别看。细细一想,这事不好追究责任,因为所有资源都是网友自发上传,没有谁从中组织,怎么办?既然我搞不了人,那我搞服务器,只要Tracker停了,种子也就失效了,你也就下不到了。后面的事情很简单,版权商胜利,种子没有了。

从这里看出,BT并没有完美地实现P2P的去中心化思想,虽然Tracker不提供具体的下载,但它也属于中心,只要中心瘫痪,其他人都没得玩。所以要想一个方法,既要保留Tracker的功能,又不能太依赖它。如果村长不行了,乡亲们怎么过日子?劳动人民的力量是无穷的,大家决定集体承担村长的责任,如果每家每户都出力,那么即使没有村长,村子也能运转下去。

除了Tracker容易让人抓住把柄,还有一个问题,种子不方便传播,万一以后有规定,为防止侵权,网站禁止分享.torrent文件,那我怎么下种子?你能禁止分享文件,你不能禁止分享字母和数字吧,我给种子套上一层马甲,把它变成一串字符,你还能禁止么?于是,磁力链接 诞生了,它升级了BT的两个要素

  1. Tracker遭淘汰,原来的大名单被分成很多小名单,每一个BT用户存储一份
  2. 种子有马甲,只要一串字符,就能下到种子文件

外面的版权官司打得越来越激烈,但人们发现,想下载的一样能下载,好像没什么变化,非要说不同的话,就是磁力链接方便一点。但磁力链接到底是什么?不着急,慢慢讲,主要是三项技术。

DHT

Distributed HashTable,分布式哈希表

DHT是一种分布式存储方法。DHT的作用是找到那些与本机正在下载(上传)相同文件的对端主机(Peer),当然,实现这一过程并不依赖Tracker服务器。在DHT网络中的每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整个DHT网络的寻址和存储。这种信息获取方式保证了整个网络没有单个的中心,即使一个节点下线,依然可以通过其他节点来获取文件,因此也就不需要Tracker服务器来告诉你,其他节点在什么地方。

简单理解,DHT将大名单分成小名单。

PEX

Peer Exchange,节点信息交换

虽然DHT解决了去中心化的问题,但要在没有“中心协调员”(Tracker)的情况下实现高效寻址,就要借助PEX。PEX所提供的功能有点类似于以前的Tracker服务器,但工作方式却非常不同。

简单理解,PEX将小名单关联起来。

Magnet Link,磁力链接

磁力链接最常见的用途是基于文件内容的散列函数值来链接到特定文件,生成一个唯一的文件识别符,类似于ISBN。不像常规的识别符,内容散列可以被任意一位持有此文件的人生成,所以并不需要一个中心机构,这使其在文件共享领域经常被用作搜索条件,因任何人都可以分发一个磁力链接来确保该链接指向的资源就是他想要的,而和得到该资源的方式无关。(虽然技术上讲,两个不同的文件可能具有相同的散列值,但实际上这是极不可能发生的)

磁力链接的格式和HTTP链接末尾的格式相同,协议名magnet?,后面再接参数,每个参数用&分隔,常见参数有

  • xt(eXact Topic),包含文件哈希值的统一资源名称,必填
  • dn(Display Name,显示名称),选填

只有xt是必填参数,换句话说,一串磁力链接,只要xt有值就能够下载,其余的可以不要。xt的值也有格式,比如xt=urn:btih:XXX,意思是

  • urn(Uniform Resource Name,统一资源名称),后接:
  • btih(BitTorrent info hash,种子散列函数),后接:
  • XXX,根据btih算出的种子文件的值,用我的话讲,就是种子的马甲

urn后面只能接btih么?不是,md5和ed2k都可以,参考维基百科 磁力链接

磁力链接再往后,就是网盘时代了。个人不喜欢网盘,就不介绍了,但有篇文章写得不错,参考 为什么现在老司机发片都不用“磁力链”了?