2个不稳定版本
0.2.0 | 2022年3月26日 |
---|---|
0.1.0 | 2020年9月13日 |
#1443 in 网络编程
340KB
7K SLoC
aquatic:高性能BitTorrent追踪器
用Rust编写的闪电般的快速、多线程的BitTorrent追踪器,包括不同协议的子实现
名称 | 协议 | OS要求 |
---|---|---|
aquatic_udp | 通过UDP的BitTorrent | 类Unix(使用 mio) |
aquatic_http | 通过HTTP的BitTorrent 带TLS (rustls) | Linux 5.8+(使用 glommio) |
aquatic_ws | WebTorrent 通过TLS (rustls) | Linux 5.8+(使用 glommio) |
用法
先决条件
-
使用 rustup 安装Rust(推荐使用稳定版)
-
使用您的包管理器安装cmake(例如,
apt-get install cmake
) -
克隆此git仓库并进入它
编译
编译您感兴趣的实现
# Tell Rust to enable support for all CPU extensions present on current CPU
# except for those relating to AVX-512. This is necessary for aquatic_ws and
# recommended for the other implementations.
. ./scripts/env-native-cpu-without-avx-512
cargo build --release -p aquatic_udp
cargo build --release -p aquatic_http
cargo build --release -p aquatic_ws
运行
除非您只打算运行 aquatic_udp
,否则请确保锁定内存限制足够。您可以通过将以下行添加到 /etc/security/limits.conf
来执行此操作,然后注销并重新登录
* hard memlock 512
* soft memlock 512
生成配置文件。它们包含注释,且不同协议之间有所不同。
./target/release/aquatic_udp -p > "aquatic-udp-config.toml"
./target/release/aquatic_http -p > "aquatic-http-config.toml"
./target/release/aquatic_ws -p > "aquatic-ws-config.toml"
调整文件。您可能希望调整 network 部分下的
address(监听地址)
请注意,aquatic_http
和 aquatic_ws
都需要配置TLS证书和私钥文件。详细信息请参阅相应的配置文件。
完成配置后,运行追踪器
./target/release/aquatic_udp -c "aquatic-udp-config.toml"
./target/release/aquatic_http -c "aquatic-http-config.toml"
./target/release/aquatic_ws -c "aquatic-ws-config.toml"
配置值
建议启动比 request_workers
更多的 socket_workers
。所有实现都非常依赖IO,大部分时间都在从和向套接字读写。这由套接字工作者处理,它们还进行解析、序列化和访问控制。它们将公告和抓取请求传递给请求工作者,请求工作者更新内部追踪器状态并返回要发送的响应。
访问控制
支持所有协议通过信息散列进行访问控制。相关的配置部分是
[access_list]
# Access list mode. Available modes are allow, deny and off.
mode = "off"
# Path to access list file consisting of newline-separated hex-encoded info hashes.
path = ""
文件在程序启动时和程序接收到 SIGUSR1
时读取。如果初始解析失败,程序将退出。后续的失败将导致错误级别的日志消息,而访问列表更新的成功将导致信息级别的日志消息。
架构概述
实现细节
aquatic_udp: UDP BitTorrent 跟踪器
实现
分别跟踪 IPv4 和 IPv6 对等方。
这是最成熟的实现之一。我认为它已准备好投入生产使用。
性能
更多详情请参阅此处。
未成功的优化尝试
- 使用 glommio
- 使用 io-uring
- 使用 zerocopy + 向量化发送响应
- 使用 sendmmsg
aquatic_http: HTTP BitTorrent 跟踪器
实现
- BEP 003:HTTP BitTorrent 协议(《更多详情》). 异常
- 仅在 TLS 上运行
- 不跟踪种子下载的数量(始终发送 0)
- 仅支持紧凑响应
- BEP 023:紧凑 HTTP 响应
- BEP 007:IPv6 支持
- BEP 048:HTTP scrape 支持。注意
- 不允许完整的 scrape,即所有注册的 info 哈希
分别跟踪 IPv4 和 IPv6 对等方。
aquatic_http
的测试没有 aquatic_udp
那么多,但可能运行良好。
aquatic_ws: WebTorrent 跟踪器
旨在与 WebTorrent 客户端兼容。注意
- 仅在 TLS 上运行
- 不跟踪种子下载的数量(始终发送 0)。
- 不允许完整的 scrape,即所有注册的 info 哈希
分别跟踪 IPv4 和 IPv6 对等方。
aquatic_ws
的测试没有 aquatic_udp
那么多,但可能运行良好。
负载测试
所有协议都有负载测试二进制文件。它们使用与跟踪器相似的 CLI 结构,并支持生成和加载配置文件。
要运行,首先启动要测试的跟踪器。然后运行相应的负载测试二进制文件
./scripts/run-load-test-udp.sh
./scripts/run-load-test-http.sh
./scripts/run-load-test-ws.sh
为了公平比较 HTTP 性能与 opentracker,请在 aquatic_http
设置中将 keepalive 设置为 false。
版权和许可
版权(c)2020-2022 Joakim Frostegård
在 Apache 2.0 许可下分发(详情请参阅 LICENSE
文件。)
趣闻
跟踪器被称为 aquatic,因为它在比特洪流中茁壮成长 ;-)
依赖关系
~57MB
~1M SLoC