How does a peer know another peer is a seed?

2020-07-17 07:45发布

问题:

When a peer connects to another peer that has all the pieces, how does the connecting peer know that what it connects to is actually a seed (and has all of the pieces)? Are there messages sent between them?

In clients like uTorrent, the peer seems to be aware of the download progress of each peer it has connected to as well. How does it know all that? Does a peer derive that another peer is a seed if progress is 100% or are there actually specific messages for that? Which parts of the protocol deal with all this?

回答1:

A peer knows if another peer is a seed if the other peer either:

  • sends a fully complete bitfield indicating that it has all the pieces in the torrent. - BEP3

  • sends a incomplete bitfield and then all have messages for the rest of the pieces it didn't have from the beginning. (This can either be that it is continuously downloading and completes the torrent or that it sends a lazy bitfield.) - BEP3

  • sends a have all message according to the Fast Extension - BEP6

  • sends upload only=1 according to the Extension for Partial Seeds - BEP21
    Partial seed means that the peer has only downloaded parts of the torrent and don't want to download any more and is seeding what it has.

A peer reports its progress by continuously sending have messages.

This part of the protocol is called the Peer Wire Protocol.



回答2:

As you can see in the spec, clients are supposed to exchange the bitfield message to tell the other which pieces they currently have. Regular have messages later update this, when a peer receives further pieces (that's the straightforward description anyway, the reality is messier, more on that later).

This is modified by the widely supported Fast Extension, in which peers can compress fully complete and fully empty bitfield messages to have all and have none.

It is also modified by Superseeding, in which seeds lie about the pieces they have in order to seed the initial swarm more efficiently. And in general peers could always lie, in particular they can pretend not to have pieces which they really do, and you'd never know for sure.

Which brings me back to the messier reality. Peers may choose not to send the have x to you if you told them you have x, because it won't make any difference in whether or not you will request x from them (you won't, because you already have it). On the other hand, that is bad for some optimizations such as prioritizing the upload of rare pieces and, in particular, Superseeding.



回答3:

According to 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.

Then, yes, messages are exchanged by peers so they may know what is available for download. The protocol "part" that deals with this is the Peer Protocol.



标签: bittorrent