关于 BitTorrent Tracker 的一切
近期,我开发的开源项目 Yet another BitTorrent Tracker 迎来了 Minimum Viable Product 🎉。
经过对 BitTorrent Enhancement Proposals 将近一个月的研究,我只能说:
同时,我还发现;中文互联网中能把 BitTorrent Tracker 讲清楚的文章简直凤毛麟角。但这玩意又确实很重要,很多人抱怨自己使用 BitTorrent 下东西没有速度很大程度上就是 BitTorrent Tracker 的问题。所以很有必要写一篇文章来把 BitTorrent Tracker 的前世今生讲清楚。
专有名词解释🔗
首先,为了行文方便,我们需要定义几个专有名词:
- BT: 及 BitTorrent,一种去中心化文件分享协议
- Peer: 使用 BitTorrent 进行交换数据的客户端
BitTorrent Tracker 是什么?🔗
简单来讲,BitTorrent Tracker 是一个响应 HTTP GET 请求的 HTTP/HTTPS 服务器。
BitTorrent Tracker 是如何工作的?🔗
当一个 Peer 需要通过 BT 下载「文件 A」时,它会将「文件 A」的特征码 (SHA-1)、Peer 的 ID 等元信息通过 GET 方法发送给 Tracker。
curl 'http://example.com/announce?info_hash=%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A&peer_id=00000000000000000001...'
info_hash
是一段 20-byte 长的二进制 SHA-1,为了传输安全,它需要被编码为 RFC1738。例如,对于这个 SHA-1:
\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a
它将会被编码为:
%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A
Tracker 会将其记录下来,并返回它记录的与「文件 A」相关的 Peer 组成的列表 (大约 50 个)。
{
"interval": 3600,
"peers": [
{ "ip": "1.2.3.3", "peer id": "00000000000000000003", "port": 8000 },
{ "ip": "1.2.3.1", "peer id": "00000000000000000001", "port": 8000 },
{ "ip": "1.2.3.4", "peer id": "00000000000000000004", "port": 8000 },
{ "ip": "1.2.3.2", "peer id": "00000000000000000002", "port": 8000 },
{ "ip": "1.2.3.5", "peer id": "00000000000000000005", "port": 8000 }
// ...
]
}
然后你就可以和别的 Peer 进行数据交换了。
你可以通过 Tracker 找到别的 Peer,而别的 Peer 也可以通过它找到你,这就是 Tracker 的作用。
限制与补救措施🔗
虽然 BT 下载本身是去中心化的,但 BitTorrent Tracker 服务器不是;所以它很容易被监管机构盯上。很多人抱怨自己使用 BT 下载热门资源却没有速度,很多情况下就是因为 Tracker 被 BAN 了。
解决办法就是定期更新 Tracker 服务器的列表;主流的 BT 客户端都允许我们手动添加/更新额外的 Tracker 服务器。大多数情况下都是在设置里,复制粘贴你想要添加的 Tracker 服务器的地址就可以了,也有少数需要针对每一个下载任务单独添加。至于到哪儿找 Tracker 服务器地址?GitHub 上专门有个项目收集当前活跃的 Tracker: ngosang/trackerslist,每日更新。
同时,目前主流的 BT 客户端都实现了 Peer Exchange (PEX) 协议,它允许 Peer 之间分享他们记录的别的 Peer 的信息。然后通过这种 P2P2P2P… 的方式完全去中心化的组成 Peer 网络。有了 PEX 作为补充,Tracker 作用就显得不那么重要了;一般 Tracker 只在第一次下载时使用,俗称“点火”。然后等你找到至少一个别的 Peer 后,就可以通过 PEX 协议找到更多的 Peer;Peer 越多,下载就越快。