Cointime

扫码下载App
iOS & Android

BitTorrent 长文解读:下载方式/ 片段选择算法/ Tracker / 网络攻击

个人专家

作者:Autumn Skerritt 编译:Cointime Lu Tian

BitTorrent是用于传输大文件的最常见协议之一。截至2013年2月,BitTorrent在全球带宽占比达到3.35%,超过了总带宽中超过一半的文件共享比例。

BitTorrent的创始人

BitTorrent协议由布拉姆·科恩(Bram Cohen)于2001年发明。科恩用Python编写了第一个客户端实现。

为了吸引测试人员使用BitTorrent,科恩在2002年夏收集了免费的色情作品。

BitTorrent与客户端-服务器下载的区别

在传统下载方式中,服务器负责上传文件,客户端进行下载。对于热门文件,这种方法效率不高。

500人同时下载同一个文件会给服务器带来巨大压力。这种压力限制了上传速度,导致客户端无法快速下载文件。

此外,客户端-服务器下载方式需要大量资金。用户支付的费用与文件的受欢迎程度成正比。

最后,这种方式是集中式的。假如系统崩溃,文件将不再存在,无法下载。

BitTorrent旨在解决这些问题。

在点对点网络中,每个节点与网络中的其他节点相连。

半集中式的点对点网络中,一个或多个节点拥有比大多数节点更高的权限。

BitTorrent 概述

BitTorrent是一种文件共享方式,通常用于传输大型文件。它是一种替代单一来源(如服务器)共享文件的方法,可以在较低带宽上高效运行。

最初的BitTorrent客户端没有搜索引擎和对等交换功能。想要上传文件的用户必须创建一个小型种子描述文件,并将其上传到种子索引站点。

当用户想要共享一个文件时,他们会提供种子文件,这个用户被称为种子。他们将种子描述文件上传到一个交换站点(稍后详述)。任何想要下载该文件的人都会下载此种子描述文件。

下载的用户被称为对等方。他们的BitTorrent客户端将连接到一个追踪器(稍后详述),追踪器会发送包含种子和对等方IP地址列表的信息给他们。种子表示与某个种子相关的所有计算机。

种子描述文件包含了追踪器列表以及我们正在下载的文件的元数据。

一个节点会连接到一个种子并下载文件的部分内容。一旦节点完成下载,它们也可以作为种子继续分享文件。实际上,节点在下载的同时充当种子非常常见。

当一个种子与一个节点分享文件后,该节点将成为一个种子。与仅有一个服务器上传文件的客户端-服务器模型不同,在BitTorrent中,多个人可以同时上传同一个文件。

BitTorrent会将文件分割成称为块(pieces)的片段,每个片段具有一定的大小,有时是256KB,有时是1MB。每个节点接收到一个片段后,它们就成为该片段的种子,供其他节点下载。

在BitTorrent中,我们不需要从单一来源下载文件。我们可以从自己国家的节点下载几个片段,然后从远离的国家下载本国节点没有的片段。

协议对这些片段进行哈希处理,以确保没有种子对原始文件进行篡改。然后将哈希存储在跟踪器上的种子描述符中。

这是BitTorrent工作原理的高级概述。接下来,我们将深入讨论并回答以下问题:

  • 如果一个节点只下载而不上传会发生什么?
  • 我们从谁下载,向谁上传?
  • 什么是磁力链接(magnet link)?
  • 什么是种子描述符(torrent descriptor)?
  • 使用了什么哈希算法?
  • BitTorrent如何选择要下载的片段?
  • 等等。

Torrent 描述符文件中有什么?

它是一个字典(或哈希映射)文件。

