aria2 是一个开源的、轻量级的命令行下载工具,支持多种协议,包括 HTTP/HTTPS、FTP、SFTP、BitTorrent 和 Metalink。以下是关于 aria2 的一些主要特点:
[ol]
多协议支持:aria2 能够从多种协议下载文件,这意味着你可以使用一个工具来处理不同的下载任务。
多源下载:aria2 支持从多个源和位置下载同一个文件的不同部分,这可以显著提高下载速度。
断点续传:即使在下载过程中出现中断,aria2 也可以从上次中断的地方继续下载,无需从头开始。
选择性下载:在使用 BitTorrent 协议下载时,aria2 允许用户选择性地下载文件中的特定部分。
命令行界面:aria2 是一个命令行工具,适合高级用户和自动化脚本。
轻量级:aria2 的设计注重效率,因此它占用系统资源较少。
多线程和分段下载:aria2 可以通过多线程和将文件分割成多个部分同时下载来提高下载速度。
JSON-RPC 和 XML-RPC 接口:aria2 提供了远程控制接口,允许第三方应用程序(如网页界面或移动应用)控制下载。
跨平台:aria2 可以在多种操作系统上运行,包括 Windows、macOS 和 Linux。
支持 IPv4 和 IPv6:aria2 同时支持 IPv4 和 IPv6,适应未来的网络标准。
[/ol]
由于 aria2 的灵活性和强大的功能,它被许多用户和开发者作为首选的下载工具,特别是在需要自动化下载任务或提高下载效率的场景中。
二、原版aria2的限制
如下图所示,原版的aria2无法设置超过16的单服务器最大连接数。对于一些下载非常慢的链接,而电脑性能又比较充足的情况下,体验较差。
下面是某一个链接用16线程下载的速度和1000线程下载的速度,分别是234 KB/s和7.7MB/s,差距还是比较明显的。
三、修改原版aria2的源代码
原版aria2的github地址:https://github.com/aria2/aria2
需要修改的文件
aria2/src/OptionHandlerFactory.cc
原版:
OptionHandler* op(new NumberOptionHandler(PREF_MAX_CONNECTION_PER_SERVER,
TEXT_MAX_CONNECTION_PER_SERVER,
"1", 1, 16, 'x'));
op->addTag(TAG_BASIC);
op->addTag(TAG_FTP);
op->addTag(TAG_HTTP);
op->setInitialOption(true);
op->setChangeGlobalOption(true);
op->setChangeOptionForReserved(true);
handlers.push_back(op);
}
修改后
OptionHandler* op(new NumberOptionHandler(PREF_MAX_CONNECTION_PER_SERVER,
TEXT_MAX_CONNECTION_PER_SERVER,
"32", 1, -1, 'x'));
op->addTag(TAG_BASIC);
op->addTag(TAG_FTP);
op->addTag(TAG_HTTP);
op->setInitialOption(true);
op->setChangeGlobalOption(true);
op->setChangeOptionForReserved(true);
handlers.push_back(op);
}
说明:此处是修改单服务器最大连接数,原版默认最大连接数1,可以设置的范围是1到16,这里改成了默认32,16改成了-1表示不限制最大值。
原版:
OptionHandler* op(new UnitNumberOptionHandler(
PREF_MIN_SPLIT_SIZE, TEXT_MIN_SPLIT_SIZE, "20M", 1_m, 1_g, 'k'));
op->addTag(TAG_BASIC);
op->addTag(TAG_FTP);
op->addTag(TAG_HTTP);
op->setInitialOption(true);
op->setChangeGlobalOption(true);
op->setChangeOptionForReserved(true);
handlers.push_back(op);
}
修改后:
OptionHandler* op(new UnitNumberOptionHandler(
PREF_MIN_SPLIT_SIZE, TEXT_MIN_SPLIT_SIZE, "1M", 1_k, 1_g, 'k'));
op->addTag(TAG_BASIC);
op->addTag(TAG_FTP);
op->addTag(TAG_HTTP);
op->setInitialOption(true);
op->setChangeGlobalOption(true);
op->setChangeOptionForReserved(true);
handlers.push_back(op);
}
说明:此处修改的是最小文件分片大小,默认值由原版的20M修改为1M,最小值由1M修改为1K
原版:
OptionHandler* op(
new NumberOptionHandler(PREF_SPLIT, TEXT_SPLIT, "5", 1, -1, 's'));
op->addTag(TAG_BASIC);
op->addTag(TAG_FTP);
op->addTag(TAG_HTTP);
op->setInitialOption(true);
op->setChangeGlobalOption(true);
op->setChangeOptionForReserved(true);
handlers.push_back(op);
}
修改后:
OptionHandler* op(
new NumberOptionHandler(PREF_SPLIT, TEXT_SPLIT, "32", 1, -1, 's'));
op->addTag(TAG_BASIC);
op->addTag(TAG_FTP);
op->addTag(TAG_HTTP);
op->setInitialOption(true);
op->setChangeGlobalOption(true);
op->setChangeOptionForReserved(true);
handlers.push_back(op);
}
说明:此处修改的是默认的分割文件多线程下载的线程数量,它受到上面两个参数的影响,即线程数不能超过单服务器最大连接数,分割后最小的文件块不能小于最小文件分片大小。
四、编译
Linux系统下较为简单,无需赘述,因此只介绍windows下编译的方法
根据官方的说明文档,文本采用最简单的docker容器交叉编译方法,编译完之后直接删除docker容器和镜像即可,不需要安装额外的编译环境。
1. 安装docker
以下两种方式任选一种合适的即可,有wsl的建议用方式二
方式一:下载并安装docker desktop:https://www.docker.com/products/docker-desktop/
下载windows AMD64版本的
切换国内镜像源
将docker engine处的json文本修改为:
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"https://docker.linkedbus.com",
"https://docker.xuanyuan.me"
]
}
也可以换成你喜欢的镜像源
方式二
进入wsl子系统(以ubuntu系统为例,其他的类似)
安装docker
# 安装必要的依赖
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
# 添加docker的软件源
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
# 安装docker
sudo apt install docker-ce docker-ce-cli containerd.io
# 将当前用户添加到docker用户组
sudo usermod -aG docker $USER
# 切换国内源,复制到下面那个EOF的位置粘贴到终端里面
sudo tee /etc/docker/daemon.json
2. 安装aria2编译环境docker镜像
到这一步,windows或者wsl子系统,操作都是一样的
下载aria2的dockerfile:https://raw.githubusercontent.com/aria2/aria2/refs/heads/master/Dockerfile.mingw
安装docker镜像(windows打开命令终端,wsl则进入子系统)
# 注意将Dockerfile.mingw替换为实际的文件路径
docker build -t aria2-mingw -f ./Dockerfile.mingw ./
3. 编译aria2
运行docker容器
mkdir aria2_custom
# 进入docker容器,并将主机的./aria2_custom目录映射到docker容器内的/aria2_custom目录,然后运行docker容器的bash终端
docker run -it --name aria2-build -v ./aria2_custom:/aria2_custom aria2-mingw /bin/bash
复制aria2到共享目录,然后修改源代码
容器内运行:
cp -r /aria2/* /aria2_custom/
参考第三节,使用你喜欢的方式修改 ./aria2_custom/src/OptionHandlerFactory.cc
因为容器内的/aria2_custom目录和主机的./aria2_custom是共享的,因此直接在容器外部修改代码文件即可,可以使用vim命令或者记事本等工具
编译aria2
容器内运行:
cd /aria2_custom
autoreconf -i
./mingw-config
# 4线程编译
make -j4
i686-w64-mingw32-strip src/aria2c.exe
拷贝编译好的aria2c.exe
在容器外部将./aria2_custom/src/aria2c.exe,拷贝出来,放到你需要的位置即可
可以直接覆盖替换原有的aria2c.exe,结合aria2 gui软件使用
成品蓝奏云下载地址:https://wwwb.lanzn.com/i0Nzl2ggrije 密码:c1f4