技术说明 ======= 本文档描述了aria2的附加技术信息。预期的读者是开发者。 控制文件(*.aria2)格式 ---------------------- 控制文件使用二进制格式来存储下载的进度信息。下面是每个字段的图示: .. code-block:: text 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.dat`` 和 ``dht6.dat`` 文件使用相同的二进制编码,并具有以下字段。所有多字节整数均以网络字节顺序保存。``RSV`` (保留)字段用于未来使用。目前应全部为零: .. code-block:: text 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。