aria2/aria2
GitHub: aria2/aria2
轻量级多协议命令行下载工具,支持多源分段下载、BitTorrent 和 RPC 远程管理,适合服务器端和自动化场景。
Stars: 40899 | Forks: 3861
# aria2 - 超高速下载实用工具
## 免责声明
本程序不提供任何保证。
您必须自担风险使用本程序。
## 简介
aria2 是一个用于下载文件的实用工具。支持的协议包括
HTTP(S)、FTP、SFTP、BitTorrent 和 Metalink。aria2 可以从多个
来源/协议下载文件,并尝试利用您的最大下载带宽。它支持同时从
HTTP(S)/FTP/SFTP 和 BitTorrent 下载文件,同时将从
HTTP(S)/FTP/SFTP 下载的数据上传到 BitTorrent
集群。使用 Metalink 的块校验和,aria2 可以在下载类似 BitTorrent 的文件时自动验证
数据块。
项目主页位于 https://aria2.github.io/。
请参阅 `aria2 在线手册
`_(`俄语翻译
`_,`葡萄牙语
翻译 `_)以了解
如何使用 aria2。
## 功能
以下是功能列表:
* 命令行界面
* 通过 HTTP(S)/FTP/SFTP/BitTorrent 下载文件
* 分段下载
* 支持 Metalink 版本 4 (RFC 5854) (HTTP/FTP/SFTP/BitTorrent)
* 支持 Metalink 版本 3.0 (HTTP/FTP/SFTP/BitTorrent)
* 支持 Metalink/HTTP (RFC 6249)
* HTTP/1.1 实现
* 支持 HTTP 代理
* 支持 HTTP BASIC 认证
* 支持 HTTP 代理认证
* 代理的常用环境变量:``http_proxy``,
``https_proxy``,``ftp_proxy``,``all_proxy`` 和 ``no_proxy``
* 支持 HTTP gzip, deflate 内容编码
* 在 HTTPS 中使用给定的受信任 CA 证书验证对端
* 在 HTTPS 中支持客户端证书认证
* 支持分块传输编码
* 使用 Firefox3 格式、Chromium/Google Chrome
和 Mozilla/Firefox
(1.x/2.x)/Netscape 格式从文件加载 Cookies。
* 以 Mozilla/Firefox (1.x/2.x)/Netscape 格式保存 Cookies。
* 支持自定义 HTTP Header
* 支持持久连接
* 通过 HTTP 代理的 FTP/SFTP
* 下载/上传速度限制
* BitTorrent 扩展:Fast extension、DHT、PEX、MSE/PSE、
Multi-Tracker、UDP tracker
* BitTorrent `WEB-Seeding `_。
aria2 请求的块大于 piece 大小以减少请求
开销。它还支持按 piece 大小的流水线请求。
* BitTorrent 本地 Peer 发现
* 完全重命名/更改 BitTorrent 下载的目录结构
* JSON-RPC (通过 HTTP 和 WebSocket)/XML-RPC 接口
* 作为守护进程运行
* 在多文件 torrent/Metalink 中选择性下载
* Metalink 中的块校验和验证
* 可以在 Metalink 中禁用分段下载
* Netrc 支持
* 配置文件支持
* 从文本文件或标准输入中发现的 URI 进行下载,并可选择指定目标
目录和输出文件名
* 参数化 URI 支持
* 支持 Happy Eyeballs 的 IPv6
* 减少磁盘活动的磁盘缓存
## 版本控制和发布计划
我们使用 3 个数字来表示 aria2 的版本:MAJOR.MINOR.PATCH。我们将在
每月的 15 日发布
MINOR 更新。如果自上次发布以来没有任何更改,我们可能会
跳过发布。为了方便翻译团队,功能和文档
冻结发生在发布日期前 10 天(即当月 5 日)。
我们大约会在那一天发布关于即将发布的
公告。
如果我们遇到安全问题,我们可能会在常规发布之间
发布 PATCH 版本。
目前 MAJOR 版本将保持在 1。
## 如何获取源代码
我们在 Github 维护源代码:
https://github.com/aria2/aria2
要获取最新的源代码,请运行以下命令:
```
$ git clone https://github.com/aria2/aria2.git
```
这将在您当前的目录中创建一个 aria2 目录,源
文件将存储在其中。
## 依赖关系
======================== ========================================
功能 依赖
======================== ========================================
HTTPS OSX 或 GnuTLS 或 OpenSSL 或 Windows
SFTP libssh2
BitTorrent 无。可选:libnettle+libgmp 或 libgcrypt
或 OpenSSL (见注释)
Metalink libxml2 或 Expat。
Checksum 无。可选:OSX 或 libnettle 或 libgcrypt
或 OpenSSL 或 Windows (见注释)
HTTP 中的 gzip, deflate zlib
异步 DNS C-Ares
Firefox3/Chromium cookie libsqlite3
XML-RPC libxml2 或 Expat。
基于 WebSocket 的 JSON-RPC libnettle 或 libgcrypt 或 OpenSSL
======================== ========================================
.. note::
如果同时安装了 libxml2 和 Expat,则 libxml2 优先。
如果您更喜欢 Expat,请使用 ``--without-libxml2`` 运行 configure。
.. note::
在 Apple OSX 上,将优先使用操作系统级别的 SSL/TLS 支持。因此
在该平台上不需要 GnuTLS 或 OpenSSL。如果您想
禁用此行为,请使用
``--without-appletls`` 运行 configure。
如果同时安装了 GnuTLS 和 OpenSSL,则 GnuTLS 优先。
如果您更喜欢 OpenSSL,请使用 ``--without-gnutls``
``--with-openssl`` 运行 configure。
在 Windows 上,提供了基于
Windows 原生 SSL 功能 的 SSL 实现,并且它将被
优先使用。因此在该平台上不需要 GnuTLS 或 OpenSSL。
如果您想禁用此行为,请使用
``--without-wintls`` 运行 configure。
.. note::
在 Apple OSX 上,将优先使用操作系统级别的校验和支持,
除非使用 ``--without-appletls`` 配置 aria2。
如果同时安装了 libnettle 和 libgcrypt,则 libnettle 优先。
如果您更喜欢 libgcrypt,请使用
``--without-libnettle --with-libgcrypt`` 运行 configure。如果选择了 OpenSSL 而不是
GnuTLS,则不会使用 libnettle 和 libgcrypt。
如果未安装任何可选依赖项,将使用仅支持 md5 和 sha1 的内部
实现。
在 Windows 上,提供了基于
Windows 原生功能的 SSL 实现,并且它将被优先使用,除非
使用 ``--without-wintls`` 配置 aria2。
用户可以采用以下 SSL 和加密库配置
之一:
* OpenSSL
* GnuTLS + libgcrypt
* GnuTLS + libnettle
* Apple TLS (仅限 OSX)
* Windows TLS (仅限 Windows)
您可以通过向 configure 脚本分别提供
``--disable-bittorrent`` 和 ``--disable-metalink`` 来禁用 BitTorrent 和 Metalink
支持。
要启用异步 DNS 支持,您需要 c-ares。
* c-ares: http://c-ares.haxx.se/
## 如何构建
aria2 主要用 C++ 编写。最初,它是基于
C++98/C++03 标准特性编写的。我们现在正在将 aria2 迁移到 C++11
标准。当前的源代码需要一个支持 C++11 的编译器。对于
知名编译器,例如 g++ 和 clang,必须支持 ``-std=c++11`` 或
``-std=c++0x`` 标志。
要从源代码包构建 aria2,您需要以下
开发包(包名可能因您使用的
发行版而异):
* libgnutls-dev (HTTPS、BitTorrent、Checksum 支持所需)
* nettle-dev (BitTorrent、Checksum 支持所需)
* libgmp-dev (BitTorrent 所需)
* libssh2-1-dev (SFTP 支持所需)
* libc-ares-dev (异步 DNS 支持所需)
* libxml2-dev (Metalink 支持所需)
* zlib1g-dev (HTTP 中的 gzip、deflate 解码支持所需)
* libsqlite3-dev (Firefox3/Chromium cookie 支持所需)
* pkg-config (检测已安装的库所需)
您可以使用 libgcrypt-dev 代替 nettle-dev 和 libgmp-dev:
* libgpg-error-dev (BitTorrent、Checksum 支持所需)
* libgcrypt-dev (BitTorrent、Checksum 支持所需)
您可以使用 libssl-dev 代替
libgnutls-dev、nettle-dev、libgmp-dev、libgpg-error-dev 和 libgcrypt-dev:
* libssl-dev (HTTPS、BitTorrent、Checksum 支持所需)
您可以使用 libexpat1-dev 代替 libxml2-dev:
* libexpat1-dev (Metalink 支持所需)
在 Fedora 上,您需要以下软件包:gcc、gcc-c++、kernel-devel、
libgcrypt-devel、libxml2-devel、openssl-devel、gettext-devel、cppunit
如果您是从 git 仓库下载的源代码,您必须安装
以下软件包以获取 autoconf 宏:
* libxml2-dev
* libcppunit-dev
* autoconf
* automake
* autotools-dev
* autopoint
* libtool
并运行以下命令以生成 configure 脚本和构建程序所需的其他文件:
```
$ autoreconf -i
```
此外,您需要 `Sphinx `_ 来构建 man page。
如果您正在为 Mac OS X 构建 aria2,请查看
makerelease-osx.mk GNU Make makefile。
构建 aria2 最快捷的方法是首先运行 configure 脚本:
```
$ ./configure
```
要构建静态链接的 aria2,请使用 ``ARIA2_STATIC=yes``
命令行选项:
```
$ ./configure ARIA2_STATIC=yes
```
配置完成后,运行 ``make`` 来编译程序:
```
$ make
```
请参阅 `Cross-compiling Windows binary`_ 以创建 Windows 二进制文件。
请参阅 `Cross-compiling Android binary`_ 以创建 Android 二进制文件。
configure 脚本会检查可用的库,并尽可能多地启用
功能,默认未启用的实验性功能除外。
从 1.1.0 版本开始,aria2 默认检查 HTTPS 服务器的证书。
如果您使用 OpenSSL 或包含
``gnutls_certificate_set_x509_system_trust()`` 函数的最近版本的 GnuTLS 进行构建,并且
库已正确配置以定位系统范围的 CA
证书存储,aria2 将在启动时自动加载这些
证书。如果不是这种情况,我建议提供
CA bundle 文件的路径。例如,在 Debian 中,CA bundle
文件的路径是 '/etc/ssl/certs/ca-certificates.crt'(在 ca-certificates
包中)。这可能因您的发行版而异。您可以使用
``--with-ca-bundle option`` 将其提供给 configure 脚本:
```
$ ./configure --with-ca-bundle='/etc/ssl/certs/ca-certificates.crt'
$ make
```
如果没有 ``--with-ca-bundle`` 选项,您在访问
HTTPS 服务器时会遇到错误,因为在没有 CA bundle 的
情况下无法验证证书。在这种情况下,您可以使用 aria2 的
``--ca-certificate`` 选项指定 CA bundle 文件。如果您没有安装 CA bundle
文件,那么最后的手段是使用
``--check-certificate=false`` 禁用证书验证。
使用原生的 OSX (AppleTLS) 和/或 Windows (WinTLS) 实现
将自动使用系统证书存储,因此在使用这些实现时
不需要 ``--with-ca-bundle``,并且该选项将被忽略。
默认情况下,名为 ``aria2c`` 的 bash_completion 文件被安装到
目录 ``$prefix/share/doc/aria2/bash_completion``。要更改
该文件的安装目录,请使用 ``--with-bashcompletiondir``
选项。
在执行 ``make`` 之后,可执行文件位于 ``src/aria2c``。
aria2 使用 CppUnit 进行自动化单元测试。要运行单元测试:
```
$ make check
```
## 交叉编译 Windows 二进制文件
在本节中,我们将描述如何在 Debian
Linux 上使用 mingw-w64 (http://mingw-w64.org/doku.php) 交叉编译器构建 Windows 二进制文件。MinGW (http://www.mingw.org/) 可能无法构建
aria2。
构建 Windows 二进制文件最简单的方法是使用 Dockerfile.mingw。请参阅
Dockerfile.mingw 了解如何构建二进制文件。如果您无法使用 Dockerfile,
请继续阅读以下段落。
基本上,在编译并安装了依赖库之后,您只需
向 configure 传递适当的 ``--host`` 选项并
指定 ``CPPFLAGS``、``LDFLAGS`` 和 ``PKG_CONFIG_LIBDIR``
变量即可进行交叉编译。为了方便并降低我们自己的
开发成本,我们提供了一种更简单的方法来配置构建设置。
``mingw-config`` 脚本是 mingw-w64 的 configure 脚本包装器。
我们使用它来创建官方 Windows 构建。此脚本假定
以下库已为交叉编译而构建:
* c-ares
* expat
* sqlite3
* zlib
* libssh2
* cppunit
可以调整一些环境变量以更改构建设置:
``HOST``
交叉编译以构建在 ``HOST`` 上运行的程序。默认为
``i686-w64-mingw32``。要构建 64 位二进制文件,请指定
``86_64-w64-mingw32``。
``PREFIX``
依赖库安装目录的前缀。它
默认为 ``/usr/local/$HOST``。``-I$PREFIX/include`` 将被
添加到 ``CPPFLAGS``。``-L$PREFIX/lib`` 将被添加到
``LDFLAGS``。``$PREFIX/lib/pkgconfig`` 将被设置为
``PKG_CONFIG_LIBDIR``。
例如,要构建 64 位二进制文件,请执行以下操作:
```
$ HOST=x86_64-w64-mingw32 ./mingw-config
```
如果您想要通过 ``--enable-libaria2`` 获取 libaria2 dll,请不要使用
``ARIA2_STATIC=yes`` 并准备外部库的 DLL 版本。
## 交叉编译 Android 二进制文件
在本节中,我们将描述如何在 Debian
Linux 上使用 Android NDK 交叉编译器构建 Android 二进制文件。
在撰写本文时,Android NDK r21e 应该可以无误地编译 aria2。
``android-config`` 脚本是用于 Android
构建的 configure 脚本包装器。我们使用它来创建官方的 Android 构建。此脚本假定
以下库已为交叉编译而构建:
* c-ares
* openssl
* expat
* zlib
* libssh2
在构建上述库时,请确保禁用共享
库并仅启用静态库。我们将静态链接这些
库。
``android-config`` 假定已定义 ``$ANDROID_HOME`` 和 ``$NDK``
环境变量。
我们目前使用 Android NDK r21e。``$NDK`` 应指向
Android NDK 的目录。构建工具可以在
``$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/`` 下找到。
所有依赖库必须安装在
``$ANDROID_HOME/usr/local`` 下。
在执行 ``android-config`` 之后,运行 ``make`` 来编译源代码。
## 构建文档
`Sphinx `_ 用于构建
文档。如果 aria2 的 man pages 不是最新的,当您运行 ``make`` 时将构建它们。您也可以通过 ``make html`` 构建 aria2
man page 的 HTML 版本。HTML 版本的手册也可
`在线获取 `_(`俄语
翻译 `_,`葡萄牙语
翻译 `_)。
## BitTorrent
### 关于文件名
下载文件的文件名按以下方式确定:
单文件模式
如果 .torrent 文件中存在 "name" 键,则文件名为 "name" 键的值。否则,文件名为附加了 ".file" 的 .torrent 文件的基本名称。例如,.torrent 文件是
"test.torrent",则文件名是 "test.torrent.file"。存储下载文件的目录可以通过 -d 选项指定。
多文件模式
将创建 .torrent 文件中提到的完整目录/文件结构。存储下载文件顶层目录的目录可以通过 -d 选项指定。
在下载开始之前,如果需要,将创建一个完整的目录结构。默认情况下,aria2 最多打开 .torrent 文件中提到的 100 个文件,并直接对这些文件进行读写。
同时打开的文件数量可以通过 ``--bt-max-open-files`` 选项控制。
### DHT
aria2 支持与 mainline 兼容的 DHT。默认情况下,IPv4 DHT 的路由表保存到 ``$XDG_CACHE_HOME/aria2/dht.dat``,IPv6 DHT 的路由表保存到
``$XDG_CACHE_HOME/aria2/dht6.dat``,除非文件存在于
``$HOME/.aria2/dht.dat`` 或 ``$HOME/.aria2/dht6.dat``。aria2 使用相同的端口号来监听 IPv4 和 IPv6 DHT。
### UDP tracker
当启用 IPv4 DHT 时,将启用 UDP tracker 支持。UDP tracker 的端口号与 DHT 共享。使用 ``--dht-listen-port``
选项更改端口号。
### 其他注意事项
* ``-o`` 选项用于更改 .torrent 文件本身的文件名,
而不是 .torrent 文件中某个文件的文件名。为此,请改用
``--index-out`` 选项。
* aria2 默认使用的 TCP 和 UDP 端口号是 6881-6999。
* aria2 不会自动配置端口转发。请
手动配置您的路由器或防火墙。
* 最大 peer 数为 55。当下载速率较低时,可能会超过此限制。可以使用 ``--bt-request-peer-speed-limit`` 选项调整此下载速率。
* 自 0.10.0 版本起,aria2 在
选择性下载完成后停止发送请求消息。
## Metalink
当前的实现支持 HTTP(S)/FTP/SFTP/BitTorrent。其他 P2P 协议将被忽略。支持 Metalink4 (RFC 5854) 和
Metalink 版本 3.0 文档。
对于校验和验证,支持 md5、sha-1、sha-224、sha-256、sha-384 和 sha-512。如果提供了多种哈希算法,aria2
将使用更强的一种。如果整个文件的校验和验证失败,aria2
不会重试下载,而是直接以非零返回码退出。
支持的用户首选项包括版本、语言、位置、
协议和操作系统。
如果在 Metalink 文件中提供了块校验和,aria2 将在下载期间自动验证数据块。可以通过命令行选项关闭此行为。
如果 Metalink 文件中包含签名,aria2 会在
下载完成后将其保存为文件。文件名为下载文件名 + ".sig"。如果同名文件已存在,则不会保存签名文件。
在 Metalink4 中,多文件 torrent 可以出现在 metalink:metaurl
元素中。由于 aria2 无法同时下载 2 个相同的 torrent,aria2 会将具有相同 BitTorrent metaurl 的 metalink:file 元素中的文件分组,并从单个 BitTorrent 集群下载它们。
这基本上是一个带有文件选择的多文件 torrent 下载,因此不在 Metalink 文档中但与所选文件共享相同 piece 的相邻文件也会被创建。
如果在 metalink:url 或 metalink:metaurl 元素中指定了相对 URI,
aria2 将使用 Metalink 文件的 URI 作为基础 URI 来解析相对 URI。如果在从
本地磁盘读取的 Metalink 文件中发现了相对 URI,aria2 将使用 ``--metalink-base-uri``
选项的值作为基础 URI。如果未指定此选项,相对 URI 将被忽略。
## Metalink/HTTP
当前的实现仅使用 rel=duplicate 链接。aria2
理解 Digest 头字段,并检查它是否与来自其他来源的
摘要值匹配。如果不同,则断开连接。
aria2 还使用此摘要值在下载完成后执行校验和验证。aria2 可识别 geo 值。要告诉 aria2 您首选哪个位置,可以使用 ``--metalink-location`` 选项。
## netrc
默认情况下,HTTP(S)/FTP/SFTP 启用了 netrc 支持。要禁用
netrc 支持,请指定 -n 命令行选项。您的 .netrc 文件
应具有正确的权限 (600)。
## WebSocket
aria2 中嵌入的 WebSocket 服务器实现了
RFC 6455 中定义的规范。支持的协议版本为 13。
## libaria2
libaria2 是一个 C++ 库,它向客户端代码提供 aria2 功能。目前,libaria2 默认不构建。要启用
libaria2,请使用 ``--enable-libaria2`` configure 选项。默认情况下,
仅构建共享库。要构建静态库,还需使用
``--enable-static`` configure 选项。请参阅 libaria2
文档以了解如何使用 API。
## 参考文献
* `aria2 在线手册 `_
* https://aria2.github.io/
* `RFC 959 FILE TRANSFER PROTOCOL (FTP) `_
* `RFC 1738 Uniform Resource Locators (URL) `_
* `RFC 2428 FTP Extensions for IPv6 and NATs `_
* `RFC 2616 Hypertext Transfer Protocol -- HTTP/1.1 `_
* `RFC 3659 Extensions to FTP `_
* `RFC 3986 Uniform Resource Identifier (URI): Generic Syntax `_
* `RFC 4038 Application Aspects of IPv6 Transition `_
* `RFC 5854 The Metalink Download Description Format `_
* `RFC 6249 Metalink/HTTP: Mirrors and Hashes `_
* `RFC 6265 HTTP State Management Mechanism `_
* `RFC 6266 Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP) `_
* `RFC 6455 The WebSocket Protocol `_
* `RFC 6555 Happy Eyeballs: Success with Dual-Stack Hosts `_
* `The BitTorrent Protocol Specification `_
* `BitTorrent: DHT Protocol `_
* `BitTorrent: Fast Extension `_
* `BitTorrent: IPv6 Tracker Extension `_
* `BitTorrent: Extension for Peers to Send Metadata Files `_
* `BitTorrent: Extension Protocol `_
* `BitTorrent: Multitracker Metadata Extension `_
* `BitTorrent: UDP Tracker Protocol for BitTorrent `_
以及 `BitTorrent udp-tracker protocol specification `_。
* `BitTorrent: WebSeed - HTTP/FTP Seeding (GetRight style) `_
* `BitTorrent: Private Torrents `_
* `BitTorrent: BitTorrent DHT Extensions for IPv6 `_
* `BitTorrent: Message Stream Encryption `_
* `Kademlia: A Peer-to-peer Information System Based on the XOR Metric `_
标签:aria2, BitTorrent, BT下载, C++, HTTPS, HTTP 参数枚举, Metalink, 下载器, 下载工具, 下载引擎, 二进制发布, 分段下载, 多协议下载, 多线程下载, 安全测试工具, 带宽优化, 开源工具, 数据擦除, 文件传输, 磁力链接, 离线下载, 网盘辅助, 网络信息收集, 网络爬虫辅助, 资源下载, 资源抓取, 轻量级工具