BitTorrent è un protocollo diffuso per la condivisione di file.
In BitTorrent, i peer che partecipano alla distribuzione di un file fanno parte di un insieme noto come torrent. I peer scaricano dei pezzetti di file, noti come chunk, tutti della stessa dimensione.
Quando un peer entra a far parte di una rete torrent non ha nessun chunck del file che vuole scaricare, col passare del tempo tale peer accumula chunk, fino ad ottenerli tutti, a tal punto il peer può abbandonare (egoisticamente la rete torrent) o rimanere e condividere il file (che ha ormai ottenuto).
Quando un peer entra in una rete torrent, si registra presso il tracker, un sistema che tiene traccia delle partecipazioni ai torrent. Periodicamente il peer informa il tracker di far parte di un certo torrent. Quando un nuovo peer, che chiamiamo Alice, entra a far parte del torrent, il tracker gli invia una lista casuale di (diciamo) 50 host dell'insieme di peer che stanno partecipando a tale torrent. Ottenuta la lista, Alice, cerca di stabilire delle connessioni TCP con tali peer.
I peer con cui Alice riesce a stabilire la connessione vengono chiamati peer vicini (neighboring peer).
Col tempo tali peer possono abbandonare il torrent, e altri peer (al di fuori dei 50 ricevuti inizialmente) si possono aggiungere al torrent.
In un certo istante, ogni peer, avrà un certo numero di chunk di file.
Periodicamente, Alice, richiederà ai suoi vicini la lista dei chunk del file che possiede ciascun peer, sapendo ciò, Alice può richiedere i chunk del file di cui ha bisogno.
Alice, può utilizzare diverse politiche per richiedere i chunk, per esempio prima il più raro, richiedendo di fatto i chunk che sono più rari tra i suoi peer.
Alice, facendo parte di una rete torrent, deve rispondere anche lei a delle richieste.
Per determinare a quali richieste rispondere, BitTorrent utilizza un sistema di trading (scambio) particolare. L'idea alla base è che Alice attribuisca priorità ai peer che gli stanno inviando dati, in quel momento alla velocità più alta. Alice misura periodicamente la velocità con cui i suoi vicini gli stanno inviando i bit e crea un gruppo di 4 peer a cui inviare dati, contraccambiando. Questi 4 peer vengono detti unchoked. Inoltre, ogni 30 secondi, Alice sceglie un vicino in più a caso e gli invia dei chunk. Diciamo che il peer scelto a caso è Bob (che viene chiamato optimistically unchoked). Dato che Alice sta inviando dati a Bob, Alice potrebbe diventare peer unchoked di Bob, in tal caso Bob inizierebbe ad inviare bit ad Alice. A sua volta, se Bob invia dati abbastanza velocemente, Alice potrebbe inserire Bob tra i suoi peer unchoked. In parole povere, ogni 30 secondi Alice scegli un peer a caso a cui inviare dati, se l'accoppiamento è proficuo per entrambi, i due continueranno a scambiarsi bit, finché non trovano un partner migliore. Tutti gli altri peer, ad esclusione di quei quattro, sono detti choked (soffocati, limitati).
Oggi BitTorrent utilizza un sistema che ha sostituito i tracker, per rendere ancora più decentralizzata l'architettura, non avendo il bisogno di appoggiarsi ad un computer centrale che mantiene quali peer partecipano ad un torrent. Le nuove versioni di BitTorrent utilizzano le tabelle hash distribuite (dei record distribuiti tra i peer stessi).
Napster era un sistema che utilizzava un'architettura P2P centralizzata per la condivisione di musica. Gli utenti si registravano a Napster e venivano inseriti in un database centralizzato a cui tutti gli altri peer potevano accedere. Nel momento in cui rendevano disponibile un file sul proprio computer, il database teneva traccia di questa disponibilità di un certo peer. Quando un utente ricerca un file, esso veniva ricercato tra le disponibilità offerte tra tutti gli utenti iscritti al servizio. L'utente poi richiede il file a uno dei peer che Napster restituiva, instaurando una connessione direttamente con il peer che possedeva il file.