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?
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. - BEP3sends a incomplete
bitfield
and then allhave
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 alazy bitfield
.) - BEP3sends a
have all
message according to the Fast Extension - BEP6sends
upload only=1
according to the Extension for Partial Seeds - BEP21Partial 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.
As you can see in the spec, clients are supposed to exchange the
bitfield
message to tell the other which pieces they currently have. Regularhave
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
andhave 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 havex
, because it won't make any difference in whether or not you will requestx
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.According to bittorent protocol specification:
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.