该文件描述如下:

  • Announce(公告):跟踪器的URL。还记得我们之前是通过种子描述符文件中的announce键来找到跟踪器服务器以寻找其他使用相同文件的节点吗?
  • Info(信息):这个键对应一个字典,其键取决于是否共享一个或多个文件。这些键包括:Files(文件)(位于info的子级,是一个列表):只有在共享多个文件时才存在。Files是一个字典列表,每个字典对应一个文件。每个字典有两个键。Length(长度):文件的大小(以字节为单位)。Path(路径):一个字符串列表,对应子目录名称,其中最后一个字符串是实际的文件名。Length(长度):文件的大小(以字节为单位)(仅在共享单个文件时存在)。Name(名称):建议的文件名或目录名称。Pieces length(片段长度):每个片段的字节数。
  • Files(文件)(位于info的子级,是一个列表):只有在共享多个文件时才存在。Files是一个字典列表,每个字典对应一个文件。每个字典有两个键。Length(长度):文件的大小(以字节为单位)。Path(路径):一个字符串列表,对应子目录名称,其中最后一个字符串是实际的文件名。
  • Length(长度):文件的大小(以字节为单位)。
  • Path(路径):一个字符串列表,对应子目录名称,其中最后一个字符串是实际的文件名。
  • Length(长度):文件的大小(以字节为单位)(仅在共享单个文件时存在)。
  • Name(名称):建议的文件名或目录名称。
  • Pieces length(片段长度):每个片段的字节数。

片段的长度必须是2的幂,并且至少为16KiB。

  • Pieces(片段):一个哈希列表。一个由不同数据块计算出的哈希列表。我们将数据分割成片段,为这些片段计算哈希值,并将其存储在列表中。BitTorrent使用SHA-1哈希算法,返回一个160位的哈希值。Pieces将是一个字符串,其长度是20字节的倍数。

如果种子包含多个文件,则将文件按照它们在文件目录中的出现顺序进行串联形成片段。

种子中的所有片段都是完整的片段长度,除了最后一个可能会更短。

现在,您可能在想:“SHA-1?这是什么?早期的2000年代吗?” 我同意。BitTorrent正在从SHA-1迁移到SHA256。

BitTorrent的片段选择算法

BitTorrent中最重要的问题之一是:“我应该选择下载哪些片段?”

在传统的客户端-服务器模型中,我们下载整个文件。但是现在,我们可以选择要下载的片段。

我们的目标是下载其他人没有的片段,即稀缺的片段。通过下载稀缺的片段并上传它们,使它们变得不再稀缺。

子片段与片段选择算法:BitTorrent协议的优化与策略

BitTorrent使用传输控制协议(TCP),这是一种数据包传输协议。TCP具有一种名为慢启动的机制,用于平衡TCP网络连接速度。慢启动逐渐增加传输的数据量,以找到网络的最大承载能力。cwnd表示拥塞窗口(Congestion Window)。

TCP之所以这样做,是为了避免同时发送过多连接,可能导致服务器无法处理这样的流量,从而引发网络拥塞。如果数据传输不稳定,TCP可能会以低于正常速度的速度限制网络连接。

为了确保始终有数据发送,BitTorrent通过将片段进一步划分为子片段来进行优化。子片段的大小约为16KB,而片段的大小不固定,通常约为1MB。

协议始终对一定数量的子片段(通常是五个)进行流水线处理。在下载新子片段时,客户端会发送新请求,以加快下载速度。子片段可以从其他节点下载。

片段选择算法受核心策略的管理:

  1. 严格策略:一旦BitTorrent客户端请求了一个片段的子片段,会先完成该片段剩余的子片段,然后才请求其他片段的子片段。在这种情况下,先完成整个片段的所有子片段比开始下载另一个片段更有意义。
  2. 最稀缺优先:BitTorrent的主要策略是优先选择最稀缺的片段,即尽量下载其他节点最少拥有的片段。这样,我们可以使这些片段变得“不稀缺”。如果只有一个节点拥有某个片段并且该节点下线,那么其他节点将无法获取完整文件。这个策略带来诸多好处:

4. 终局模式:有时,具有较慢传输速率的节点会尝试给我们发送一个子片段,从而导致下载延迟。为了防止这种情况发生,有“终局模式”。

还记得流水线原则吗?始终有几个子片段请求处于等待状态。

当一个节点请求了它所缺少的所有子片段时,它会向所有节点广播此请求。这有助于我们获取文件的最后一部分。

如果一个节点拥有缺少的子片段,它会将其发送回我们的计算机。

