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, 下载器, 下载工具, 下载引擎, 二进制发布, 分段下载, 多协议下载, 多线程下载, 安全测试工具, 带宽优化, 开源工具, 数据擦除, 文件传输, 磁力链接, 离线下载, 网盘辅助, 网络信息收集, 网络爬虫辅助, 资源下载, 资源抓取, 轻量级工具