初探磁力链接的原理
磁力链接的神奇
老司机都懂得擦擦键盘来传播磁力链接。一直很好奇为什么磁力链接这种完全去中心化的技术怎么就凭一串毫无规律的字符串,就在浩瀚的互联网里找到我们想要下载的数据呢。p2p不同于S/C,假设我要下载京紫第一集,在S/C模式下,我只需要知道b站有京紫,只要我找到b站就有京紫看,寻找b站只需要在浏览器输入bilibili.com便可以定位到b站了。如果我是通过bt下载京紫来看,可没有“京紫第一集.com”的网址让我去打开。网络里有N多个地址,这些地址后面不一定都有资源,就算有资源,也不一定有京紫呀,难不成我要各个地址都问一下?这岂不是大海捞针?
说实在话,在网上看了那么多文章还是似懂非懂,但也再次记录一下我的理解吧。
p2p的三个发展历程
无论是p2p还是S/C模式,所做的都是在网络上寻找数据,区别就在于p2p难找,S/C相对容易找。找东西的话这里其实以做个类比,我在在互联网找数据,可以类比成找某个人。找东西或者人问题有相似之处,解决的办法理应也是相似的。
这里例如我要找班里的张三同学,我知道他的名字(废话),也知道他的相貌,但我不知道他坐在那里。最稳妥的,我问一下班主任,班主任有座位表,班主任肯定知道,如果班主任都不知道,那班里就没有这个人了,除非班主任是假的。这种就是第一代p2p个Tracker服务器(班主任),客户端都更Tracker服务器联系,所以Tracker服务器有大家的地址和所拥有的数据表(座位表),我想下载些什么,先问问Tracker服务器谁有,再像那个人寻求获取。
但是这里有个问题,一旦Tracker服务器挂掉了,我还向谁询问文件下落呢。所以Tracker服务器一直是版权组织打击的重点。为了大家都能连上Tracker服务器,Tracker服务器的地址都是公开并且尽量保持不变的,我能知道Tracker服务器地址,版权组织也能知道,被打掉是逃都逃不掉的。
所以,这个班主任会时不时不在,是靠不住的,那咋办呢?班主任不靠谱就只能靠自己了,我在班里大喊一声(广播)”谁是张三,请回应一下我“不就得了。恩,也确实是可以的。这就是第二代p2p是有问题,我找张三在班里喊一声,张三找李四,又在班里喊一声,李四找王五,又又在班里喊一声。你又喊我又喊,班里就会吵到爆炸(广播风暴),最后啥都听不清,谁都找不到。
真是mmp,班主任不靠谱,自己喊又会吵到大家,但心想我不知道张三坐哪里而已,总不可能班里全部人都不知道张三坐哪里吧。如果我能找到知道张三坐哪的人,询问一下我便能知道张三坐哪了。但,我怎么知道谁知道张三坐哪呢?表面上,这里好像只是把找张三的问题装换成找知道张三坐哪的人的问题,还是没有解决怎么找人的问题呀。但是与直接找张三只能遍历每一个座位上坐的是不是张三不同,找到知道张三坐哪的人是可以通过巧妙的设计高效确定寻找的,这边是第三代p2p,使用分布式散列表(DHT)。
这里为了形像解释DHT在干嘛,我需要换一个例子来解释。同样是找人,但我不是在班里找人了,是要找秦始皇的后人(打钱)。我想啊,秦始皇的族谱在西安交通大学会有人研究,找到这个研究秦始皇的族谱的老师A就能知道秦始皇的后代。但是,我不认识这个老师A,所以我需要一个在西安交大做老师的老师B,这个老师会知道他校里谁研究秦始皇族谱的,所以我要知道老师B。但是我也不认识老师B呀。我又想,我校应该会有老师到西安交大做交流,那么我要知道这个我校的老师C。但是这个老师C能去西安交大做交流,非我等学渣所能认识,那我只能找我认识的任课老师D,打听老师C,让老师C介绍老师B给我,再然老师B介绍老师A给我,最后问到秦始皇的后人情况。
# 分布式散列表(DHT的二叉树)的原理-以 Kademlia(Kad)为例
第一步,我们先对每个文件计算其hash,由于hash和文件几乎是一一对应的,所以文件的hash在这里作为索取文件的key,文件的数据作为value。所以我们要做的就是寻找一个hash值为某某某的文件。
第二步,根据hash对文件进行分类。怎么根据hash进行分类呢?hash是一个数值,我们把这个数值装换成二进制,然后构建一颗二叉树。二进制下,第一位数字是0的文件放在根节点的左子树,1的放右子树。第二位也如此类推,所以这课二叉树每个子叶都代表一个数据文件。所以,对,所以他不是文本文件一类,视频电影一类,是根据二进制位的01来分类。
盗自编程随想的博客
然后一切就套用秦始皇的例子了。这里例如我在0011,我要找1110的文件。我只认识0100。
我问0100:”1110在哪?“
0100回答:”我自己第一位是0,他是1,我往东他往西,我怎么知道呢?你问101吧,我认识101,我把101介绍给你。“
我问101:”1100在哪?“
101回答:”我不认识1100呢,但是我认识1101,我把1101介绍给你。“
我问1101:”1100在哪?“
1101回答:”我不认识1100呢,但是我认识11110,我把11110介绍给你。“
我问11110:”1100在哪?“
11110回答:”我认识1100啊,我把1100介绍给你。“
于是我就找到1100了。
盗自编程随想的博客
# 对现有p2p的一些吐槽
看完上面的例子,你可能会想,一开始如果我一个人都不认识,那怎么办?答案是凉拌,是没有办法的,DHT网络就像一个封闭的社团,没有介绍人是进不去的。
从理论上,只要我进去了我便能找到DHT网络里任意一个节点。但实际上我的使用体验却不是这样。例如如果我用磁力链接来下载,如果是比较热门的,我还是很容易把bt文件下载下来。但是对于一些做种数量较少的磁力链接,往往是怎么等待都等不到bt文件下载下来的那一天。那是不是在DHT网络里已经没人做种,所以我下载不了bt文件,或者是我自己无法连接到做种人,把bt文件下载下来。我个人经历是都不是的。怎么等都等不了bt文件下载下来的磁力链接,如果我改换成bt文件来下载,往往是有人做种,并且我也是能连接上的。所以这就非常奇怪。
另外,如果我无法直接连接上做种者,例如都在NAT里,就真鸡儿可惜。如果能有类似中转的功能,找一个我能连接上,他也能连接上的第三方中转数据,哪怕慢一点也是有速度呀。
感觉呀,不再使用Tracker服务器,完全靠DHT之后,发布磁力链接的网站本身就会成为重点打击对象了。因此DHT网络里的文件交流还是依赖与外部,文件的发布既不去中心化也不统一,很大程度上阻碍了数据的流通。
参考文献