一旦子片段到达,我们发送一个取消消息,告诉其他节点忽略我们的请求。

窒息算法(Choking Algorithm)

窒息是暂时拒绝向另一个节点上传数据,但我们仍然可以从它们那里下载数据。

为了合作,节点会上传数据;为了不合作,它们会“窒息”与其他节点的连接。原则是向那些向我们上传数据的节点上传数据。、

我们希望同时有多个双向连接,以实现帕累托效率。

如果没有其他分配方式能使某个个体处于更好的状态而没有任何其他个体变得更糟,那么我们认为该分配是帕累托有效的。因此,一个重要的问题是如何确定哪些节点被窒息,哪些节点被解除窒息?

节点总是解除窒息固定数量的节点(默认为4个)。

当前的下载速率决定了哪些节点被解除窒息。我们使用20秒的平均值来决定这一点。由于使用了TCP(慢启动),频繁地窒息和解除窒息是不好的。因此,这个计算是每10秒进行一次。

如果我们的上传速率很高,更多的节点将允许我们从它们那里下载。这意味着如果我们是一个良好的上传者,我们可以获得更高的下载速率。这是BitTorrent协议最重要的特性。

该协议禁止许多只下载而不上传的“搭便车”节点。

为了使点对点网络高效,所有节点都需要为网络做出贡献。

乐观解除阻塞(optimistic unchoking)

BitTorrent还允许额外的解除窒息的节点,此时不使用下载速率的准则。

我们将其称为乐观解除窒息。检查未使用的连接并不比使用中的连接更好。

我们每30秒更换一次乐观解除窒息的节点。足够的时间使上传速度达到最大。上传也是如此。如果这个新连接比现有的解除窒息的连接更好,它将替换掉现有的连接。

乐观解除窒息是随机选择的。

这也允许那些只下载而不上传的节点下载文件,即使它们拒绝合作。尽管如此,它们的下载速度会慢得多。

Anti-Snubbing

如果所有上传给另一个节点的节点都决定窒息该节点,会发生什么?那么我们就需要找到新的节点,但乐观解除窒息机制每30秒只检查一个未使用的连接。为了更好地恢复下载速率,BitTorrent引入了"snubbing"(忽视)机制。

如果客户端在60秒内没有从某个特定的节点收到任何数据,它将认为自己被"snubbed"(忽视)了。

遵循"tit-for-tat"的原则,我们会进行报复,并拒绝向该节点上传数据(除非它成为乐观解除窒息的节点)。

然后,该节点会增加乐观解除窒息的节点数量,以更快地找到新的连接。

如果我们只上传而不下载呢?

我们可以看到,通过使用BitTorrent中实现的窒息算法,我们偏向于对我们友好的节点。如果我可以从他们那里快速下载,我们允许他们从我这里快速上传。

那么如果没有下载呢?使用这种窒息算法就无法确定要解除窒息的节点。当下载完成后,我们会使用一种新的窒息算法。

这种新的窒息算法会解除窒息上传速率最高的节点。这确保了文件块更快地上传和复制。

具有良好上传速率的节点也不会被其他节点服务。

如果我们只进行上传?

如果我们只进行上传而没有下载,使用标准的阻塞算法来确定要解除阻塞的节点变得困难。在这种情况下,BitTorrent采用了一种不同的阻塞算法。

当没有进行下载时,启用新的阻塞算法。它根据节点的上传速率来解除阻塞。上传速率最高的节点会被解除阻塞,使它们能够以更快的速度进行上传。这种方法确保共享的文件块能够更快地上传和在节点之间复制。

具有良好上传速率的节点在接收来自其他节点的上传时具有优先权,即使它们自身没有正在下载任何内容。

什么是Tracker?

在BitTorrent中,Tracker是一种专门的服务器,用于在种子群中的节点之间进行通信。

在BitTorrent中,通信非常重要,用于发现和连接其他节点。

什么是Tracker?

Tracker是一种特殊类型的服务器,用于协助节点之间的通信。

在BitTorrent中,通信非常重要。我们如何了解其他节点的存在呢?

