序、简介

BitTorrent (BT种子)

1、介绍

BitTorrent 是一个文件传输协议,每个用户在下载资源的同时,还能自己作为源向其他下载用户提供已下载的数据,从而整体提高下载速度。而 FTP、HTTP 协议中,每个用户在下载文件的时候,各用户之间是没有交互的。在当资源服务器的下载用户非常多,数据流吞吐量达到服务器的处理能力或者带宽的极限的时候,就需要用户等待,导致下载速度急剧下降,甚至服务器可能因为不能及时处理用户下载请求,导致用户访问服务器失败。

BT 协议与 FTP 协议不同,特点是下载的人越多,下载速度越快,原因在于每个用户将已下载的数据提供给其他用户下载,分担了资源服务器的访问压力,充分利用了用户的上载带宽。其速度上限理论上取决于自家的带宽。

2、技术依靠

Bit Torrent 是依赖于一种叫 peer-to-peer (P2P) 的技术。其主要的优点在于:

  • 对等性高:非中心化;
  • 扩展性强:用户扩展与资源、服务、系统同步扩展;
  • 健壮性高:服务分散和自适应,耐攻击、高容错;
  • 性价比高:P2P成本低,存储和技术能力强;
  • 负载均衡:分布存储和技术,整个网络负载得以均衡

因为在 P2P 网络中,每个用户节点既是服务器也是客户端,既是数据的提供者也是数据的消费者。

3、原理

普通的 HTTP/FTP 下载使用的是 TCP/IP 协议,而 BitTorrent 是基于 TCP/IP 协议之上的一个 P2P 文件传输协议,处于 TCP/IP 结构的应用层。根据 BitTorrent 协议,文件发布者会根据要发布的文件生成并提供一个 .torrent 文件,即我们常说的种子文件,“种子”。但 .torrent 文件本质上是一个文本文件,包含了 Tracker 信息文件信息两个部分。Tracker 信息主要是 BT 下载中需要用到的 Tracker 服务器地址和针对 Tracker 服务器的设置;文件信息是根据对目标文件的计算生成的,计算结果根据 BitTorrent 协议内的 B 编码规则进行编码。它主要原理是把文件虚拟分成大小相等的块,块大小必须为 2k 整数次方,并把每个块的索引信息和 Hash 验证码写入种子文件 (.torrent) 中。所以,种子文件就是这个文件的下载“索引”。

4、下载过程

得到 .torrent 种子文件后,使用 BT 客户端软件进行下载。

下载时,BT 客户端首先会解析 .torrent 文件得到 Tracker 服务器地址,然后根据地址连接 Tracker 服务器。Tracker 服务器回应请求后,会提供其他下载者的 IP 地址。这时候用户会根据这些 IP 与其他用户进行交互,根据 .torrent 文件,两者分别告诉对方自己已经下载完成的块,并且交换对方没有的数据块。这个过程不需要其他的服务器参与,主要是不需要资源服务器的参与,分散了单个线路上的数据流量,因此就减轻了服务器的负担。

用户下载完一个资源块后,需要计算出每个块的 Hash 验证码并与 .torrent 文件里文件信息中记录的 Hash 验证码进行对比。如果一样则说明资源块正确,不一样则需要重新下载这个块(感觉可以做文章)。这种规定是为了解决下载内容的准确性问题。

N、后记:

为什么 BT 有时候下载速度并不快甚至不能下载了,这是有原因的:

  1. 不是公网用户。由于内网用户无法提供主动连接,下载速度肯定比公网用户慢
  2. 上传速度被限制。由于所有的 BT 客户端程序都对上传速度快的用户提供优先服务,因此如果对上传速度进行限制,实际上也就变相限制了下载速度
  3. 种子数太少。如果种子数太少,就会影响到其他用户的下载速度,甚至下载不了(种子数为0,连原始种子都没了),这是需要每一个 BT 用户发扬“雷锋”精神,下载完后不要暂停“做种”行为
  4. 防火墙的阻隔。防火墙软件也会对 BT 的下载速度造成一定影响

MagNet(磁力链接)

1、简介

MagNet 协议,也就是磁力链接。以前的 BT 下载服务是需要一个 Tracker 服务器来存储 BT 种子文件,但是 MagNet URI 协议是不一定需要 Tracker 的。MagNet每次连接的源都是不固定的,因此也就没法查封源头。它会根据文件内容的 Hash 生成一个独特的指纹。这样,任何拥有该文件的人可以生成基于文件内容的指纹。它的另一个优势就是跨平台,因为是以普通文本存在,因此可以简单的复制粘贴完成传递。

