新时期的资源帝战术研讨

96
逸之 5203a3bf 1c0f 41db a6f0 31ddb4a929cb
0.3 2015.12.10 13:43* 字数 3927

近年来,国内网络版权维护的力度逐步加大,从“净网行动”严查网盘分享内容、直致快播于死地,到广电封杀电视盒子,再到版权局严令未经授权的云音乐全面下架,政府的一系列举措让高枕无忧地享受了几十年免费内容的网民们终于幡然醒悟——现在是动真格的了。

技术的进步永远超前于政策和法律,就如同医学的发展永远超前于伦理。本着互联网的开放精神,这么多年来,国内的互联网产品商前赴后继,为用户获取免费资源提供了极大的便利。想想曾经,优酷土豆上电影电视剧应有尽有,百度音乐歌曲随便下,115上的动画可以疯狂地塞满硬盘,种子搜索网站遍地开花……

保护版权是好事,但对于一个普通用户(消费者)来说,现在要追个剧、看个综艺节目、听个音乐,得去好几个地方,手机上要装好几个APP,一些冷门资源则根本没有正规门路,而对于笔者这样的资源控,更是习惯把文件下载下来,不亲手拿到总觉得没有安全感,也满足不了自己的收藏欲,而且鉴于国内现在的网速,在线观影的清晰度实在不给力,流媒体的回看、快进也并不方便。

是的,好东西,要放在自己硬盘里才是王道。怎么获取呢?当然靠网盘。

为什么要用网盘?

网盘是云时代带来的超强神器,如果你到现在都还没用过,真该好好地自我检讨,即使你不是个收藏控,也对冷门资源毫无兴趣,至少也该利用网盘备份一些自己的资料、和朋友共享一些内容。

为什么说网盘是神器?作为以服务器为物理介质的云存储服务,网盘与PC本地硬盘的机理和用户体验并不相同。除却冗余备份这些尚不能直观感受到的特性,网盘最强大的一点,也是令人最爱不释手的一点,就是秒传机制。如果云端已经存在某个文件,那么我们将其上传至网盘的耗时是秒级的,该情况下的上传速度跟网速几乎没有关系。即便你家是2M的ASDL宽带,照样瞬间上传。

这一机制的实现依靠的是hash(哈希)算法,在云端,每个文件都有着一个独一无二的hash值,判断两个文件是否相同,只需判断其hash值是否相同。hash算法有许多种,任何一种计算文件hash值的算法所追求的都是使结果唯一。举个最简单的例子——取余:

1%7 = 1

9%7 = 2

2015%7 = 6

2013201420152016%7 = 3

不论多长的数,经过取余运算,最终结果(即hash值)都是一个小于7的非负整数。在这个例子中,明显存在着不同数据的hash值相同的情况,比如10和2013201420152016的hash值都是3,这一算法只能生成7个不同的hash值(0~6),因此只能标记7个不同的数据。

云存储所采用的hash算法明显要复杂得多,以著名的MD5算法(信息摘要算法第五版)为例,任何数据或文件(文件本来就由数据组成)经过MD5算法运算,均生成一个长度为128位的二进制数,其hash值就可以有2^128个(约340万亿亿亿亿),如果以MD5码作为文件的唯一标识,那么基本允许全球(按70亿人口算)每人拥有近5万亿亿亿个互不相同的文件。这些都是天文数字,以目前的情况看,世界上的文件再多,也不可能达到这个数目。类似的hash算法有许多,它们都力求保证不同文件拥有不同的hash值。

(在文件系统允许的情况下)一个文件的大小可以是任意的,可以只有几K,也可以有好几十G,但其所对应的hash值总是只有那么长(如MD5码永远只有128位),在网络上进行文件传输时,传hash值比传文件本身要便捷得多。网盘就是利用这一原理,在保存文件的同时保存着它们的hash值,在用户上传文件时,先计算文件的hash值,在云端搜索是否存在相同的hash,若存在,则说明服务器已有这个文件,就不需要真正地上传,只需在用户的网盘里提供一个链接,让用户误以为文件已经上传成功(事实上上传的仅仅是这个文件的hash值)。

有了这一功能,我们备份电影、动画、游戏的时候,就无需忍受每秒几十KB的上传速度。硬盘里放不下,又舍不得丢掉的资源,都可以尽情地留在网盘。而别人分享的文件,则可以瞬间转存到自己的网盘里,想什么时候下就什么时候下,不怕丢失。