Tracker知道谁拥有文件以及文件的大小。

一旦开始进行点对点下载,通信就可以在没有Tracker的情况下继续进行。

自从引入了无需Tracker的分布式哈希表方法以来,BitTorrent Tracker的作用大大减少。

🗼 公共Tracker

这些是任何人都可以使用的Tracker。

Pirate Bay曾经是最受欢迎的公共Tracker之一,但在2009年停用了该功能,只选择使用磁力链接(后面将讨论)。

🔐 私有Tracker

私有Tracker是私有的,它们通过要求用户在网站上注册来限制使用。通常,控制注册的方法是邀请制。要使用此Tracker,我们需要获得邀请。

🔢 多Tracker种子

多Tracker种子包含在单个种子文件中的多个Tracker。这提供了冗余性,如果一个Tracker出现故障,其他Tracker仍然可以维护种子群。

通过这种配置,可能会出现单个种子有多个不连接的种子群的情况,这是不好的。某些用户可以连接到一个特定的Tracker,而无法连接到另一个Tracker。这可能会导致不连续的种子群,从而影响种子的传输效率。

🧲 磁力链接 - 无需Tracker的种子

之前,我提到了海盗湾如何摒弃了Tracker并开始使用无需Tracker的种子。

当我们下载一个种子时,我们会得到该种子的哈希值。要在没有Tracker的情况下下载种子,我们需要找到其他正在下载该种子的节点。为此,我们需要使用分布式哈希表。

让我们来了解一下分布式哈希表。

🐍 分布式哈希表

分布式哈希表(Distributed Hash Tables,简称DHT)为我们提供了类似字典的接口,但节点分布在整个网络中。DHT的关键在于通过哈希算法找到存储特定键的节点。

实际上,每个节点都成为了一个小型的Tracker。

每个节点(实现DHT协议的客户端/服务器)都有一个唯一的标识符,称为“节点ID”。我们从与BitTorrent信息哈希相同的160位空间中随机选择节点ID。

信息哈希是以下内容的SHA-1哈希:

- 项目:长度(大小)和路径(带有文件名的路径)

- 名称:要搜索的名称

- 块大小:单个块的长度(大小)

- 块哈希:该种子的每个块的SHA-1哈希

- 私有:限制访问的标记

我们使用距离度量来比较两个节点ID或一个节点ID和一个信息哈希的“接近程度”。

节点必须具有包含一些其他节点的联系信息的路由表。

节点在DHT中相互了解。它们了解到许多具有与自己相近的ID的节点,但了解到的远离自己ID的节点很少。

距离度量使用异或运算,并被解释为一个整数。

较小的值表示更接近。

当一个节点想要为一个种子找到其他节点时,它使用距离度量来将种子的信息哈希与其路由表中的节点ID或一个节点的ID进行比较。

然后,它联系路由表中距离信息哈希最近的节点,并向它们请求正在下载该种子的节点的联系信息。

如果被联系的节点知道该种子的其他节点,它们将在响应中返回节点的联系信息。否则,被联系的节点必须回复包含其路由表中与该种子的信息哈希最接近的节点的联系信息。

原始节点查询接近目标信息哈希的节点,直到找不到更接近的节点为止。当节点完成搜索后,客户端将自身的对等节点联系信息插入到与种子信息哈希最接近的节点上。将来,其他节点可以轻松找到我们。

查询对等节点的返回值包括一个称为“令牌”的不透明值。节点要宣布其控制的对等节点正在下载种子时,必须提供从同一查询节点最近的对等节点收到的令牌。

当节点试图“宣布”一个种子时,查询的节点会根据令牌检查查询节点的IP地址。这是为了防止恶意主机将其他主机注册到种子中。

查询节点将令牌返回给接收到令牌的同一节点。我们必须在分发后的合理时间内接受令牌。BitTorrent实现使用IP地址的SHA-1哈希值与每五分钟更改一次的秘密值进行连接,接受最多十分钟前的令牌。

📌 路由表

每个节点都维护着一个已知良好节点的路由表。我们在DHT中使用路由表作为查询的起始点。对于其他节点的查询,我们会从路由表中返回节点。

