|
@@ -0,0 +1,183 @@
|
|
|
+Technical Notes
|
|
|
+===============
|
|
|
+
|
|
|
+This document describes additional technical information of aria2. The
|
|
|
+expected audience is developers.
|
|
|
+
|
|
|
+Control File (*.aria2) Format
|
|
|
+-----------------------------
|
|
|
+
|
|
|
+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 bytes
|
|
|
+
|
|
|
+ Should 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 bytes
|
|
|
+
|
|
|
+ If 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 bytes
|
|
|
+
|
|
|
+ The 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)`` bytes
|
|
|
+
|
|
|
+ BitTorrent InfoHash.
|
|
|
+
|
|
|
+``PIECE LENGTH``: 4 bytes
|
|
|
+
|
|
|
+ The length of the piece.
|
|
|
+
|
|
|
+``TOTAL LENGTH``: 8 bytes
|
|
|
+
|
|
|
+ The total length of the download.
|
|
|
+
|
|
|
+``UPLOAD LENGTH``: 8 bytes
|
|
|
+
|
|
|
+ The uploaded length in this download.
|
|
|
+
|
|
|
+``BITFIELD LENGTH``: 4 bytes
|
|
|
+
|
|
|
+ The length of bitfield.
|
|
|
+
|
|
|
+``BITFIELD``: ``(BITFIELD LENGTH)`` bytes
|
|
|
+
|
|
|
+ This is the bitfield which represents current download progress.
|
|
|
+
|
|
|
+``NUM IN-FLIGHT PIECE``: 4 bytes
|
|
|
+
|
|
|
+ The 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 bytes
|
|
|
+
|
|
|
+ The index of the piece.
|
|
|
+
|
|
|
+``LENGTH``: 4 bytes
|
|
|
+
|
|
|
+ The length of the piece.
|
|
|
+
|
|
|
+``PIECE BITFIELD LENGTH``: 4 bytes
|
|
|
+
|
|
|
+ The length of bitfield of this piece.
|
|
|
+
|
|
|
+``PIECE BITFIELD``: ``(PIECE BITFIELD LENGTH)`` bytes
|
|
|
+
|
|
|
+ The bitfield of this piece. The each bit represents 16KiB chunk.
|
|
|
+
|
|
|
+DHT routing table file format
|
|
|
+-----------------------------
|
|
|
+
|
|
|
+aria2 saves IPv4 DHT routing table in ``${HOME}/.aria2/dht.dat`` and
|
|
|
+IPv6 DHT routing table in ``${HOME}/.aria2/dht6.dat`` by default.
|
|
|
+
|
|
|
+``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 bytes
|
|
|
+
|
|
|
+ It must be ``0xa1 0xa2``.
|
|
|
+
|
|
|
+``FMT`` (FORMAT ID): 1 byte
|
|
|
+
|
|
|
+ The format ID should be ``0x02``.
|
|
|
+
|
|
|
+``VER`` (VERSION): 2 bytes
|
|
|
+
|
|
|
+ The version number should be ``0x00 0x03``.
|
|
|
+
|
|
|
+``MTIME``: 8 bytes
|
|
|
+
|
|
|
+ This 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 bytes
|
|
|
+
|
|
|
+ Node ID of the client.
|
|
|
+
|
|
|
+``NUM NODE``: 4 bytes
|
|
|
+
|
|
|
+ The 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 byte
|
|
|
+
|
|
|
+ The length of compact peer info. For IPv4 DHT, it must be 6. For
|
|
|
+ IPv6 DHT, it must be 18.
|
|
|
+
|
|
|
+``COMPACT PEER INFO``: ``(PLEN)`` bytes
|
|
|
+
|
|
|
+ The address and port of peer in compact peer format.
|
|
|
+
|
|
|
+``NODE ID``: 20 bytes
|
|
|
+
|
|
|
+ The node ID of this node.
|