In informatica BitTorrent (spesso abbreviato BT) è un protocollo di tipo peer-to-peer (P2P) finalizzato allo scambio ovvero alla distribuzione e condivisione di file nella Rete.

Descrizione Scritto in linguaggio Python, originariamente distribuito sotto Licenza MIT, dalla versione 4.0.0 del 7 marzo 2005 la licenza è cambiata in BitTorrent Open Source License ed è disponibile per i sistemi operativi Microsoft Windows, Mac OS, Linux e Android. In realtà non è da considerarsi come un algoritmo distribuito puro, dato che la sua architettura prevede la presenza di un server utilizzato per la fase di aggancio alla rete. L'omonimo client originale e il protocollo sono stati sviluppati da Bram Cohen, un programmatore di San Francisco, nel 2002. In precedenza, Cohen aveva scritto "Moyonation", un programma che frammentava i file e li inviava via web.

Funzionamento

A differenza dei tradizionali sistemi di file sharing, l'obiettivo di BitTorrent è di realizzare e fornire un sistema efficiente per distribuire lo stesso verso il maggior numero di utenti disponibili, che possono sia prelevarlo scaricandolo sul proprio terminale (download) sia inviarlo ad altri (upload).

BitTorrent impone di fatto un meccanismo di coordinamento del lavoro di numerosi computer, ottenendo il massimo beneficio possibile per tutti. Grazie a questo sistema ogni nodo contribuisce alla diffusione del file. Maggiore è l'ampiezza di banda in uscita su quel nodo, maggiori sono le probabilità che il file venga diffuso verso altri nodi. Questo metodo ha anche il pregio di ridurre l'impatto della cosiddetta "leech resistance" (vedere in proposito la sezione Leecher).

Il file originale BitTorrent permette di distribuire file di qualsiasi tipo. Il documento originale viene frammentato in tanti piccoli pezzi che poi saranno ricomposti a destinazione. Le parti hanno dimensione fissa, il fingerprint calcolato con l'algoritmo SHA1 viene distribuito agli altri client per verifica mediante le reti (come il Web).

File torrent

Per poter usufruire del sistema è quindi necessario prima di tutto prelevare un file caratterizzato dall'estensione .torrent di ridotte dimensioni (poche decine di KB). Questo file svolge la funzione di indice in quanto contiene la descrizione di tutti i pacchetti in cui è stato suddiviso il documento o file originale e le chiavi hash che garantiscono l'integrità dei vari pezzi. Tecnicamente altro non è che un file statico contenente informazioni, codificate mediante un algoritmo di hashing, che descrivono i file da prelevare e/o da trasferire. Un qualsiasi client BitTorrent, oltre a leggere i file torrent e compiere le operazioni possibili, è anche in grado di generare i file torrent.

Motori di ricerca torrent Per trovare file torrent esistono motori di ricerca appositi che indicizzano solo file torrent.

Tracker

In aggiunta alle informazioni sui dati da scaricare, i file torrent contengono l'indirizzo URL di uno o più tracker (server traccia), utilizzati per localizzare le sorgenti che posseggono il file o parte di esso. Il tracker si occupa di coordinare i rapporti fra utenti richiedenti il file e quelli che lo offrono. Solitamente i siti tracker forniscono anche delle statistiche sul numero di trasferimenti, il numero di nodi che hanno completato la copia del file e il numero di nodi che ne posseggono una copia parziale.

Web seed Il Web seeding è la capacità del client BitTorrent di scaricare parti di torrent da una fonte HTTP, oltre che dallo Swarm. Il vantaggio di questa caratteristica è che si può usare un sito web per distribuire un torrent rendendo disponibili i file per lo scaricamento da questo stesso server web. Utilizzando un Web seed è dunque possibile pubblicare i file di un torrent senza l'obbligo di avere almeno un client seed nella rete: non si ha dunque l'obbligo di avere un releaser iniziale in quanto questo compito è svolto da un sito web. Questa tecnica permette di mantenere sempre alte le velocità di scaricamento dei file: quando una release è poco diffusa il trasferimento usa principalmente l'HTTP, quando il file è molto richiesto il carico sul server web viene alleggerito dal seeding effettuato dai singoli peer.