并非我们了解到的所有节点都是平等的。有些节点是“良好”的,而有些节点则不是。许多使用DHT的节点可以发送查询并接收响应,但无法响应其他节点的查询。每个节点的路由表只能包含已知良好的节点。

良好的节点是指在过去的15分钟内对我们的查询做出响应的节点。如果一个节点曾经对我们的查询作出响应,并在过去的15分钟内向我们发送了查询,那么该节点也是良好的。经过15分钟的不活动后,一个节点就会变得可疑。当节点连续未响应多个查询时,它们就会变成不良节点。我们认为良好的节点优先于未知状态的节点。

路由表覆盖了从0到2160的整个节点ID空间。我们将路由表细分为每个覆盖部分的“桶”。

一个空表只有一个ID空间范围为min=0,max=2160的桶。

一个空表只有一个桶,因此任何节点都必须适应其中。每个桶在变为“满”之前只能容纳K个节点,当前为八个。

当一个桶中装满了已知良好的节点时,除非我们的节点ID落在桶的范围内,否则我们不能再添加节点。该桶将被两个新桶替换,每个新桶的大小为旧桶的一半。旧桶中的节点将分配给新桶。

对于只有一个桶的新表,我们总是将满桶分为两个新桶,覆盖范围分别为0..2159和2159..2160。

当桶中装满了良好节点时,我们只是丢弃新节点。当桶中的节点变为不良节点(如果发生),我们用一个新节点替换它们。

当节点被视为可疑节点且在过去的15分钟内没有出现时,我们会对最近一次看到的节点进行ping操作。该节点要么响应,要么不响应。如果响应,则我们转到下一个节点。我们会一直进行此操作,直到找到一个未能响应的节点。如果我们没有找到任何节点未响应,则认为该桶是良好的。

当我们找到一个未响应的节点时,在丢弃该节点并用一个新的良好节点替换之前,我们会再尝试一次。

每个桶应该维护一个“最后更改”的属性,以显示

内容的“新鲜程度”。

当对桶中的节点进行ping操作并获得响应,或者向桶中添加节点或用另一个节点替换节点时,将更新桶的“最后更改”属性。

如果在过去的15分钟内未更新“最后更改”属性,则刷新桶的内容。

🤺 BitTorrent上的攻击

BitTorrent网络存在一些攻击。一切都是公开的,包括我们的IP地址、我们正在下载的内容等等。为什么要攻击一个公开的网络呢?

为什么要攻击一个完全开放的网络呢?

Exploit-DB上只列出了7个条目,这是一个已知服务漏洞的数据库。而且其中大部分与特定的客户端有关。

对BitTorrent网络的主要攻击是为了阻止盗版。我们迄今为止没有谈论过盗版,但它常常与BitTorrent联系在一起。

BitTorrent的主要攻击是Torrent Poisoning(种子污染)。

  • Torrent Poisoning(种子污染)

这种攻击旨在获取盗版内容的IP地址或以某种方式对内容进行污染。

Madonna的《American Life》专辑发行就是内容污染的一个例子。在发行之前,以类似长度和文件大小的方式发布了一些曲目。这些曲目中包含了一段麦当娜说的话:

“你他妈以为你在做什么?”

接着是几分钟的沉默。

以下是一些种子污染的方法。

  • 索引污染

索引允许用户定位具有所需内容的对等方的IP地址。这种攻击方法使搜索对等方变得困难。

攻击者向索引中插入大量无效信息,以阻止用户找到正确的信息。

其思想是通过让对等方尝试从无效的对等方下载片段来减慢下载速度。

  • 虚假插入

他们在网络中插入了文件的损坏版本。

想象一下有500个文件副本,其中只有2个是真正的文件,这会阻止盗版者找到真正的文件。

大多数列出种子的网站都有一个投票系统。这可以防止这种攻击,因为搜索结果的前几位都是没有损坏的文件。然而,大多数列出种子的网站都有一个投票系统。

这可以防止这种攻击,因为搜索结果的前几位都是没有损坏的文件。

