除去目前主流的http/https的下载协议之外,相信许多人对“过时”的BitTorrent有所耳闻,本文便浅谈BitTorrent(下文中简称为BT)这一传输协议。

技术与原理

简单来讲,作为一个互联网用户,来获取互联网上的资源,目前最为广泛的下载方式大致可以看作是服务器→用户的一个过程

而BT下载的过程可以看作为用户→用户的一个网状结构。在共享同一个资源时,首先会将一份资源分成若干片,网中的每一个节点用户会在别的用户那里获得自己没有的片段,同时会将自己的片段分享给其他用户。

当然以上只是对原理的简单概括,更为详细的过程如下

种子文件

用户首先选择需要共享的文件或文件夹。通过BT客户端软件,将文件分割成多个固定大小的数据块。

随后BT客户端会生成一个种子文件(扩展名为.torrent)。种子文件仅包含了文件的元数据:如文件名、大小、文件的哈希值(用于校验数据完整性)以及Tracker的地址。

其中Tracker服务器的作用是在BitTorrent网络中协助文件的分发,它维护了一个活动peer列表,帮助每一个下载者找到其他拥有文件片段的用户。

随后用户便可以作为该资源的分享者,将种子文件分享给别的用户

实际上,除了种子文件之外,还存在一种分享方式:磁力链接

磁力链实际上是提取自种子文件哈希,再加上一段协议头组成的,以下是一个例子

magnet:?xt=urn:btih:3f11b26c738a374acf78d3def4067e37d91d5f67

以上一个是Ubuntu系统镜像文件的磁力链接,作为本文的例子

磁力链接组成

协议头

magnet:?xt=urn:btih:

磁力链接的固定前缀,表示这是一个磁力链接协议的资源标识符。类似于HTTP链接中的http://用于标识链接的类型和协议。

磁力链接的核心部分,指定文件的哈希值(Hash),是定位文件的关键信息。

哈希

3f11b26c738a374acf78d3def4067e37d91d5f67

一般为40为16位数组成,根据算法不同位数可能不同。是资源的唯一标识。

可选参数

除了上述主要部分,磁力链接尾部还可以包含多个可选参数,用于提供额外信息:

dn=(Display Name)
  • 含义:表示文件的显示名称。

  • 作用:当下载文件时,客户端会使用这个名称来显示文件名,而不是直接使用哈希值。

  • 格式dn=<文件名>,文件名通常会进行URL编码。

tr=(Tracker)
  • 含义:指定Tracker服务器的地址。

  • 作用:Tracker服务器用于协调P2P网络中的节点,帮助客户端找到其他正在共享文件的用户。

  • 格式tr=<Tracker地址>,可以有多个tr参数,每个地址用&分隔。

xl=(Exact Length)
  • 含义:表示文件的精确大小。

  • 作用:帮助客户端在下载过程中验证文件的完整性。

  • 格式xl=<文件大小>,单位为字节。

xs=(eXtended Search)
  • 含义:用于扩展搜索,通常包含文件的其他信息。

  • 作用:在某些情况下,用于优化搜索或提供额外的元数据。

Tracker服务器

在生成的种子或者磁链中,保存了Tracker服务器的信息

所谓Tracker服务器,主要作用就是帮助用户获取其他正在上传/下载文件的用户

当用户打开种子文件时,BT客户端会根据种子文件中的Tracker服务器地址,向Tracker服务器发送请求,告知自己正在下载该文件,并请求获取其他正在下载或上传该文件的节点列表。

Tracker服务器会返回一个包含其他节点IP地址和端口号的列表。这些节点可能是正在下载文件的用户,也可能是已经下载完成并正在上传文件的用户

DHT技术

除了传统的Tracker服务器,BT协议还支持DHT技术。DHT是一种去中心化的节点发现机制,它允许节点在没有Tracker服务器的情况下,通过分布式网络找到其他节点。

DHT网络中的每个节点都维护一个哈希表,记录其他节点的IP地址和端口号。当一个节点需要查找其他节点时,它会通过DHT网络进行查询,而不是依赖于Tracker服务器。这使得BT网络更加健壮,即使Tracker服务器不可用,下载过程仍然可以继续。

P2P连接传输

用户通过Tracker服务器获取到其他节点信息后,会和这些用户建立直接的连接进行传输。

一旦连接建立,节点之间会根据BT协议进行数据交换。每个节点会根据自己的需求请求其他节点拥有的分块,并将自己已有的分块上传给其他节点。这种多对多的传输方式使得文件的下载速度不再依赖于单一的服务器,而是依赖于整个网络中所有节点的上传能力,换句话说,上传的人越多,带宽越大,下载就越快。

当然,为了鼓励用户上传数据,BT协议采用了一种“公平交换”机制。如果一个节点不上传数据,其他节点可能会限制对其的下载速度。

做种

做种是指在下载完成后,继续将文件上传给其他需要下载该文件的用户的过程。

做种是BT网络能够持续运行的关键。只有足够的用户做种,文件才能被更多人快速下载。

为了BT环境的持续发展,请至少使分享率达到1再停止做种

分享率(Share Ratio)

定义:分享率是指用户上传的数据量与下载的数据量的比值。计算公式为:

分享率=上传量/上传量​

分享率越高,说明用户对BT网络的贡献越大。通常,分享率达到1.0(即上传量等于下载量)被认为是合理的,但更高的分享率更受鼓励。

BT环境的生态健康

吸血

简单的概括一下,吸血即是用户“只下载不上传”的行为

最为典型的案例就是迅雷客户端,这种行为违反了BT网络的共享精神

迅雷通过限制上传对象方式,在其他客户端获取到下载资源后,仅反馈给使用迅雷客户端用户上传资源(会诱导用户充值VIP来提高下载速度),不会反馈给其他客户端任何下载进度。

除此之外还有类似的百度的离线下载,Xfplayer等客户端

这种行为严重破坏了BT生态,为了维护BT生态健康发展,我们有义务抵制吸血行为

辩证的讲,迅雷会将用户下载的资源存储在其服务器上,可以

这个qBitterroot客户端的Fork可以有效防止吸血

此外,可以通过这篇贴文了解防范pcdn吸血的手段

盗版

BT下载的特性决定了其不存在对资源的审查机制,也会助长一些盗版作品传播

希望大家在能力范围多支持正版,为创作者提供创作的动力

结语

尽管BT协议在发展过程中面临诸多争议和挑战,但它所展现的去中心化、共享协作的互联网精神依然值得我们关注。这种精神体现了互联网的本质——通过技术的力量,打破信息壁垒,让每一个用户都能成为资源的创造者和分享者。