技术说明

本文档描述了aria2的附加技术信息。预期的读者是开发者。

控制文件(*.aria2)格式

控制文件使用二进制格式来存储下载的进度信息。下面是每个字段的图示:

 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)  |                               |
+-------+-------+-------+-------+-------------------------------+

        ^                                                       ^
        |                                                       |
        +-------------------------------------------------------+
                重复 (NUM IN-FLIGHT) PIECE 次数
VER (版本): 2 bytes

应为版本0(0x0000)或版本1(0x0001)。在版本1中,所有多字节整数以网络字节顺序(大端)保存。在版本0中,所有多字节整数以主机字节顺序保存。aria2 1.4.1可以读取这两个版本,但只以版本1格式写控制文件。版本0的支持将在未来版本中消失。

EXT (扩展): 4 bytes

如果最低有效位为1(即``EXT[3]&1 == 1``),aria2会检查保存的InfoHash和当前下载的InfoHash是否相同。如果它们不相同,则抛出异常。这称为”infoHashCheck”扩展。

INFO HASH LENGTH: 4 bytes

InfoHash长度,位于此字段之后。如果启用了”infoHashCheck”扩展,且此值为0,则会抛出异常。对于http/ftp下载,此值应为0。

INFO HASH: (INFO HASH LENGTH) bytes

BitTorrent InfoHash。

PIECE LENGTH: 4 bytes

片段的长度。

TOTAL LENGTH: 8 bytes

下载的总长度。

UPLOAD LENGTH: 8 bytes

本次下载的上传长度。

BITFIELD LENGTH: 4 bytes

位字段的长度。

BITFIELD: (BITFIELD LENGTH) bytes

表示当前下载进度的位字段。

NUM IN-FLIGHT PIECE: 4 bytes

飞行中片段的数量。这些片段在位字段中没有标记为’已下载’,但至少有一个已下载的块。

以下4个字段重复 (NUM IN-FLIGHT PIECE) 次数。

INDEX: 4 bytes

片段的索引。

LENGTH: 4 bytes

片段的长度。

PIECE BITFIELD LENGTH: 4 bytes

此片段的位字段长度。

PIECE BITFIELD: (PIECE BITFIELD LENGTH) bytes

此片段的位字段。每个位代表16KiB的块。

DHT路由表文件格式

aria2默认情况下在 ${XDG_CACHE_HOME}/aria2/dht.dat 保存IPv4 DHT路由表,以及在 ${XDG_CACHE_HOME}/aria2/dht6.dat 保存IPv6 DHT路由表,除非 ${HOME}/.aria2/dht.dat${HOME}/.aria2/dht.dat 存在。

dht.datdht6.dat 文件使用相同的二进制编码,并具有以下字段。所有多字节整数均以网络字节顺序保存。RSV (保留)字段用于未来使用。目前应全部为零:

 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| RSV |VER|     MTIME     |     RSV       |LOCAL NODE ID  :
|(2)|M| (3) |(2)|      (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)  | <-----------------+
+---------------------------------------+-------+   重复 (NUM NODE) 次数
MGC (魔法): 2 bytes

必须为 0xa1 0xa2

FMT (格式ID): 1 byte

格式ID应为 0x02

VER (版本): 2 bytes

版本号应为 0x00 0x03

MTIME: 8 bytes

这是aria2保存文件的时间。该值是自纪元(1970/1/1 00:00:00)以来的时间,以64位整数表示。

LOCALNODE ID: 20 bytes

客户端的节点ID。

NUM NODE: 4 bytes

路由表中的节点数量。NUM NODE 节点信息随后。

NUM NODE 节点的数据将随后。节点信息存储在以下字段中。它们重复 NUM NODE 次数。

PLEN (紧凑对等信息长度): 1 byte

紧凑对等信息的长度。对于IPv4 DHT,必须为6。对于IPv6 DHT,必须为18。

COMPACT PEER INFO: (PLEN) bytes

对等方的地址和端口的紧凑对等格式。

NODE ID: 20 bytes

该节点的节点ID。