文章信息均来自 aria2 官网:aria2 和 开源仓库:https://github.com/aria2/aria2
👾 aria2 是什么?
- aria2 是一个轻量级、多协议、多数据源的下载工具;
- aria2 支持的协议 HTTP/HTTPS、FTP、SFTP、BitTorrent 和 Metalink;
- aria2 可以从多个来源/协议下载文件,并尝试利用您的最大下载带宽,它支持同时从 HTTP(S)/FTP/SFTP 和 BitTorrent 下载文件,而从 HTTP(S)/FTP/SFTP 下载的数据上传到 BitTorrent 群,可以使用 Metalink 自动验证来自像 BitTorrent 文件这样的数据块;
- aria2 的使用者可以通过内置的 JSON-RPC 和 XML-RPC 服务进行操作,在操作时可以使用密钥保证操作者是有权限的;
⬇️ 下载 aria2 的方法
在 aria2 仓库中发行的版本:aria2 最新发行版
你可以直接下载适用于 Windows 和 Android 的源代码分发和二进制文件。
✨ aria2 特点
- 命令行界面
- 支持 HTTP(S)、FTP、SFTP 和 BitTorrent 下载文件
- 分段下载
- 支持 Metalink version 4 (RFC 5854)(HTTP/FTP/SFTP/BitTorrent)
- 支持 Metalink version 3.0 (HTTP/FTP/SFTP/BitTorrent)
- 支持 Metalink/HTTP (RFC 6249)
- 实现 HTTP/1.1
- 支持 HTTP 代理
- 支持 HTTP Basic Authentication(HTTP基本认证)
- 支持 HTTP Proxy authentication(HTTP代理认证)
- 支持目前已知的代理环境变量,
http_proxy
https_proxy
ftp_proxy
all_proxyno_proxy
- 支持 HTTP gzip、deflate 内容编码
- 支持验证 HTTS 给定的 CA 证书
- 支持分块传输编码
- 支持从 Firefox3、Chromium、Google Chrome 和 Mozilla / Firefox(1.x / 2.x)/ Netscape格式中获取 Cookie
- 支持以 Mozilla/Firefox (1.x/2.x)/Netscape 格式保存 Cookie
- 支持自定义 HTTP 标头
- 支持持久链接
- 支持通过 HTTP 代理的 FTP/SFTP
- 限制上传/下载速度
- BitTorrent 扩展:Fast extension, DHT, PEX, MSE/PSE, Multi-Tracker, UDP tracker
- BitTorrent WEB-Seeding。aria2 请求大于 piece size 的 chunks 以减少请求开销。它还支持 piece size 的流水线请求。
- BitTorrent Local Peer Discovery
- 重命名/更改下载完成的 BitTorrent 目录结构
- 支持 JSON-RPC (通过 HTTP 和 WebSocket)/XML-RPC 服务接口
- 支持作为守护进程运行
- 支持在 multi-file torrent/Metalink 中选择下载
- 支持 Metalink 中的块校验和验证
- 支持在 Metalink 中禁用分段下载
- 支持 Netrc
- 支持配置文件
- 支持下载在文本文件和 stdin 中获取的 URIs,可以选择指定输出目录和文件名称
- 支持 Parameterized URI
- 支持 IPV6
- 支持 磁盘缓存以减少磁盘使用
🍂 版本控制和发布计划
我们对 aria2 版本使用 3 段数字:主要.次要.补丁。我们将在每月 15 号发布次要更新,如果自上次发布以来没有任何更改,我们可能会跳过一个版本。
如果我们遇到安全问题,我们可能会在常规版本之间发布 补丁 版本。
主要版本号我们暂时停留在 1 上。
🦋 许可证
这个程序是自由软件;您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款重新分发和/或修改它;许可证的版本 2,或(由您选择)任何更高版本。
🐎 使用示例
命令行吓到你了?不要慌,aria2 真的很容易使用。
从 WEB 下载文件:
|
|
一次性使用不同的协议下载多个文件:
|
|
每个 Host 使用两个链接下载:
|
|
BitTorrent:
|
|
BitTorrent 磁力链接:
|
|
Metalink:
|
|
下载文本文件中的 URIs:
|
|
怎么获取源代码?
我们在Github上维护源代码:https://github.com/aria2/aria2
若要获取最新的源代码,请运行以下命令:
|
|
这将在当前目录中创建 aria2 目录,源文件将存储在那里。
依赖
特点 | 依赖 |
---|---|
HTTPS | OSX or GnuTLS or OpenSSL or Windows |
SFTP | libssh2 |
BitTorrent | None. Optional: libnettle+libgmp or libgcrypt or OpenSSL (see note) |
Metalink | libxml2 or Expat. |
Checksum | None. Optional: OSX or libnettle or libgcrypt or OpenSSL or Windows (see note) |
gzip, deflate in HTTP | zlib |
Async DNS | C-Ares |
Firefox3/Chromium cookie | libsqlite3 |
XML-RPC | libxml2 or Expat. |
JSON-RPC over WebSocket | libnettle or libgcrypt or OpenSSL |
注意
如果安装了两个库,则 libxml2 优先于 Expat。如果您更喜欢 Expat,请运行 --without-libxml2
注意
在 Apple OSX 上支持系统级的 SSL/TLS。因此,在该平台上既不需要 GNUTL 也不需要 OpenSSL 。如果要禁用此行为,请运行 --without-appletls
如果安装了两个库,则 GnuTLS 优先于 OpenSSL。如果您喜欢 OpenSSL,请运行 --without-gnutls
--with-openssl
在 Windows 上,可以使用基于本机 Windows SSL 功能(Schannel)的 SSL 实现,这将是首选。因此,在该平台上既不需要 GNUTL 也不需要 OpenSSL 。如果要禁用此行为,请运行 --without-wintls
注意
在 Apple OSX 上,系统级校验和支持将是首选,除非 aria2 配置为 --without-appletls
如果安装了两个库,则 libnettle 优先于 libgcrypt。如果您更喜欢 libgcrypt,请运行--without-libnettle --with-libgcrypt
。如果在 GNUTL 上选择 OpenSSL,则不会使用 libnettle 或 libgcrypt。
如果没有安装任何可选依赖项,则将使用仅支持 md5 和 sha1 的内部实现。
在 Windows 上,可以使用基于本机 Windows 功能的 SSL 实现,除非 aria2 配置为 --without-wintls
用户可以具有以下 SSL 和 crypto libraries 配置之一:
- OpenSSL
- GnuTLS + libgcrypt
- GnuTLS + libnettle
- Apple TLS (OSX only)
- Windows TLS (Windows only)
在运行时可以提供--disable-bittorrent
和 --disable-metalink
来禁用 BitTorrent 和 Metalink 的支持。
为了启用异步 DNS 支持,你需要 c-ares。
- c-ares: http://c-ares.haxx.se/
如何构建(build)
aria2 主要用 C++ 编写,最初它是基于 C++98/C++03 标准特性编写的。我们现在正在将 aria2 迁移到 C++11 标准。当前的源代码需要支持 C++11 的编译器。对于众所周知的编译器,例如 g++ 和clang,必须支持 or flag。-std=c++11-std=c++0x
为了从源软件包构建 aria2,您需要以下开发软件包(软件包名称可能因您使用的发行版而异):
- libgnutls-dev (Required for HTTPS, BitTorrent, Checksum support)
- nettle-dev (Required for BitTorrent, Checksum support)
- libgmp-dev (Required for BitTorrent)
- libssh2-1-dev (Required for SFTP support)
- libc-ares-dev (Required for async DNS support)
- libxml2-dev (Required for Metalink support)
- zlib1g-dev (Required for gzip, deflate decoding support in HTTP)
- libsqlite3-dev (Required for Firefox3/Chromium cookie support)
- pkg-config (Required to detect installed libraries)
您可以使用 libgcrypt-dev 而不是 nettle-dev 和 libgmp-dev:
- libgpg-error-dev (Required for BitTorrent, Checksum support)
- libgcrypt-dev (Required for BitTorrent, Checksum support)
您可以使用 libssl-dev 而不是 libgnutls-dev、nettle-dev、libgmp-dev、libgpg-error-dev 和 libgcrypt-dev:
• libssl-dev (Required for HTTPS, BitTorrent, Checksum support)
您可以使用 libexpat1-dev 而不是 libxml2-dev:
• libexpat1-dev (Required for Metalink support)
在 Fedora 上,您需要以下软件包:gcc, gcc-c++, kernel-devel, libgcrypt-devel, libxml2-devel, openssl-devel, gettext-devel, cppunit
如果您从 git 存储库下载了源代码,则必须安装以下软件包才能获得 autoconf macros。
- libxml2-dev
- libcppunit-dev
- autoconf
- automake
- autotools-dev
- autopoint
- libtool
并运行以下命令以生成配置脚本和生成程序所需的其他文件:
|
|
此外,您还需要 Sphinx 来构建手册页。
如果您正在为 Mac OS X 构建 aria2,请查看 makerelease-osx.mk GNU Make makefile。
构建 aria2 的最快方法是首先运行配置脚本:
|
|
要构建静态链接的 aria2,请使用命令行选项:ARIA2_STATIC=yes
|
|
配置完成后,运行编译程序:make
|
|
请看交叉编译 Windows 二进制文件来进行 Windows 的交叉编译;
请看交叉编译 Android 二进制文件来进行 Android 的交叉编译;
configure
会检查可用库并启用尽可能多的功能,在 default 下未启用的实验功能除外。
从 1.1.0 开始,aria2 默认检查 HTTPS 服务器的证书。如果您使用 OpenSSL 或具有 gnutls_certificate_set_x509_system_trust()
功能的最新版本的 GnuTLS 进行构建,并且库已正确配置以定位系统范围的 CA 证书存储,aria2 将在启动时自动加载这些证书。如果不是这样,我建议提供 CA 包文件的路径,例如在Debian中,CA 捆绑文件的路径是 ‘/etc/ssl/certs/ca-certificates.crt’ (in ca-certificates package),这可能因您的发行版本而异,您可以使用 configure 的 --with-ca-bundle option
:
|
|
如果没有 --with-ca-bundle
选项,则在访问 HTTPS 服务器时会遇到错误,因为没有 CA bundle 无法验证证书。在这种情况下,可以使用 aria2 的 --ca-certificate
指定 CA 捆绑文件。如果没有安装 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 进行自动单元测试。要运行单元测试:
|
|
交叉编译 Windows 二进制文件
在本节中,我们将介绍如何在 Debian Linux 上使用 mingw-w64 (http://mingw-w64.org/doku.php ) 交叉编译器构建 Windows 二进制文件,MinGW(http://www.mingw.org/ )可能无法 aria2。
构建 Windows 二进制文件的最简单方法是使用 Dockerfile,请参考 Dockerfile.mingw 来构建二进制文件,如果您不能使用 Dockerfile 请继续阅读以下内容。
基本上,在编译和安装依赖库之后,您可以进行交叉编译,只需传递适当的 --host
选项并指定要配置的 CPPFLAGS
LDFLAGS
PKG_CONFIG_LIBDIR
变量。为了方便和降低我们自己的开发成本,我们提供了更简单的方法来配置构建设置。
mingw-config
脚本是用于 mingw-w64 的 configure 脚本包装器。我们使用它来创建正式的 Windows 版本。此脚本假设已为交叉编译构建以下库:
- c-ares
- expat
- sqlite3
- zlib
- libssh2
- cppunit
可以调整某些环境变量以更改生成设置:
HOST
通过 HOST 环境变量可以编译为 HOST 指定的系统,它默认为 i686-w64-mingw32
,要生成64位二进制文件,请指定为 x86_64-w64-mingw32
。
PREFIX
PREFIX 是安装依赖库的目录的前缀,默认为 /usr/local/$HOST
,I$PREFIX/include
将添加到 CPPFLAGS
,L$PREFIX/lib
将添加到 LDFLAGS
,$PREFIX/lib/pkgconfig
将添加到 PKG_CONFIG_LIBDIR
。
例如,要构建64位二进制文件,请执行以下操作:
|
|
如果您想使用 libaria2 dll 可以指定 --enable-libaria2
,然后不要使用 ARIA2_STATIC=yes
并准备外部库的 DLL 版本。
交叉编译 Android 二进制文件
在本节中,我们将介绍如何在 Debian Linux 上使用 Android NDK 交叉编译器构建 Android 二进制文件。
在撰写本文时,Android NDK r21e 应该可以无误的编译 aria2。
android-config
脚本是 Android build 的配置脚本包装器,我们用它来创建正式的 Android 版本,此脚本假设已为交叉编译构建以下库:
- c-ares
- openssl
- expat
- zlib
- libssh2
在构建上述库时,请确保禁用共享库并仅启用静态库,我们将静态链接这些库。
android-config
假设定义了 $ANDROID_HOME 和 $NDK 环境变量。
我们目前使用 Android NDK r21e,$NDK 应指向 Anroid NDK 的目录,构建工具位于 $NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/
。
所有依赖库必须安装在 $ANDROID_HOME/usr/local
。
在 android-config
之后,运行 make 编译源代码。
构建文档
Sphinx 用于构建文档。如果 aria2 手册页不是最新的,则会在运行 make
时生成。您还可以通过生成 HTML 来构建 aria2 手册页的 HTML 版本。HTML 版本手册也可在线获取(俄语翻译、葡萄牙语翻译)。
BitTorrent
关于文件名
下载文件的文件名确定如下:
- 单文件模式
如果 “name” 键存在于 .torrent 文件中,则文件名是 “name” 键的值。
否则,文件名就是 BitTorrent 的文件名称加上 “.file” ,例如 BitTorrent 的文件名称是 “test.torrent”,那么下载的文件名就是 “test.torrent.file”,下载文件的目录可以通过 -d 选项指定。
- 多文件模式
.torrent 文件内部已存在目录结构,所以 aira2 直接按照已有的结构创建文件和目录,下载文件的根目录可以通过 -d 选项指定。
在下载开始之前,如果需要,将创建一个完整的目录结构。
默认情况下 aria2 最多从 .torrent 中同时打开 100 个文件,并直接写入和读取这些文件。
要修改 aria2 同时打开文件的数量,请指定 --bt-max-open-files
选项。
DHT
aria2 支持与主线兼容的DHT。
默认情况下,IPv4 DHT的路由表保存到 $XDG_CACHE_HOME/aria2/dht.dat
,dat 和 IPv6 DHT 的路由表保存到 $XDG_CACHE_HOME/aria2/dht6.dat
。除非文件存在于 $HOME/.aria2/dht.dat
or $HOME/.aria2/dht6.dat
。
aria2 使用相同的端口号侦听 IPv4 和 IPv6 DHT。
UDP tracker
启用 IPv4 DHT 时,将启用 UDP 跟踪器支持。UDP 跟踪器的端口号与 DHT 共享。
使用 --dht-listen-port
选项更改端口号。
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 不会重试下载,只会以非零返回代码退出。
支持用户的首选项包括:version, language, location, protocol and os。
如果 Metalink 文件中提供了块校验和,aria2 会在下载过程中自动验证数据块,此行为可以通过命令行选项关闭。
如果签名包含在 Metalink 文件中,aria2 会在下载完成后将其保存为文件,文件名为下载文件名+“.sig”。如果同一文件已存在,则不会保存签名文件。
在 Metalink4 中,多文件 torrent 可能出现在 metalink:metaurl 元素中,由于 aria2 无法同时下载两个相同的 Torrent,aria2 将文件分组在 metalink 中:文件元素具有相同的 BitTorrent metaurl,并从单个 BitTorrent swarm 下载。
这基本上是带有文件选择的多文件 torrent 下载,因此也会创建不在 Metalink 文档中但与所选文件共享同一部分的相邻文件。
如果在 metalink:url 或 metalink:metaurl 元素中指定了相对 URI,则 aria2 使用 metalink 文件的 URI 作为基本 URI 来解析相对 URI。如果在从本地磁盘读取的 Metalink 文件中找到相对 URI,则 aria2 使用 --metalink-base-uri
选项的值作为基本 URI。如果未指定此选项,则将忽略相对 URI。
Metalink/HTTP
Metalink/HTTP 的实现仅限于 rel=duplicate 的链接。
aria2 解析 Digest header 字段,并检查它是否与其他来源的 digest 值匹配。如果不同,就断开连接,aria2 还使用此 Digest 值在下载完成后执行校验和验证。
让 aria2 知道优先使用的 metalink
地址,可以使用 --metalink-location
选项。
netrc
默认情况下,HTTP/FTP/SFTP 支持 netrc,要禁用 netrc 支持,请指定 -n 命令行选项
你的 netrc 文件应具有相应的权限:(600)。
WebSocket
aria2 中嵌入的 WebSocket 服务器实现了 RFC 6455 中定义的规范。支持的协议版本为 13。
libaria2
libaria2 是一个 C++ 库,它为客户端的开发提供 aria2 功能。
目前,libaria2 不是默认构建的,要启用 libaria2,请使用 --enable-libaria2
配置选项。
默认情况下,只生成共享库,要构建静态库,还可以使用 --enable-static
配置选项。
了解如何使用API,请参阅 libaria2 文档。
aria2 开发时的参考
- aria2 Online Manual
- 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 and 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