Bittorrent如何工作?


34

我想了解有关文件共享的bittorrent方法的更多信息。我是技术上先进的用户(程序员),因此技术上先进的材料没问题,但是应该简洁明了。我需要一本很好的资源手册/网站,其中说明了整个bittorrent体系结构。

我对细节不感兴趣,对整体架构和诸如种子,同行等之类的术语不感兴趣。

有什么建议么?

Answers:


29

bittorrent的工作原理概述:

  • 您有同行追踪者。所有同行携手在任何时刻都是。通常的情况是一个或几个对等方拥有完整的文件集,并希望将其提供给其他对等方。

  • 对等方获取一个.torrent文件,该文件除其他外将具有:A)文件集的SHA-1哈希,B)跟踪器的URL,以及C)文件被分割成的片段数,以及每一块的SHA-1哈希。作品的大小由种子本身决定。

  • 然后,对等方使用torrent中指定的URL连接到跟踪器。跟踪器以对等方列表作为响应。跟踪器通过端口80或443谈论HTTP。

  • 然后,对等方使用来自跟踪器的信息选择另一个对等方,并直接与之联系以建立交换会话,以尝试获取一个对等方。 请注意,交换会话直接由对等方完成,并且跟踪器不参与传输。跟踪器仅提供信息。

  • 一旦对等体有一块,它将根据SHA-1哈希对其进行验证,并将其写入文件。然后,当选择另一个对等方时,它可以提供该作品。随后的交换会话涉及“交易”部分。我相信,如果您没有其他作品,同行通常只会给您第一篇。

  • 对等方每隔一段时间就重新咨询跟踪器,以获取对等方的更新列表。如果对等方有多个碎片,则对等方不必等待一次交换完成就可以开始另一次交换,因此,一旦对等方具有一堆碎片,传输就可以真正加速。这就是为什么洪流开始缓慢但随着同伴获得碎片而快速获得速度的原因。

  • 当同级拥有所有组件时,将根据文件集SHA-1哈希来验证整个文件。然后,它变成了种子源,现在除了帮助文件集变得更高可用性之外,什么也不做。没有全部内容的同龄人就是水手

  • 如果种子没有种子,那么种子就死了,尽管如果所有同伴持有的所有文件之间都存在文件的完整副本,它们最终将进行交易以获得彼此之间的完整副本。

  • SHA-1哈希是跟踪器和对等方如何“知道”应该存储哪个文件的方式。种子文件中的文件名不用于标识数据。不能根据.torrent文件中的限制进行验证的片段将被丢弃。不断发送坏消息的对等节点被其他对等节点冷落,最终将无法连接到群中的任何人。

  • 较小的文件大小意味着torrent更加健壮,因为对等方可以更快地进行交易,但是这也意味着.torrent文件中的文件哈希数必须更多,因此.torrent文件可以很大。

  • 如果您要通过BitTorrent发布某些内容,则最好为该文件添加种子,只要您希望该文件可用即可。由于大多数BitTorrent软件实施的算法都倾向于尝试在尽可能多的对等方之间传播事物,以最大限度地提高并发连接,因此其他对等方将为您提供帮助。这样,BitTorrent可以帮助您发布内容并节省带宽成本。


1
一个美丽的答案!一个玩笑:我相信种子更喜欢种子最稀有的种子,而不是第一块种子。不知道这是否是算法问题,但这就是我从torrent程序中得到的,同时弄乱了设置。
Gallifreyan


8

YouTube上有一个相当不错的视频,上面有纸板切口,以视觉方式对此进行了解释。这不是一个高度技术性的解释,但是对于以一种简单易懂的方式向人们解释BitTorrent背后的想法非常有用。

bittorrent如何在youtube上工作


3
+1有用的视频。给我爸爸看 之后他没有任何问题。惊人。:)
zero2cx 2012年

2

等消息协议概述。

客户端可以使用两种协议与对等方共享信息,即TCP或uTP(通过UDP)。此数据遵循bittorrent协议规范的对等消息部分。

因此,以编程方式,必须在两个客户端之间启动连接。设置了连接(通过TCP或uTP)后,客户端启动bittorrent握手,该握手从跟踪器或DHT捕获远程对等方的信息(ip&port)。此握手包含info_hash,该信息标识此连接将要使用的种子。

首先让我们看看如何通过协议截断Torrent数据。一个是要通过网络共享数据的一部分。不要与block混淆,block是一块包裹在小包中的一部分。的是共享一个粒度通过的分组,并且一个是通过对等体共享一个洪流的粒度。

当连接开始时,两个客户端(本地客户端,我称为LC和远程客户端RC)都被阻塞了不再感兴趣被选中表示“我不会回答您的任何消息,太忙了,但我可能会考虑在内”。因此,取消锁定表示“我将回答您的消息”。当然,我想要一些您感兴趣东西。因此,可以用这四个状态定义两个对等方之间的连接状态:LC_chocked ?、 LC_interested ?、 RC_chocked ?、 RC_interested?。向RC警告我(不感兴趣(不感兴趣),我必须向他发送(不感兴趣)(不高兴)的消息,并且要相互发送。

为了互相告知自己拥有哪些部件,他们可以在握手后立即发送位字段消息。顾名思义,这是一个位字符串,1如果客户端具有此特殊,则将每个位设置为,0否则。

因此,如果LC摆满兴趣RC具有unchocked他,那么他就可以发送一个请求消息来索要属于一个一件他知道LC有感谢位域的消息。

当一个对等方收到整个作品时,他可以发送一条消息来通知所有它的远程同等人,以便他们更新他们持有的相关位域

这是一个非常基本的概述,当然,这里没有提供所有详细信息,例如阻塞算法等。如果您想了解更多详细信息,请在注释部分中查看我上面发布的两个链接(作为新用户,我可以帖子中的链接不得超过两个)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.