# Torrent (formato di file)

Torrent (o metainfo) è un formato di file utilizzato dal protocollo peer-to-peer BitTorrent per la distribuzione e la condivisione di file tramite Internet.

## Funzione e caratteristiche

La funzione di questo tipo di file è quella di condividere contenuti personali. Ogni utente, infatti, può creare e pubblicare un proprio torrent. La diffusione dei file .torrent si è avuta parallelamente alla diffusione della banda larga (ADSL).
Tecnicamente, i .torrent sono file di piccole dimensioni che, aperti con programmi appositi, portano a scaricare il contenuto memorizzato nel computer delle persone che stanno condividendo il file. Si tratta di file di tipo binario, che contengono tutte le informazioni di riferimento del file da scaricare e condividere.
La codifica utilizzata per i file torrent viene chiamata Bencode.

## La codifica Bencode

Bencode è una codifica derivata da XML, sebbene la sua sintassi sia completamente diversa. Bencode ha infatti la scalabilità, l'inclusione e l'estensibilità completa di un documento XML, ma permette di risparmiare caratteri (e, quindi, byte in trasmissione) per codificare le informazioni.
I quattro tipi fondamentali di Bencode sono il dizionario, la lista, l'intero e la stringa. Differentemente da XML il tipo intero è separato dal tipo stringa. Un dizionario e una lista possono contenere un numero infinito di elementi di natura qualsiasi, mentre intero e stringa non possono contenere altri elementi.
* Codifica della stringa
Una stringa XXXXX viene codificata come l:XXXXX, dove l è la lunghezza in caratteri della stringa.
Esempi:
* Codifica dell'intero
Un intero Y viene codificato come iYe.
Esempi:
* Codifica del dizionario
Un dizionario consiste in una serie di elementi ciascuno identificato da una stringa. Gli elementi non hanno limitazioni di tipo. Possono essere anch'essi dizionari. Un dizionario con un elemento XYZ => ABC, indicando (ABC) la codifica in Bencode dell'elemento, è rappresentato dalla stringa d3:XYZ(ABC)e. Il carattere e è un terminatore.
Esempi:
* Codifica della lista
Una lista inizia con il carattere l e termina col carattere e. Gli elementi sono disposti nel loro ordine, ciascuno nella rispettiva codifica.
Esempio:

## Il file torrent

Il file torrent, come già visto, contiene le informazioni necessarie per identificare e scaricare un file dalla Rete in tutta sicurezza. Si tratta di un file di testo che contiene la codifica in Bencode di un unico grande dizionario, il quale contiene a sua volta i dati (anch'essi sotto forma di dizionari) che identificano il torrent.
I seguenti elementi fanno parte del protocollo standard e comprendono le ultime estensioni: (quelli in grassetto sono richiesti dal protocollo standard)
* announce(stringa): indirizzo URL del tracker codificato come stringa ASCII
* announce-list(lista): estensione del protocollo verso il Multitracker. Il dizionario announce è comunque richiesto per retrocompatibilità
* creation date(intero): data di creazione codificata come timestamp Unix
* comment(stringa): un commento al Torrent codificato come stringa ASCII
* created by(stringa): programma che ha generato il Torrent
* info(dizionario): dizionario principale che descrive il contenuto del Torrent.
I suoi elementi possono variare se il torrent è composto da uno o da più file
In caso di file singolo:
* length(intero): dimensione del file in byte
* md5sum(stringa): fingerprint MD5 del file per migliore identificazione
* name(stringa): il nome del file in formato ASCII (i nomi UTF-8 e Unicode generano problemi di codifica)
In caso di archivio con più file:
* files(lista): la lista dei file contenuti nel Torrent
** (dizionario): ogni file è rappresentato da un dizionario con la seguente struttura:
*** length(intero): dimensione del file in byte
*** md5sum(stringa): fingerprint MD5 del file per migliore identificazione
*** path(lista): lista di stringhe che permette di ricostruire il percorso del file prendendo gli elementi del loro ordine
**** (stringa): l'ultimo elemento rappresenta nome ed estensione del file (esempio: "Dir1", "Dir2", "File.ext" rappresenta Dir1/Dir2/File.ext)
*** piece length(integer): lunghezza in byte di ogni parte in cui è suddiviso il(i) file
*** pieces(stringa): stringa che concatena le fingerprint SHA1 del/i file in formato ASCII. Se in fase di creazione la stringa non ha lunghezza multipla di 20, essa viene completata con zeri.