2、技术依靠

MagNet 不需要 Tracker 服务器,不需要 .torrent 文件,仅需要一连串字符就可以进行文件下载,依靠的就是 DHT 技术和 PEX 技术。

DHT

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

PEX

PEX(Peer Exchange,节点信息交换),是提供高效寻址的一种方法,用于改善 BT 下载技术(去中心化),常用于 DHT 网络之中。

3、原理

DHT+PEX 解决了 BT “寻址” 问题,但是如何告诉 BT 客户端找些什么则需要另外解决。在 .torrent 文件中对应这部分的内容就是 文件信息,这部分信息就是用户真正想要下载的文件的特征信息,或成为“电子指纹”。MagNet 并没有将电子指纹存储到 .torrent 之类的文件中,而是放在了 MagNet Link 中。

格式为:magnet:?xl=[字节大小]&dn=[文件名(已编码URL)]&xt=urn:btih:[ BitTorrent Info Hash (Hex) ]

例如:

magnet:?xt=urn:btih:36684b463ca2aa2f9347b18e9f6b1a9090bdb073&dn=Microsoft+iSCSI+Initiator

分部解析说明一下这一行串串。

  • magnet: 协议名
  • xt: exact topic 的缩写,表示资源定位点。BTIH(BitTorrent Info Hash) 表示哈希方法名,这里还可以使用 SHA1 和 MD5。这个值是文件的标识符,必须项
  • dn: display name 的缩写,表示向用户显示的文件名,可选项
  • tr: tracker 的缩写,表示 tracker 服务器的地址,可选项

简化这个串串,仅需要到 xt 就足够了:

magnet:?xt=urn:btih:36684b463ca2aa2f9347b18e9f6b1a9090bdb073

附加 dn 是为了在使用上更方便一些。

MagNet Links 的好处包括两点:网络的可靠性得到了极大的加强;不存在“被拔线”的风险。由于不存在中央节点,审查将比较困难。此外 MagNet URI 只是一个字符串,非常容易传播,很难禁止。因此 MagNet URI 将会慢慢取代 Tracker 模式。

4、下载过程

可从 DHT+PEX+MagNet Link 模式中,能看出一个问题——BT 客户端的“第一步是怎么进行的”?解决这个问题依然需要一台服务器(bootstrap node),但这台服务器的作用与 Tracker 服务器不同,它仅负责提供最初的一步:资源在这里地址,而用户找到这个最初的地址,就能下载这个地址的数据;如果这个地址只存在一部分的数据,但有其他数据的地址,这时候就通过寻址,继续找到下一部分资源的另一个地址,在另一个地址中继续下载。

参考:https://blog.csdn.net/u012785382/article/details/70674875


 

Thunder(迅雷下载)

thunder://后面的一连串无意义的字符串实际上是把原始 URL 经过 RFC3548 标准编码得到的,于是通过解码实际上可以直接得到正确的 URL 地址,虽然会多出一些 AA,ZZ 之类的字符,不过很好辨认。

例如:

在一台 Linux 系统中敲以下代码解码:

可以得到:

去掉明显的 AA 和 ZZ,就能得到这个迅雷链接对应的原始地址 ftp://dygod1:dygod1@d131.dygod.cn:3049/非诚勿扰DVDscr/[电影天堂www.dygod.cn]非诚勿扰cd1.rmvb 

 

一、详细解析

Part1 – BitTorrent

上述已经将原理粗略介绍了一番,接下来就是真正的解析了。我们可以深入探查一下 .torrent 文件是什么样子的。

结构

Torrent 文件内的数据结构分为以下几个部分:

根据以上,可分别得到多文件和单文件Torrent的树形结构图:

实例讲解

使用工具:WinHex、BT客户端(μTorrent)

简单的工具介绍 – WinHex

来源:百度百科

