This document describes additional technical information of aria2. The expected audience is developers.
The control file uses a binary format to store progress information of a download. Here is the diagram for each field:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+---+-------+-------+-------------------------------------------+
|VER| EXT |INFO |INFO HASH ... |
|(2)| (4) |HASH | (INFO HASH LENGTH) |
| | |LENGTH | |
| | | (4) | |
+---+---+---+-------+---+---------------+-------+---------------+
|PIECE |TOTAL LENGTH |UPLOAD LENGTH |BIT- |BITFIELD ... |
|LENGTH | (8) | (8) |FIELD | (BITFIELD |
| (4) | | |LENGTH | LENGTH) |
| | | | (4) | |
+-------+-------+-------+-------+-------+-------+---------------+
|NUM |INDEX |LENGTH |PIECE |PIECE BITFIELD ... |
|IN- | (4) | (4) |BIT- | (PIECE BITFIELD LENGTH) |
|FLIGHT | | |FIELD | |
|PIECE | | |LENGTH | |
| (4) | | | (4) | |
+-------+-------+-------+-------+-------------------------------+
^ ^
| |
+-------------------------------------------------------+
Repeated in (NUM IN-FLIGHT) PIECE times
VER
(VERSION): 2 bytesShould be either version 0(0x0000) or version 1(0x0001). In version 1, all multi-byte integers are saved in network byte order(big endian). In version 0, all multi-byte integers are saved in host byte order. aria2 1.4.1 can read both versions and only writes a control file in version 1 format. version 0 support will be disappear in the future version.
EXT
(EXTENSION): 4 bytesIf LSB is 1(i.e. EXT[3]&1 == 1
), aria2 checks whether the saved
!InfoHash and current downloading one are the same. If they are not
the same, an exception is thrown. This is called “infoHashCheck”
extension.
INFO HASH LENGTH
: 4 bytesThe length of InfoHash that is located after this field. If “infoHashCheck” extension is enabled, if this value is 0, then an exception is thrown. For http/ftp downloads, this value should be 0.
INFO HASH
: (INFO HASH LENGTH)
bytesBitTorrent InfoHash.
PIECE LENGTH
: 4 bytesThe length of the piece.
TOTAL LENGTH
: 8 bytesThe total length of the download.
UPLOAD LENGTH
: 8 bytesThe uploaded length in this download.
BITFIELD LENGTH
: 4 bytesThe length of bitfield.
BITFIELD
: (BITFIELD LENGTH)
bytesThis is the bitfield which represents current download progress.
NUM IN-FLIGHT PIECE
: 4 bytesThe number of in-flight pieces. These piece is not marked ‘downloaded’ in the bitfield, but it has at least one downloaded chunk.
The following 4 fields are repeated in (NUM IN-FLIGHT PIECE)
times.
INDEX
: 4 bytesThe index of the piece.
LENGTH
: 4 bytesThe length of the piece.
PIECE BITFIELD LENGTH
: 4 bytesThe length of bitfield of this piece.
PIECE BITFIELD
: (PIECE BITFIELD LENGTH)
bytesThe bitfield of this piece. The each bit represents 16KiB chunk.
aria2 saves IPv4 DHT routing table in
${XDG_CACHE_HOME}/aria2/dht.dat
and IPv6 DHT routing table in
${XDG_CACHE_HOME}/aria2/dht6.dat
by default unless
${HOME}/.aria2/dht.dat
and ${HOME}/.aria2/dht.dat
are present.
dht.dat
and dht6.dat
files use same binary encoding and have
following fields. All multi byte integers are in network byte
order. RSV
(RESERVED) fields are reserved for future use. For now
they should be all zeros:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+---+-+---+-----+---------------+---------------+---------------+
|MGC|F|VER| RSV | MTIME | RSV |LOCAL NODE ID :
|(2)|M|(2)| (3) | (8) | (8) | (20) :
| |T| | | | | :
+---+-+---+-----+-------+-------+-------+-------+---------------+
:LOCAL NODE ID | RSV | NUM | RSV |
: (continued) | (4) | NODE | (4) |
: | | (4) | |
+-+-------------+-------+-------+-+-----+-------+---------------+
|P| RSV |COMPACT PEER INFO| RSV | <-+
|L| (7) | (PLEN) | (24 - PLEN) | |
|E| | | | |
|N| | | | |
+-+-------------+-----------------+-----+-------+---------------+ |
| NODE ID | RSV | |
| (20) | (4) | <-----------------+
+---------------------------------------+-------+ Repeated in
(NUM NODE) times.
MGC
(MAGIC): 2 bytesIt must be 0xa1 0xa2
.
FMT
(FORMAT ID): 1 byteThe format ID should be 0x02
.
VER
(VERSION): 2 bytesThe version number should be 0x00 0x03
.
MTIME
: 8 bytesThis is the time when aria2 saved the file. The value is the time since the Epoch(1970/1/1 00:00:00) in 64 bits integer.
LOCALNODE ID
: 20 bytesNode ID of the client.
NUM NODE
: 4 bytesThe number of nodes the routing table has. NUM NODE
node
information follows.
The data of NUM NODE
node will follow. The node information are
stored in the following fields. They are repeated in NUM NODE
times.
PLEN
(COMPACT PEER INFO LENGTH): 1 byteThe length of compact peer info. For IPv4 DHT, it must be 6. For IPv6 DHT, it must be 18.
COMPACT PEER INFO
: (PLEN)
bytesThe address and port of peer in compact peer format.
NODE ID
: 20 bytesThe node ID of this node.