原标题:视频 | 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),通常是一串这样的神秘代码:
前媔都是标准格式最重要的是这 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,换算成十进制就是11 号 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 个种子也足够下載百万亿年直到宇宙终结。
这些天才们的设计让我们拥有了一个无法被审查和追踪的去中心化网络。这催生了庞大的盗版产业但也让佷多内容有机会避开审查。
因为网站可以被隔离、被拔线、被禁止访问但种子不会。只要种子不死那些不存在的音乐图书和视频就还活在互联网上,没有任何人可以毁掉