BitTorrent 协议深入解析
为了把「大家分享就会更快」变成现实,BitTorrent 在分片选择、带宽分配和校验各环节都注入了缜密的策略。让我们看看协议内部,以及它在正当用途上的广泛应用。
.torrent 文件与磁力链接:用 info hash 识别蜂群
分发的基本单位是记录了分片大小与各分片哈希的元数据(.torrent 文件)。该元数据的哈希(info 哈希)即蜂群的标识,通过追踪器、DHT、PEX(节点交换)找到持有相同 info 哈希的节点。使用磁力链接时,连元数据本身也从节点处获取(BEP 9)。
.torrent 文件采用一种名为 Bencode(B 编码)的简单二进制格式书写,核心的 info 字典中包含文件名、分片长度(通常在 256KB 至 16MB 之间,依文件总大小而定),以及把所有分片的 SHA-1 哈希顺序拼接而成的 pieces 字段。info 哈希就是对整个 info 字典做 SHA-1 得到的 20 字节值;把它写成 magnet:?xt=urn:btih:<info哈希> 嵌入 URL,就能在不分发、不保存 .torrent 文件的情况下加入蜂群。
分片选择:「最稀缺优先」的智慧
- 随机首片:新来者先快速拿到任意一片,作为交换的本钱。此时统计意义上的稀缺度信息还很少,因此这一阶段刻意采用随机选择。
- 最稀缺优先:此后优先获取蜂群中持有者最少的分片。这防止了分片灭绝(唯一持有某分片的种子离开后文件永远无法凑齐),并使分片分布均匀化、交换机会最大化。
- 终局模式:接近完成时,向多个节点并行请求最后几片,避免「最后一片被慢节点攥住」的停滞。已经取得的重复分片会用
Cancel消息及时取消,减少带宽浪费。
面向大量下载者开始分发的首个种子(原始上传者)有时会采用一种称为超级做种(super-seeding)的技巧,刻意按计划顺序而非随机分发分片。在只有一个种子的启动阶段,先把每个分片各放出一份,促使节点之间相互交换,从而在节省种子自身上传带宽的同时加快整个蜂群的完成速度。
阻塞(Choking):带宽这枚货币的花法
每个节点同时只向少数对象(典型 4 个)上传,其余一律阻塞(choke)。解除阻塞的标准是「最近向我上传最快的对象」,这正是针锋相对(tit-for-tat)的实现。通常每隔约 10 秒重新评估一次上传速度,在保留表现最好者的同时更换排名。另有每 30 秒向随机对象开放一个名额的乐观解阻塞,让新来者也能获得第一次机会。这两条规则的组合,在没有中央仲裁者的情况下造就了「越贡献越受益」的市场。
- 反怠慢(Anti-snubbing):若一个节点在较长时间内(约 60 秒)未被任何人解除阻塞,它会判定自己「被冷落」,转而缩减正在上传的对象数量、优先寻找新的交换对象,以此自我检测并摆脱停滞。
- 种子的情形:没有下载需求的种子会切换标准,不再优先「上传速度最快的对象」,而是优先「最近没有被自己解除阻塞过的对象」,以维持公平性。
追踪器与 DHT/PEX:三重化的节点发现
BitTorrent 的节点发现并不依赖单一机制,而是把中心化的追踪器(通过 HTTP/UDP 分发蜂群参与者列表的服务器)、无服务器的 DHT(BEP 5,Mainline DHT),以及让已连接节点之间互相交换已知节点的 PEX(Peer Exchange,BEP 11)三者结合起来,即便追踪器宕机,仅凭 DHT/PEX 蜂群也能继续正常工作,从而具备较强的容错能力。
| 方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 追踪器 | 向中心服务器以 HTTP/UDP 方式 announce 并获取参与者列表 | 实现简单,便于统计与规则管理 | 可能成为单点故障,且有运营成本 |
| DHT(BEP 5) | 在 Kademlia 系 DHT 中以 info 哈希为键查找节点信息 | 无需追踪器,抗审查能力强 | 查询可被观测,首次发现节点有时较慢 |
| PEX(BEP 11) | 已建立连接的节点之间定期交换节点列表 | 同时补强追踪器与 DHT,加快发现速度 | 在完全没有已有连接时无法发挥作用 |
uTP 与拥塞控制
改进拥塞控制的 uTP(LEDBAT,Low Extra Delay Background Transport)让后台传输不挤占前台通信。传统 TCP 把丢包当作拥塞的信号,而 uTP 的特点是把单向延迟(one-way delay)的上升当作更早期的拥塞信号:在同一条线路上的其他 TCP 通信(如网页浏览)受到影响之前,就主动收紧自己的发送速率。这正是「BitTorrent 不会拖慢全家网络」得以实现的原因。uTP 构建在 UDP 之上,顺序保证与重传均由其自身负责。
BitTorrent v2(BEP 52)的变化
于 2020 年标准化的 BitTorrent v2,在哈希方式与文件结构上引入了几项重要变化。
- 哈希函数更新:以 SHA-256 取代 v1 中已被证明存在碰撞攻击的 SHA-1,提升了密码学层面的安全性。
- 按文件划分的 Merkle 树:v1 只是把所有分片的哈希简单拼接成一个列表,而 v2 为每个文件单独构建一棵 Merkle 树(分片层,piece layer)。这使得同一文件出现在多个 torrent 中时,重复检测与去重变得更加容易。
- 局部校验效率提升:借助 Merkle 树的性质,客户端可以高效地只校验文件的一部分,降低了发现损坏后重新获取数据的成本。
- 混合 torrent:通过制作同时包含 v1 与 v2 两个 info 哈希的「混合 torrent」,新旧客户端都能加入同一个蜂群,保证了兼容性。
正当用途:远不止「非法文件共享」
BitTorrent 常被与侵权内容的传播联系在一起,但协议本身是不挑用途的通用分布式分发技术,被广泛用于正当的大规模数据分发。
| 领域 | 代表性案例 | 采用理由 |
|---|---|---|
| Linux 发行版分发 | Ubuntu、Debian 等系统的安装 ISO 镜像 | 让用户之间的相互上传分担官方镜像服务器的带宽成本 |
| 游戏/软件分发 | 大型补丁与更新文件的分发 | 即使发布初期访问高度集中,下载者自身也会成为分发力量,从而不易发生拥塞 |
| 学术与档案 | Internet Archive 等机构公开的大容量数据集 | 维持一条不依赖单一运营方的永久再分发渠道 |
| 内部基础设施 | 大规模数据中心内部的软件分发 | 避免大量请求同时集中于中心服务器,实现可水平扩展的分发 |
这些案例的共同点是 BitTorrent 的自我扩展性:需求越集中,分发能力反而越强。协议本身的技术优劣,与使用目的是否合法本是两回事:攻击与防御中介绍的滥用对策,与这些正当用途完全可以并行不悖。P2P 文件分发的研究脉络另见参考文献。