同时也正是由于这一机制,网盘才得以拥有强大的离线下载功能。离线下载通常支持BT种子和链接两种模式,用迅雷拖种慢得要你相信,而挂到网盘却可以瞬间搞定,直接秒杀迅雷会员。其原理十分简单,就是看种子(或链接)里的文件是否已经存在于服务器,已经有了就不需要再慢慢地获取。(当然迅雷会员的离线下载也是同一原理,但迅雷要钱,网盘免费,你说用哪个。)

离线下载的诡异现象

BT种子也是之前针对资源共享的一个伟大发明,其宗旨是去中心化,让用户可以点对点进行文件传输,不再需要服务器,文件存在于甲乙丙丁的个人电脑上,他们做种,你就可以去复制过来。

网盘与种子的结合更是强强联手,我们不再需要挂着下载软件苦等别人做种,别人一关机就根本没有速度。使用网盘的离线下载功能,可以瞬间将种子里的资源保存到自己的网盘,而后从网盘上下载,即便不是满带宽,速度也至少不会消失。

网盘最早推出时,下载速度通常都是满带宽,这是用户直接从服务器下载的原因。但发展到现在,网盘的下载速度不比以往了,由于其机制没有公开,只能猜测几点原因:

1、为了减轻服务器压力,动态限制了每个用户的下载带宽;

2、在P2P机制的辅助下,有些情况下服务器不作为下载源;

3、为了赚钱,你开通会员,我就让你满带宽下载。

但是这里的重点不在于谈论如何使用离线下载搞定高清资源,也不是推荐BT天堂ed2kersed2000放放电影一生有你BT之家这些随时可能被查抄的资源搜索站,而是如何在当今这样一个艰苦的环境下,继续网友间的资源共享,如何自己动手,互惠互利。

现在各大网盘都限制了分享功能,比如在百度云,绝大部分电影电视剧都已经无法分享,其服务器上维护着一个所有盗版影视文件的hash值的列表,这是一个黑名单,黑名单中的文件一分享就会立马被屏蔽,而115的分享功能免费用户根本无权使用,金山的外链服务器干脆永远都在维护。其他网盘我用得不多,想必也并不会好到哪去。

网络上大量的度盘分享一夜间都成了这个样子。通常为了避免被屏蔽,可以将文件打成加密压缩包,但对大文件并不适用。
115往昔犀利的两个分享途径都已成为VIP的专利

天真如我一直以为,在网盘上挂种子,只要云端有资源,离线下载就能瞬间成功。于是即便网盘无法直接分享,只要在网上找到种子,就可以毫无阻碍地拿到资源,我想给别人分享,也只需要自制种子就行。直到前不久的某一天,我在百度云上挂的一个离线怎么也没有速度,想着可能云端没有资源,服务器正在别处寻找,但后来有机会从别人那儿直接转存到了相同的文件,云端明明就有,而离线却依然没有速度。这究竟是怎么回事呢?

我开始实验,用μTorrent软件制作一些网盘上已有文件的种子,有些离线成功,有些则永远找不到资源,不同网盘的表现还不尽相同。我将自己硬盘里独一无二的文件上传到网盘,制成种子进行离线,则没有一个能成功。这一现象让我深感困惑,难道网盘的离线下载并没有将种子与云端已有的文件进行hash匹配吗?

我思考许久,突然茅塞顿开:BT种子采用的hash算法是SHA-1,谁说网盘服务器里文件对应的hash码就是SHA-1码!实验证明,每个网盘都有着自己的hash算法,它们没有义务再另外去计算每个文件的SHA-1码。

那么为什么有些种子挂离线就能成功呢?那是最初,在有人做种的情况下,网盘拿到了种子里的文件,并把种子和文件的对应关系记录了下来。在这之后,网盘才能根据种子在云端找到现成的资源。

用户挂离线下载时,服务器会先在文件-SHA-1表中查询:如果找到,就可以将对应的文件直接存到用户网盘;如果没找到,就需要到网络的其他地方寻找正在做种的机子。PS:即便事实上文件存在,其SHA-1码为空,服务器就无法判断。
找到做种的机子后,就从那里下载文件到服务器——此时是真的下载,不是hash匹配——下载完后,使用自有的算法计算文件hash值,查表,看这文件是不是已经存在,将其SHA-1填入表中。PS:下次有用户离线该种子就能直接在表中找到,可以瞬间转存。

