一个点如何知道另一个点是种子?

How does a peer know another peer is a seed?

当一个点连接到另一个拥有所有部分的点时,连接点如何知道它连接的实际上是一个种子(并且拥有所有部分)?他们之间有消息传递吗?

在像 uTorrent 这样的客户端中,点似乎也知道它所连接的每个点的下载进度。 它怎么知道这一切?如果进度为 100%,一个对等点是否推导出另一个对等点是种子,或者实际上是否有特定的消息?协议的哪些部分处理所有这些?

根据bittorent protocol specification

The peer protocol refers to pieces of the file by index as described in the metainfo file, starting at zero. When a peer finishes downloading a piece and checks that the hash matches, it announces that it has that piece to all of its peers.

然后,是的,对等方交换消息,因此他们可能知道哪些内容可供下载。处理此问题的协议 "part" 是对等协议。

如您在 the spec 中所见,客户端应该交换 bitfield 消息以告诉对方他们当前拥有哪些片段。定期 have 消息稍后会更新此内容,当对等方收到更多片段时(无论如何这是简单的描述,现实更加混乱,稍后会详细介绍)。

这是由广泛支持的Fast Extension修改的,其中对等方可以将完全完整和完全空的位域消息压缩为have allhave none

它也被 Superseeding 修改,其中种子位于它们拥有的碎片周围,以便更有效地播种初始群。一般来说,同龄人总是会撒谎,特别是他们可以假装没有他们真正拥有的作品,而你永远无法确定。

这让我回到了更混乱的现实。如果您告诉他们您有 x,同行可能会选择不向您发送 have x,因为这对您是否向他们请求 x 没有任何影响(您不会,因为你已经拥有它)。另一方面,这对某些优化不利,例如优先上传稀有片段,尤其是超级种子。

一个节点知道另一个节点是否是种子,如果另一个节点是:

  • 发送一个完全完整的bitfield,表明它包含了 torrent 中的所有片段。 - BEP3

  • 发送不完整的 bitfield,然后发送所有 have 消息,用于从一开始就没有的其余部分。 (这可能是它正在持续下载并完成 torrent 它发送一个 lazy bitfield。) - BEP3

  • 根据Fast Extension - BEP6

  • 发送have all消息
  • 根据Extension for Partial Seeds - BEP21
    发送upload only=1 部分种子 意味着对等方只下载了 torrent 的一部分并且不想再下载,并且正在播种它所拥有的。

对等方通过不断发送 have 消息来报告其进度。

协议的这一部分称为 对等线协议