Nodi I nodi della rete BitTorrent sono costituiti dagli utenti che condividono tra loro i file.

Seed I seed (in italiano semi) o seeder sono quei nodi della rete costituiti da coloro che hanno già scaricato il file (o i file) associato al .torrent e ora lo stanno solo inviando ad altri. Questa fase di solo invio (caricamento) prende il nome di seeding ed è la fase in cui si trova il file dopo che è stato scaricato. Il primo seed di un torrent è il releaser che trasmette parti ai peer fino a quando almeno uno di loro completa lo scaricamento del torrent, diventando a sua volta un seed.

Peer I peer sono nodi che non sono ancora in possesso del file completo e fungono contemporaneamente sia da client rispetto ai seed, sia da server verso gli altri peer. Quindi i peer, oltre a ricevere e salvare durante il download parti di file, inviano le parti di cui sono già in possesso ad altri peer.

Un tipo particolare di peer sono i cosiddetti peer locali, ovvero i peer che condividono lo stesso torrent mediante una rete LAN. In molti client è possibile abilitare una funzione di ricerca dei peer locali in modo da connettersi a loro più velocemente.

Leecher Il rapporto tra dati inviati e scaricati è detto share ratio, cioè "rapporto di condivisione". Coloro che inviano solo pochi dati rispetto a quanti ne scaricano, quindi che hanno un pessimo share ratio, vengono detti leecher, ovvero sanguisughe. Questo comportamento è altamente disapprovato dalla comunità di BitTorrent in quanto l'intero protocollo si basa sulla condivisione: chi scarica un file è in grado di farlo solo grazie ai seed e/o ai peer che gli inviano i dati di cui necessita, se quindi per assurdo tutti gli utenti si comportassero da leecher si arriverebbe alla "morte" del sistema, ossia non si riuscirebbe a scaricare più nulla. Per questo motivo vengono utilizzate delle contromisure contro i leecher, come per esempio privilegiare i peer con elevato share ratio che otterranno velocità di scaricamento più elevate, fino al ban da un tracker.

Swarm Con "swarm" (in italiano sciame) s'intende il numero complessivo di seed e di peer che condividono lo stesso file torrent. Questo valore indica però il numero di fonti totali, non quelle effettivamente connesse al proprio client.

Client

Con client (in italiano cliente) nel linguaggio informatico si intende una componente, hardware o software, che accede ai servizi o alle risorse di un altro componente detto server. Quindi un computer collegato ad un server tramite una rete informatica funge da apparato hardware e come tale è detto per l'appunto client.

Un Client BitTorrent si occupa di accedere all'omonima rete ed effettuare lo scaricamento/caricamento da e verso tutti i nodi ad esso collegati. Il client è quindi lo strumento fondamentale che permette lo scambio dei dati.Il primo client BitTorrent fu creato da Cohen basandosi su quella che lui definisce "Golden Rule": più velocemente un utente realizza un caricamento, più velocemente potrà scaricare. Questo client porta lo stesso nome del protocollo. In seguito sono nati altri numerosissimi client che si adattano alle esigenze dei più svariati utenti.

Lista dei maggiori Client

ABC Acquisition BitComet BitLord BitSpirit BitTyrant BitTornado BitTorrent Brave Burst! Deluge FrostWire Halite Client KTorrent LimeWire Lphant Mophant Opera qBittorrent QTorrent rTorrent Shareaza SharkTorrent Tixati Tomato Torrent TornTV Transmission Tribler Turbo Torrent µTorrent Vuze XTorrent

