如果是通过某个指向文件的 URL 到服务器上进行下载文件,这种方式成为直链下载。但是服务器对带宽的需求很大,同时中心化的下载方式可靠性也不高。而 P2P 的下载方式能解决这个问题,BitTorrent 就是常见的 P2P 下载协议。

BitTorrent 协议

torrent 文件的内容

当用户为一个文件(或者文件夹)制作 .torrent 文件,生成的 .torrent 文件里面主要包括了这些信息:

  • 这个文件(文件夹)中数据的 SHA1 值。
    • 比如一个 1G 的文件,如果按 1M 每块进行分块,则会被分为了 1000 块,torrent 中就会有这 1000 个数据块的指纹值(SHA1的hash值),这个占据了 torrent 文件的绝大部分空间。
    • 这些值的目的是为了下载的过程中进行数据校验,确保数据收到的和当时源头制作 torrent 时的源文件 100% 一致,防止恶意数据攻击。
  • 指定一个或者多个 Tracker 的地址,比如 http://www.a.com:8080/announce 这种地址。
    • 相当于记录了一个问询服务器的地址,该服务器用于查询其他用户的 ip。
  • 文件或者文件夹内每个文件的名字。
    • 方便下载文件时,磁盘上直接命名好跟原始数据一样的目录结构、文件名。
  • 其它一些辅助和可扩展的信息。
    • 比如可以配置一个 P2SP 的 http 地址辅助下载,比如制作软件的名字、备注……。
  • 上面信息生成后,torrent 会把第一条里面的这些信息,以及 torrent 里面的文件名等关键信息,再进行一次 Hash ,生成一个新的 SHA1 值,作为 torrent 的 HASH 值。
    • 即经常在 BT 客户端中看到的对这个种子命名的唯一 hash 值
    • 在 magnet 这种磁力链接中可以看到这个值,这就是 torrent 的唯一标记。

以上就是 .torrent 文件的内容。文件可以用记事本打开,但可能看到乱码。这是因为这个文件遵循了 bencode 编码规则,该编码规则将数据块的哈希值利用二进制数据存储。

torrent 文件如何用于下载

  1. BT 客户端读取 .torrent 文件并载入内存。
  2. BT 客户端提取 torrent 文件中的 Tracker 服务器地址,然后与 Tracker 进行通讯并申请下载文件(文件通过 hash 值作为标记)
    1. Tracker 收到请求后,会记录该客户端的公网 IP,同时返回下载过该文件或正在下载该文件的 IP。
    2. 下载过程中,协议要求客户端 5 分钟跟 Tracker 通讯一次,如果太久不通讯,会被标识为下线。
  3. 客户端拿到了一堆 IP 后,会逐个尝试连接,连接上之后开始通信。例如相互告知自己目前有文件的哪些分块,这样就可以相互传输资源,加快下载。
  4. 如果 torrent 中有一个 P2SP 的 Http 地址辅助下载,那么客户端也可以同时从这个 Http 服务器请求数据,并将这个服务器当成一个普通的节点。

先前的工作方式依然会面临因为 Tracker 服务器受到打击而无法使用的问题,而磁力链接 (MagNet Link) 则摆脱了对 Tracker 服务器的依赖——因为每个用户的电脑都可以作为 Tracker 服务器。

使用技术

DHT (Distributed Hash Table)

DHT 是一种分布式存储方法,其作用是找到那些与本机正在下载(上传)相同文件的对端主机(Peer)。DHT 的工作方式可以简化理解为“接力问路”:

  1. 加入网络:当用户启动 BT 客户端并开启 DHT 功能时,用户的电脑会自动成为这个全球分布式网络的一个节点 (Node)。客户端会保存一小部分其他节点的联系方式。
  2. 发布信息:开始一个下载任务时,客户端会向 DHT 网络“广播”:“嗨,我正在下载这个 Info Hash 的文件,我的联系方式是 XXX.XXX.XXX.XXX”。
  3. 查找信息:客户端会根据要下载文件的 Info Hash,计算出一个“距离”。然后它会去问自己认识的节点:“你知道谁在下载这个 Info Hash 的文件吗?”
  4. 接力指路:被问到的节点可能不知道,但它会根据“距离”算法,告诉你:“我不知道,但你应该去问那个节点,它离目标‘更近’”。
  5. 找到目标:客户端就这样一站一站地问下去,最终会找到那些“负责”存储该 Info Hash 联系信息的节点,并从它们那里获取到一份正在下载该文件的用户 IP 列表。

PEX (Peer Exchange)

如果说 DHT 是一个用来寻找“第一批”用户的全球网络,那么 PEX 则是在已经找到一些用户之后,用来快速扩大“朋友圈”的技术。PEX 允许已经连接到同一个文件下载任务(同一个 Swarm 或“集群”)的用户之间,互相交换他们所知道的其他用户的 IP 地址列表。

PEX 的工作流程为:

  1. 建立连接:客户端通过 Tracker 或 DHT 找到了第一个用户,比如 Peer A,并成功与之建立了连接。
  2. 交换信息:在与 Peer A 传输文件数据的同时,客户端会问它:“除了我,你还连接着谁?” Peer A 会把它自己知道的、也在下载这个文件的其他用户列表(比如 Peer B, C, D)发给客户端。
  3. 扩大连接池:客户端收到这份新列表后,就会尝试去连接 Peer B, C, D,从而快速增加可连接的用户数量。同时,客户端也会把自己的已知用户列表分享给 Peer A 和其他连接上的用户。

