我很好奇,由于没有中央集线器,torrent 网络上的下载速度是如何决定的。如果有 300 个种子,为什么客户端不能直接连接到所有这 300 个种子,而不实际播种任何东西。它是否内置在客户端中(我非常怀疑)。整个共享过程是如何运作的?
附言:我不确定这里是不是合适的提问地点,但这肯定不属于 Stack Overflow。另外,我不想知道如何加快 torrent 下载速度。我想知道它们是如何工作的。
答案1
Bittorrent 并非完全“无中心”——不是用于数据传输,而是用于对等点发现。最初,torrent 只能依赖于一个称为跟踪器的中央中心——同样,不是用于交换文件的各个部分,而是用于发现集群中的其他用户。(我相信您可以在协议中指定多个跟踪器以实现冗余。)随着 DHT 的引入,Bittorrent 对等点可以使用 DHT 来寻找其他对等点,作为对跟踪器的补充或替代。DHT 本身依赖于对一些知名 DHT“节点”(不确定确切术语)的预知,以便“引导”从未或有一段时间没有通过 DHT 查询的对等点。
客户端可以自由地与其所知的每个对等方同时建立连接,并且通常都会这样做 - 但要考虑程序支持的任何“连接限制”设置。
连接两端包含两个状态位:是否阻塞,以及是否感兴趣。阻塞是一种通知,表示在解除阻塞之前不会发送任何数据。本文档后面将解释阻塞背后的原因和常用技术。
只要一方感兴趣而另一方没有阻塞,就会发生数据传输。兴趣状态必须始终保持最新 - 每当下载者没有他们当前在非阻塞状态下向对等方请求的东西时,他们必须表示不感兴趣,尽管被阻塞了。正确实现这一点很棘手,但可以让下载者知道哪些对等方在非阻塞状态下会立即开始下载。
连接一开始就被阻塞并且不感兴趣。
当传输数据时,下载程序应该同时将几条请求排队以获得良好的 TCP 性能(这称为“流水线”)。另一方面,不能立即写入 TCP 缓冲区的请求应该在内存中排队,而不是保存在应用程序级网络缓冲区中,这样当发生阻塞时它们都可以被丢弃。
因此,为了从对等点获取数据,对等点必须“感兴趣”,并且您必须“不被阻止”——根据协议。进一步:
阻塞的原因有多种。当同时发送多个连接时,TCP 拥塞控制表现非常糟糕。此外,阻塞允许每个对等方使用针锋相对的算法来确保他们获得一致的下载速率。
下面描述的阻塞算法是当前部署的算法。所有新算法都必须在完全由它们组成的网络和主要由它们组成的网络中均能很好地工作,这一点非常重要。
好的阻塞算法应该满足几个标准。它应该限制同时上传的数量,以实现良好的 TCP 性能。它应该避免快速阻塞和解除阻塞,即所谓的“纤维化”。它应该回报允许它下载的对等方。最后,它应该偶尔尝试未使用的连接,看看它们是否比当前使用的连接更好,即所谓的乐观解除阻塞。
目前部署的阻塞算法通过每十秒仅改变一次阻塞者来避免纤颤。它通过解除其下载速率最佳且感兴趣的四个对等点的阻塞来实现互惠和上传次数限制。上传速率较好但不感兴趣的对等点将获得解除阻塞,如果他们感兴趣,最差的上传者将获得阻塞。如果下载者有完整的文件,它会使用其上传速率而不是下载速率来决定解除谁的阻塞。
对于乐观畅通,无论上传速率如何,任何时候都有一个对等点是畅通的(如果感兴趣,则将其算作四个允许的下载者之一)。乐观畅通的对等点每 30 秒轮换一次。为了给他们一个完整的上传机会,新连接的启动概率是当前乐观畅通的三倍,是轮换中其他任何地方的三倍。
因此,大多数 Bittorrent 对等点都实施“阻塞”算法,以确保公平运作,但给予新连接优先处理,让它们有机会成为群体中的好成员。一个对等点可以尝试使用更不公平的不同算法,但如果没有所有其他对等点的立即合作,“坏”对等点就会被“阻塞”,直到它无法从任何人那里收到数据。
对等点越多 = 速度越快,速度越快的对等点越受欢迎。对等点的上传容量、您设置的任何下载限制以及您的物理链路上传/下载容量也会影响速度。
我(和其他人)进一步详细介绍了 Bittorrent 的工作原理在这个问题上。