WinHex 是一款以通用的 16 进制编织器为核心,专门用来对付计算机取证、数据恢复、低级数据处理、IT安全性、各种日常紧急情况的高级工具:用来检查和修复各种文件、恢复删除文件、硬盘损坏、数码相机卡损坏造成的损失等。

  • 支持查看、编辑、修复磁盘(硬盘、软盘和其他可存储介质)
  • 支持 FAT12/16/32,exFAT,NTFS,Ext2/3/4、Next3、CDFS、UDF
  • 内置 RAID 和动态磁盘分析器
  • RAM 编辑器,可直接查看/编辑被调试程序的虚拟内存
  • 数据解释器,精通 20 种数据类型
  • 能使用模板编辑数据结构
  • 支持连接,分割,合并,分析和比较文件
  • 智能搜索和替换功能,如果替换字符大于/小于原始字符时可进行选择性操作
  • 不同驱动器克隆以及驱动器镜像解释
  • 脚本和应用程序接口(API)
  • 用于文件和磁盘的成熟的撤销和备份机制
  • 加密和解密数据,Hash计算(校验和,CRC32,MD5,SHA-1,…)
  • 粉碎文件和磁盘数据,粉碎后的文件和磁盘数据任何人都不可能恢复
  • 支持所有剪贴板格式导入
  • 数据格式转换,支持2进制,16进制ASCII,Intel 16进制,Motorola-S等数据之间的相互转换
  • 隐藏数据和查找隐藏数据
  • 支持打开超过 4GB 的文件,而且速度很快
  • 用于计算机进程的众多显著有效的高级功能

注:只能运行在Windows平台上

准备好的文件有三个:

目录结构为:

通过 μTorrent 制作出的 Torrent 文件名为 torrentExample1.torrent,大小为 577 Byte,分块设置为 8192KB

以下使用 WinHex 打开这个 torrent 的样子:

由上图可以整理信息得到对应的树状图:

pieces 项是由于设置为 8M 的文件分块,而总文件加起来不到 8M,因此是三个文件混合成一块来计算的 SHA1 值。所以先将三个文件用 2 进制方式合并成一个,再计算 SHA1 值得出的结果。

Part2 – MagNet

要得到 MagNet 的一串字符串,首先还是得先把种子文件做出来,毕竟 MagNet 也是 BT 的一种,简单的就是将 .torrent 中的 info – pieces 这一项的 Hash 码作为“电子指纹”,在前面加上 magnet:?xt=urn:btih: 就可以了,如:

每个支持磁链的下载器,都有自己的一个种子库,根据这个磁力链接,最先找寻的是该软件官方的种子库,根据这个“电子指纹”,找到库中配对的 .torrent 种子文件,获得更详细的资源信息后,再进行下载的步骤。(下文方法 2 的转换策略)

不然就会出现,正在找寻种子文件中,这里用迅雷作为例子:

用 MagNet 直接转换为种子文件就不那么简单了,因为 SHA1 算法是不可逆的,这里提出几种策略。

1、利用 BT 的官方协议获取

这种方法可以获得最多的种子,但是速度会很慢。因为是官方的种子,可靠性很高,不会随便就没掉,但如果这个种子是一个冷门种子时,很可能会获取不到或者速度很慢(原因可见上文原理)。因为当前没有 DHT 用户在线,所以当使用迅雷、μTorrent 等客户端提示无法获取种子时,可能要等一段时间,待对应种子的用户上限,加入了 DHT 网络后,才能得到种子了。

2、从迅雷的种子库获取

这种方法获取种子的速度很快,因为是直接搜寻迅雷的种子库,一旦获取到种子,就可立刻进行下载。要是迅雷的种子库没有的话,再使用第一种方法获取。

获取的方法很简单:在浏览器中输入 http://bt.box.n0808.com/05/A5/05153F611B337A378F73F0D32D2C16D362D06BA5.torrent

其中的一串字符串是对应种子文件的 info Hash 码,也就是磁链的 btih 字段,/05 /A5 是这段 Hash 的第一个和最后一个字节(这是库中的分类机制,可不予深究)。

3、从比特彗星的种子库获取

这种方法的种子库比迅雷的种子库丰富很多,这是因为比特彗星客户端是可以制作种子,并在制作的同时可能就上传到官方库里面了。(这里可能安全隐患问题)

参考文献:https://blog.csdn.net/qq_37960324/article/details/82830933

 

小结

其实实际中,在各种下载软件客户端的磁力链接中,都是先通过磁力链接得到种子文件,再用种子文件进行常规下载。因为种子文件才有分片信息、文件大小、文件名等必要信息,所以看出,种子其实必不可少。而现在之所以用磁力链接,是因为现在对 BT 的封锁太严重了,直接传播种子变得不那么容易了,很容易就被和谐,所以磁力链接的作用就是便于传输,利用它的特性,难以追溯源头,并且本身只是一个字符串,有利于传播。两种方式的特点:

A、种子:稳定性高,信息多,不便于传播

B、磁链:不稳定,便于传播

因此,大部分下载都是结合两种方法的。