相比一个 .torrent 文件,MagNet Link 仅仅为一个链接。以一个例子进行分析:

1
magnet:?xt=urn:btih:36684b463ca2aa2f9347b18e9f6b1a9090bdb073&dn=Microsoft+iSCSI+Initiator
  • magnet:协议标识符 (Scheme)。它告诉操作系统或浏览器,这是一个磁力链接,应该使用关联的 BitTorrent 客户端来打开它。
  • xt:代表 “Exact Topic”(确切主题)。这个参数指定了文件的内容哈希值,是磁力链接的唯一身份标识。
  • urn:代表 “Uniform Resource Name”(统一资源名称)。它是一种标准的、持久的资源标识符,与 URL(统一资源定位符)不同,URN 只负责命名,不关心资源在哪里。
  • bith:代表 “BitTorrent Info Hash”。这明确了后面跟着的哈希值是 BitTorrent 类型的信息哈希。这个哈希是对 .torrent 文件中 info 部分(包含了文件列表、文件大小、分块信息等)进行 SHA-1 计算后得到的。
    • 后面跟着的哈希值是该 torrent 资源的全球唯一“指纹”。BT 客户端会利用这个“指纹”通过 DHT 网络去询问:“谁有这个文件?” 从而找到其他正在下载或分享相同文件的用户(Peers),然后开始连接并传输数据。
  • dn:display name 的缩写,表示向用户显示的文件名。这是一个可选项。
    • 例子中的 dn 参数就是告诉客户端:“这个下载任务最好叫做‘Microsoft iSCSI Initiator’。”
  • tr:tracker 的缩写,表示 tracker 服务器的地址。这是一个可选项,本例中并未出现。

PT (Private Tracker)

指的是一个私有的、封闭的 BitTorrent 社区。与任何人都可以访问的公共 BT 站(如过去的海盗湾)不同,PT 网站有严格的准入和管理机制。PT 解决了公共 BT 下载中最大的痛点——“吸血”(Leeching)行为,即很多人下载完就走,不愿意上传分享,导致老资源很快“断种”(没有种子,无法下载)。

PT 的核心运作机制

PT 网站通过几个关键机制来维持社区的健康和高速下载体验:

  1. 严格的邀请/考核制
    通常需要通过以下方式加入 PT 站:
    • 邀请码:由网站内的资深会员发出。邀请人通常会对被邀请人负有连带责任。
    • 开放注册:极少数情况下,网站会在特定时间(如节假日)短暂开放注册,但名额有限。
    • 考核:有些 PT 站会开放申请,你需要证明自己的网络条件(上传速度)、硬盘空间,甚至需要回答一些关于 BT 和 PT 的知识问答。
  2. “分享率 (Ratio)” 是唯一法则
    这是 PT 的灵魂。每个用户都有一个分享率,计算公式为:

    分享率 (Ratio)=总上传量总下载量\text{分享率 (Ratio)} = \frac{\text{总上传量}}{\text{总下载量}}

    • 生存要求:每个 PT 站都会设定一个最低分享率标准(例如 > 0.8 或 > 1.0)。如果你的分享率长时间低于这个标准,账号会收到警告,甚至被封禁。
    • 激励机制:这个规则强制每个成员都必须成为一个“贡献者”,而不仅仅是“索取者”。它确保了网络中的每一个资源都有足够多的人在做种 (Seeding),从而保证了极高的下载速度。
  3. Passkey:你的专属“身份证”
    PT 网站完全禁用 DHT 和 PEX,所有下载都必须通过它自己的私有 Tracker 服务器。为了追踪每个人的上传和下载量,它会为每个用户生成一个独一無二的字符串,叫做 Passkey。
    • 当你从 PT 网站下载 .torrent 文件时,这个 Passkey 会自动嵌入到文件的 Tracker URL 中。
    • 你的 BT 客户端每次向 Tracker 服务器汇报上传/下载数据时,都会带上这个 Passkey。服务器以此来识别是你,并精确地记录你的流量。
    • Passkey 绝对不能泄露,否则别人可能会用你的身份去下载,而流量会算在你的头上,导致你的分享率暴跌。
  4. 保种规则 (Seeding Rules)
    除了总的分享率,很多 PT 站还有针对单个种子的保种规则,例如:
    • H&R (Hit & Run):指下载完一个种子后在短时间内就停止做种的行为,这是被严厉禁止的。
    • 最低做种时间:要求每个下载完成的种子,必须持续做种一定时间(如 72 小时)。
    • 最低分享率:要求单个种子的分享率必须达到 1.0 才能停止做种。

PT 社区的“经济系统”

为了帮助用户管理分享率,PT 社区通常还有一套虚拟经济系统:

  • 魔力值 (Bonus Points):根据你的做种时间和种子数量,系统会持续奖励你一种叫做“魔力值”的积分。魔力值可以用来兑换上传量、邀请码,甚至在分享率不达标时“续命”。
  • Freeleech (免费下载):网站会定期或不定期地将某些种子设置为 “Freeleech”。下载这些种子时,下载流量不计入你的账户,但上传流量照算。这是提升分享率的最佳时机,也是 PT 鼓励用户下载大体积文件(如蓝光原盘)的重要手段。通常分为 100% Free, 50% Free (只计算一半下载量), 2x Upload (上传量翻倍计算) 等。