在《GameDevTycoon》中,文件在上传到盗版网站之前就已经发布了。盗版者并不知道文件已被损坏。在盗版版本中无法赢得游戏。其他一切都完美无缺。

🧙🏼‍♂️ 对抗黑暗BitTorrent攻击的防御措施

大多数热门种子是由多年积累了信誉的个人或团队发布的。在私人跟踪器上,可以追踪到个人。毒害种子很快会被标记,并且发布者可能会被禁止。

或者,在公共跟踪器上,最好下载由可信团队制作的种子。毕竟,你更愿意从Ubuntu团队下载Ubuntu,还是从用户xxx-HACKER-ELITE-GHOST-PROTOCOL-xxx下载呢?

在公共跟踪器上,如果发现种子被污染,会进行举报并将其移除。

对抗BitTorrent攻击的最简单方法是使用与您无关联的IP地址。可以通过使用VPN或其他服务实现这一点。

👋🏻 总结

以下是我们学到的内容:

Torrent描述文件是什么

BitTorrent如何选择对等方

BitTorrent如何选择片段

Tit-For-Tat算法

Trackers

BitTorrent网络攻击

评论

所有评论

推荐阅读

  • 5月15日晚间要闻速递

    1. BTC突破64000美元

  • 美国4月CPI同比上升3.4%

    美国4月CPI同比上升3.4%,预估为3.4%,前值为3.5%;美国4月CPI环比上升0.3%,预估为0.4%,前值为0.4%。

  • BTC突破64000美元

    行情显示,BTC突破64000美元,现报64001美元,日内涨幅达到4.14%,行情波动较大,请做好风险控制。

  • Humanity Protocol以10亿美元估值完成3000万美元新一轮融资

    Humanity Protocol宣布以10亿美元估值完成3000万美元新一轮融资,Kingsway Capital领投,Animoca Brands、Blockchain.com和Shima Capital等参投。创始人Terence Kwok表示,该公司还在“KOL”中从有影响力的加密人物那里筹集了约150万美元。Kwok表示,该初创公司计划在第二季度推出其测试网络,目前等待名单约为50万人。在推出其技术时,计划首先发布一款应用程序,可以使用手机摄像头扫描人们的掌纹以确定他们的身份。 据悉,Humanity Protocol利用掌纹识别技术和零知识证明来确保用户的隐私和安全,旨在为建立Web3应用程序中的人类证明提供一种易于访问且非侵入性的方法。

  • 以太坊上假冒GME代币发生Rugpull

    据PeckShield监测,以太坊上假冒GameStop GME下跌100%。0xcbae开头地址抛售了1,434,204,649,380.8枚GME并兑换为93.2枚WETH(价值27万美元),注:Rugpull代币与合法代币名称相同。

  • ETH跌破2900美元

    行情显示,ETH跌破2900美元,现报2899.38美元,日内跌幅达到0.48%,行情波动较大,请做好风险控制。

  • 欧洲央行管委:我们很可能在六月开始降息

    欧洲央行管委维勒鲁瓦表示,我们很可能在六月开始降息。

  • 前FTX高管Ryan Salame请求法庭从宽处理,判处其18个月监禁

    根据周二提交的一份量刑备忘录,前FTX高管Ryan Salame于去年9月承认共谋非法政治献金以及共谋经营无证汇款业务的罪名 ,其律师请求法庭从宽处理,判处其18个月的刑期。RyanSalame在FTX和Alameda任职期间,为FTX客户管理电汇存款和法币兑换,利用Alameda的资金参与政治献金,并在巴哈马领导慈善活动。 在提交的文件中,其律师辩称,Salame在被关闭的公司中扮演的角色与欺诈的核心关系不大,更多的是操作性的。他们还提到了萨拉梅与当局的合作、真正的悔意、为解决药物滥用问题所做的努力,以及交易所倒闭给他造成的重大个人和经济损失。

  • 让 ICO 回归:分布式代币发行 (DTL)

    DTL 的核心焦点是将代币及其技术交到真实用户手中,而不仅仅是投机者。

  • 宏观思考:并非都是厄运和阴霾

    这可能是一次健康的重置。