Wednesday, January 26, 2011

torrent

torrent file stores metadata used for BitTorrent. It is defined in the BitTorrent specification[1].

A torrent file contains the URLs of multiple trackers and integrity metadata about all the pieces. It can also contain additional metadata defined in extensions to the BitTorrent specification[2]. These are known as "BitTorrent Enhancement Proposals". Examples of such proposals include metadata for stating who created the torrent, and when.
Contents
[hide]

* 1 File structure
* 2 Extensions
o 2.1 Draft extensions
+ 2.1.1 Distributed hash tables
+ 2.1.2 Multiple trackers
+ 2.1.3 HTTP seeds
+ 2.1.4 Private torrents
+ 2.1.5 Merkle trees
* 3 Examples
o 3.1 Single file
o 3.2 Multiple files
* 4 References
* 5 External links

[edit] File structure

A torrent file is a bencoded dictionary with the following keys:

* announce - the URL of the tracker
* info - this maps to a dictionary whose keys are dependent on whether one or more files are being shared:
o name - suggested file/directory name where the file(s) is/are to be saved
o piece length - number of bytes per piece. This is commonly 218 = 256KiB = 262144B.
o pieces - concatenation of each piece's SHA-1 hash. As SHA-1 returns a 160-bit hash, pieces will be a string whose length is a multiple of 160-bits.

And exactly one of length (corresponds to when only one file is being shared) or files (corresponds to when multiple files are being shared):

*
o length - size of the file (in bytes)
o files - a list of dictionaries (each dictionary corresponds to a file) with the following keys:
+ path - a list of strings corresponding to subdirectory names, the last of which is the actual file name
+ length - size of the file (in bytes)

All strings must be UTF-8 encoded.
[edit] Extensions
[edit] Draft extensions

These extensions are under consideration for standardization.
[edit] Distributed hash tables

BEP-0005[3] extends BitTorrent to support distributed hash tables.

A trackerless torrent dictionary does not have an announce key. Instead, a trackerless torrent has a nodes key:

{
...
'nodes': [["", ], ["", ], ...]
...
}

For example,

'nodes': [["127.0.0.1", 6881], ["your.router.node", 4804]]

The specification recommends that nodes "should be set to the K closest nodes in the torrent generating client's routing table. Alternatively, the key could be set to a known good node such as one operated by the person generating the torrent."
[edit] Multiple trackers

BEP-0012[4] extends BitTorrent to support multiple trackers.

A new key, announce-list, is placed in the top-most list (i.e. with announce and info). This key's value is a list of tracker "tiers". Each tier is a list of URLs:

{
...
'announce-list': [["http://tracker.site1.com/announce"], ["http://tracker.site2.com/announce"]]
...
}

[edit] HTTP seeds

BEP-0017[5] extends BitTorrent to support HTTP seeds.

A new key, httpseeds, is placed in the top-most list (i.e. with announce and info). This key's value is a list of web addresses where torrent data can be retrieved:

{
...
'httpseeds': ['http://www.site1.com/source1.php', http://www.site2.com/source2.php']
...
}

[edit] Private torrents

BEP-0027[6] extends BitTorrent to support private torrents.

A new key, private, is placed in the info dictionary. This key's value is 1 if the torrent is private:

{
...
'private': 1
...
}

[edit] Merkle trees

BEP-0030[7] extends BitTorrent to support Merkle trees.

A torrent file using Merkle trees does not have a pieces key in the info list. Instead, such a torrent file has a root hash key in the info list. This key's value is the root hash of the Merkle hash:

{
...
'info': {
...
'root hash': e6bdebcc5d55da0a77f4bb1b57d88de794838577
...
}
...
}

[edit] Examples
[edit] Single file

Here is what a de-bencoded torrent file (with piece length 256KiB = 262144 bytes) for a file debian-503-amd64-CD-1.iso (whose size is 647MiB = 678301696 bytes) might look like:

{'announce': 'http://bttracker.debian.org:6969/announce'
'info': {'name': 'debian-503-amd64-CD-1.iso',
'piece length': 262144,
'length': 678301696,
'pieces': '841ae846bc5b6d7bd6e9aa3dd9e551559c82abc1 ... d14f1631d776008f83772ee170c42411618190a4'
}
}

Note: pieces here would be a ceil(length/piece length) * 160-bit = ceil(678301696/262144) * 160-bit = ceil(2587.515625) * 160-bit = 2588 * 160-bit = 414080-bit = 51KiB value.
[edit] Multiple files

Here is what a de-bencoded torrent file (with piece length 256KiB = 262144) for two files, 111.txt & 222.txt, might look like:

{'announce': 'http://tracker.site1.com/announce',
'info: {'name': 'directoryName',
'piece length': 262144,
'files': [ {'path': '111.txt', 'length': 111},
{'path': '222.txt', 'length': 222}
],
'pieces': '6a8af7eda90ba9f851831073c48ea6b7b7e9feeb...8a43d9d965a47f75488d3fb47d2c586337a20b9f'
}
}

[edit] References

1. ^ a b "BEP-0003: The BitTorrent Protocol Specification". Bittorrent.org. http://www.bittorrent.org/beps/bep_0003.html. Retrieved 2009-10-22.
2. ^ "BEP-0000: Index of BitTorrent Enhancement Proposals". Bittorrent.org. http://www.bittorrent.org/beps/bep_0000.html. Retrieved 2009-10-22.
3. ^ "BEP-0005: DHT Protocol". Bittorrent.org. http://www.bittorrent.org/beps/bep_0005.html. Retrieved 2009-10-22.
4. ^ "BEP-0012: Multitracker Metadata Extension". Bittorrent.org. http://www.bittorrent.org/beps/bep_0012.html. Retrieved 2009-10-22.
5. ^ "BEP-0017: HTTP Seeding". Bittorrent.org. http://www.bittorrent.org/beps/bep_0017.html. Retrieved 2009-10-22.
6. ^ "BEP-0027: Private Torrents". Bittorrent.org. http://www.bittorrent.org/beps/bep_0027.html. Retrieved 2009-10-22.
7. ^ "BEP-0030: Merkle hash torrent extension". Bittorrent.org. http://www.bittorrent.org/beps/bep_0030.html. Retrieved 2009-10-22.

No comments:

Post a Comment