可见,即便是强大的网盘,也并不能确保每个种子都离线成功,要是没人做种,即使云端有资源,你也永远都拿不到。

这就意味着,我想共享一个资源,将其做成种子是不靠谱的,毕竟亲自做种还是很麻烦的。退而求其次,百度云的好友可以无限制地互相分享,但是我们不可能让每个资源发布者和跪求者都加成好友。

究竟还有没有其他办法呢?

在测试种子离线时,我也测试了磁力链接。磁力链接是对BT种子的优化,种子本身是一个文件,而磁链是一串字符,更容易传播,也更易于避免被和谐。事实上磁链中保存的也是一个hash码,通常我们见到的磁链形式是这样的:

magnet:?xt=urn:btih:33LXETSPT2GTR6ZZ4VH3TELXBYSSFU7Y

其中“33LXETSPT2GTR6ZZ4VH3TELXBYSSFU7Y”就是hash值,此处的hash算法是BTIH(BitTorrent Info Hash),BTIH实际上是对SHA-1信息字段的hash值,也就是说,每个BTIH磁链都是与一个特定的种子文件相关联的。我们在使用这些磁链时,网盘后台会去尝试寻找与其对应的种子文件,最终的离线下载还是靠的种子。网盘隐藏了这一步骤,但是在迅雷里就一目了然:

在迅雷里新建磁链下载,最先出现的是根据磁链获取种子文件的界面

那么是不是就走投无路了呢?别急,磁链有很多种,电驴磁链(ed2k)就不需要依托种子,其hash码是针对资源文件本身计算出来的,也就是说,电驴磁链与文件一一对应。于是我们是否可以靠它来突破网盘的分享限制呢?

ed2k使用混合MD4算法,只支持对单个文件进行编码,正好一一对应,但是我们仍然不能妄想网盘会维护云端每个文件的ed2k码。然而即便只有一线希望也不能轻易,于是我使用eMule LinkCreator软件,生成了一个本地文件的ed2k磁链:

ed2k://|file|3.txt|648|1DC437533C342D4531A9E0986A73E6DC|h=PFWKEORT7MY4ITQUEWHQUXUM3T6LKZXR|/

(为保护隐私,偷偷改动了一下,所以现在这个磁链是不能用的。)

格式是这样的:

ed2k://|file|文件名|文件大小|混合MD4码|h=用于修正文件损坏的根哈希值|/

这是我自己创建的一个文件,云端绝对没有。当我将其上传到百度云,然后挂磁链离线,并没有任何反应。但是当我将其上传到115,挂磁链离线,奇迹出现了,真的转存成功了!

这证明一点:115在上传文件时会计算其ed2k码并维护在服务器的表中,而百度却并没有这么做。(从这点隐藏极深的差异,就可以看出115做产品确实更用心。)

然后我试了许多文件,皆完美离线,在别人的115上也能离线到我的文件,这是多么令人振奋的一件事啊!以后我可以随心所欲地分享文件,绕过网盘的一切限制!

(咳,除非115哪天脑子抽筋封禁这个擦边球……)

不单是我个人的文件,云端的影视资源,同样可以完美离线,比如我生成了自己手头《碟中谍5》的磁链:

ed2k://|file|碟中谍系列:[2015][7.8]碟中谍5:神秘国度.mkv|7517011186|DE3ACB4715A116B5A72FFE65BFBD4E49|h=KYTLQFVBICOTNKK6W7X2V65FAZKRKOK2|/

(没错,这个磁链是可以用的,有115的朋友可以试一下。)

但并不是所有影视资源都能顺利离线,可以认为115在早前并没有维护文件的ed2k码,后来随着ed2k离线功能的推出,才开始计算新上传文件的ed2k码,以前的老文件,即便现在重新上传也不会计算ed2k——个人认为这一点应该改进,也许只是程序员并没有考虑这么周到。

好了,不多说了,我要去贴吧发资源了。

参考资料

B编码以及BT种子文件分析 - 博客园

Magnet URI scheme - 维基百科

ed2k - 百度百科

DO IT计算机科普
Web note ad 1