Dati tecnici BitTorrent utilizza un protocollo nuovo rispetto ad altri sistemi P2P. La sua caratteristica principale è la facile estensibilità, segue il limitato consumo di banda. Il protocollo si basa su un algoritmo di codifica detto Bencode, utilizzato per le comunicazioni client/server e client/client.

I seguenti paragrafi trattano, nell'ordine: la codifica Bencode, utilizzata nei file torrent; la struttura vera e propria del file torrent; il protocollo client/server; il sistema Scrape.

La codifica Bencode

La codifica Bencode è quella utilizzata per i file torrent. È stata progettata per avere al tempo stesso la flessibilità dell'XML e la "leggerezza" necessaria per ridurre al minimo le dimensioni del file torrent (cioè il numero di byte inviati dal server al client).

Il file di meta-informazioni

Il file torrent comprende la lista dei file disponibili e i relativi checksum (per garantire l'integrità delle parti di file che vengono scaricate).

Protocollo client/server - Announce e l'ottenimento dei peer

Un client che intende scaricare un torrent, una volta ottenuto il file di meta-informazioni, deve contattare il tracker tramite il protocollo HTTP con una richiesta GET. Esso fornirà al tracker i dati richiesti tramite la Query String, e riceverà in risposta un dizionario Bencode contenente informazioni sul tracker e gli indirizzi IP dei client connessi.

Questi sono i parametri che devono essere inviati al tracker (in grassetto quelli richiesti dal protocollo standard): info_hash: hash SHA1 del dizionario info codificato in Bencode, in formato stringa codificata secondo le convenzioni URL peer_id: una stringa di 20 caratteri che permette di identificare in maniera quasi-univoca l'utente sul tracker port: numero di porta (software) sulla quale il client è in ascolto. Le porte tipiche sono nel range 6881-6900. uploaded: bytes inviati agli altri client dall'inizio della sessione, codificati in ASCII base-10 downloaded: bytes scaricati dagli altri client dall'inizio della sessione, codificati in ASCII base-10 left: bytes rimanenti al completamento del file, codificati in ASCII base-10. Il valore 0 indica un seeder compact: indica al tracker di utilizzare il Compact Announce, per l'elenco dei peer. Si veda l'elemento peers della risposta event: può assumere i tre seguenti valori: "started", "stopped", "completed". Il primo viene inviato a inizio sessione e indica al tracker che si sta iniziando una nuova sessione. Il secondo chiude la connessione con il tracker e chiede di essere rimosso dalla lista dei peer. L'ultimo comunica al tracker il completamento del scaricamento e il passaggio allo status di seeder. ip: indirizzo IP da comunicare agli altri peer. Solitamente utilizzato se si è dietro NAT/router numwant: numero di fonti massimo che il tracker deve comunicare key: stringa randomizzata per una migliore identificazione univoca del client trackerid: se il tracker ha comunicato in precedenza un tracker id, esso va inviato qui

Announce risponde con una stringa (MIME text/plain). Le eventuali condizioni di errore non possono essere comunicate con i Hypertext Transfer Protocol.

La stringa rappresenta un dizionario con i seguenti elementi: failure reason(stringa): se presente, rappresenta la condizione di errore in formato human-readable. In presenza di failure reason non devono essere presenti ulteriori elementi warning message(stringa): rappresenta una condizione di allerta in formato human-readable. L'elaborazione della risposta di Announce non viene interrotta e all'utente viene mostrato un messaggio descrittivo min interval(intero): tempo minimo in secondi che deve trascorrere tra due richieste Announce, pena il rifiuto da parte del server interval(intero): tempo in secondi da raccomandare al client per gli intervalli tra gli aggiornamenti Announce, al fine di non sovraccaricare il server. Deve essere compreso tra il valore di min interval e il time-out per la disconnessione forzata dei peer morti tracker id(stringa): una stringa che identifichi univocamente il tracker. complete(intero): seeder attualmente connessi (utile se il numero di peer connessi supera di molto il limite di risposta)