关于 BitTorrent Tracker 的一切

4 min read

近期,我开发的开源项目 Yet another BitTorrent Tracker 迎来了 Minimum Viable Product 🎉。

经过对 BitTorrent Enhancement Proposals 将近一个月的研究,我只能说:

Nobody knows BitTorrent better than me

同时,我还发现;中文互联网中能把 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 越多,下载就越快。