视频 | BT 种子和磁力链接是如何工作的?
BT 种子和磁力链接是如何工作的?
如何构建一个无法被审查和封禁的去中心化网络?
以下为视频逐字稿:
如果你想要下载一集不存在的回形针视频,你会怎么做?
最简单的方法当然是找一个有资源的哥们——每羊,让他把这期视频发给你。早期互联网,大家就是这么共享文件的,但是这样也有很多问题。
比如下载的人一多,每个人分配到的带宽就变小了,下载速度会变慢。更危险的是,这期视频是敏感资源,你的哥们本来就不应该分享给你,如果每羊被抓了,大家也都别下载了。
针对这些问题,美国工程师 Bram Cohen 在 2001 年发布了 BitTorrent 协议,资源不再由一个人或一个中心服务器提供,而是所有人提供给所有人,下载的人越多,速度越快。这种模式也叫 peer-to- peer(用户群对用户群),也就是我们常说的 P2P 下载。
BitTorrent 的核心思想是把文件分成很多个小块,让下载者互相连接。
以这支 117.3 MB 的视频为例,被分成了 895 个 128kB 的文件块后,下载了第 306 块的用户 A 就可以和下载了第 11 块的用户 B 交换彼此下载好的部分。参与的人越多,互相交换的就越密集,下载的越快。
为了做到这一点,BitTorrent 协议需要资源共享者生成一个包含下载信息的种子文件,后缀是 .torrent,这就是我们常说的 BT 种子。
种子文件包含文件的名字、大小,分块后每块文件的大小、哈希值,以及 Tracker 服务器的地址。
Tracker 很重要,通过 Tracker 我们才能找到其他下载者的联系方式。
当你用下载软件打开种子,就会开始联系种子文件里内置的 Tracker 服务器,告诉 Tracker 我要下载这个文件,服务器会记录下你的 IP,并把其他正在下载或下载完成的人的 IP 返回给你,这样你们就可以愉快的组队下载了。
当然,如果没有找到正在下载的人,资源发布者也不在线,你就只能以 0kb/s 的速度等着了。
不难发现,Tracker 服务器是 P2P 网络的弱点,如果 Tracker 被关闭或封禁,你就无法找到同伴,也难以完成下载。
为了摆脱对 Tracker 服务器的依赖,今天最流行的下载方式是磁力链接(Magnet URI scheme),通常是一串这样的神秘代码:
magnet:?xt=urn:btih:1a427c8498f72b9a27fde87662dbeb6fc043fc47
前面都是标准格式,最重要的是这 40 个 16 进制的数字。任何文件丢进哈希算法都能得到一串这样字符,40 位、16 进制、只属于这个文件。你可以把它当成一个文件 ID,它能帮我们找到我们要下载的东西。
磁力链接的本质是把所有人都变成一个小型 Tracker,每个人都拿着一份动态更新的地址和文件信息。我找与我连接的 10 个人,他们再各自找 10 个人,一传十十传百、千、万,最后是我找到小明小明找老王老王找郭冬临郭冬临找到每羊,我和每羊就连上线了。
但这种所有人找所有人的方案其实不太行,不仅占用了大量的资源,效率也非常低,还有可能重复传播,造成广播灾难。
这时,就需要补充一个关键信息——距离。
注意,这里的距离,不是空间上的距离,而是逻辑上的距离。
重点来了!接下来,我会详细解释磁力链接使用的 DHT 网络的构建过程,有一点点难,但是真的非常有意思。让我们开始吧。
刚刚说了,每个磁力链接都有一串唯一的文件 ID,可以产生 2 的 (4*40) 即 2 的 160 次方种组合,用只有 0 和 1 的二进制表示就是 160 个 0 和 1。
而每个节点也有一串 160 位的 0 和 1,作为节点 ID。根据这 160 位数,我们可以计算节点和节点之间,节点和资源之间的距离。
假设每羊发布了一个文件,就能计算他所知道的节点 ID 与这个文件 ID 的距离,让算出来最距离最短的节点再计算它知道的节点和文件 ID 的距离,重复这个过程,就能找到与文件 ID 的距离最短的一批节点 ID,把每羊提供的下载信息存在这里。
这样,下载者也只要找到和文件 ID 距离接近的节点 ID,就能建立连接,开始下载。
但这个距离到底是怎么算出来的呢?
这就是有趣的地方了,用异或算法来计算节点之间的逻辑距离,相同就是 0,不同就是 1。
为了方便你理解,我们简化一下模型,把 160 位缩减到 4 位。假设你的节点 ID 是 0100,目标节点 ID 是 1111,那么你们之间的二进制距离就是 1011,换算成十进制就是 11。
有了距离,我们就可以在一个这样的二叉树里快速查找目标了。
所有可能的节点 ID 都在这棵二叉树上。 4 位数需要分叉 4 次,生成 2 的 4 次方即 16 条路径,每条路径的终点,就是一个节点 ID。
接下来,你作为 0100,就可以拆分这颗二叉树了,从第一次分叉开始,把不包含你的那棵子树拆分,然后在剩下的子树的第二次分叉处再次拆分,直到只剩下你自己。
这样,就拆分出了 4 个子树。
我们在每个子树里选 2 个点,就得到了 4 个 K 桶,呃,不是这个,是这个,K-bucket。
暂停下来想想你就会发现,用异或算法计算 0 号 K 桶和你的距离是 0001,换算成十进制就是1,1 号 K 桶里 2 个点和你的距离是 2-3,以此类推,2 号 K 桶的距离区间是 4-7,3 号 K桶的距离区间是 8-15。
我们刚刚算过,你的节点 ID 0110 和目标 ID 1111 之间的二进制距离是 1011,换算成十进制是 11,也就是说,离 1111 最近的,肯定是 3 号 K 桶里的 2 个节点。
接下来,我们就可以联系这两个节点,让他们帮我们找 1111。
以 1110 为例。1110 也能拆分出 4 棵子树,得到 4 个 K 桶,计算 1110 和 1111 之间的距离,结果是 0001,换算成十进制是 1,也就是在 0 号 K 桶,1111 就在这里。
这种网络结构被称为 DHT,分布式哈希表(Distributed Hash Table),一个高宽容度的去中心化网络。只需要一串文件 ID和存储在本地的 K 桶数据,你就可以高效的找到要下载的文件。
而资源的发布者和传播者也只需要分享 40 个数字就好,足够简单,方便和隐私。
在真实的 DHT 网络,每个 K 桶至少记录了 8 个节点,任何一个节点下线,都不会影响整个网络的运行。
作为文件和节点 ID ,2 的 160 次方也足够大,大到全地球 70 亿人每秒下载 10000 个种子,也足够下载百万亿年直到宇宙终结。
这些天才们的设计,让我们拥有了一个无法被审查和追踪的去中心化网络。这催生了庞大的盗版产业,但也让很多内容有机会避开审查。
因为网站可以被隔离、被拔线、被禁止访问,但种子不会。只要种子不死,那些不存在的音乐图书和视频就还活在互联网上,没有任何人可以毁掉。
作者暂无likerid, 赞赏暂由本网站代持,当作者有likerid后会全部转账给作者(我们会尽力而为)。Tips: Until now, everytime you want to store your article, we will help you store it in Filecoin network. In the future, you can store it in Filecoin network using your own filecoin.
Support author:
Author's Filecoin address:
Or you can use Likecoin to support author: