跳转到内容

BitTorrent — 用"以牙还牙"逼大家都上传

是什么

BitTorrent(BT)是一套让下载同一个文件的人互相把碎片传给对方的协议。日常类比:一群人凑钱团购一套书,每个人先拿到几本不同的,然后互相借——你借给我第 3 本,我借给你第 7 本,比每个人都跑去出版社快得多。

这篇 2003 年的论文不是在讲怎么传文件——传文件 1999 年的 Napster 早就会了。它在回答一个更难的问题

既然我已经下完了我要的,凭什么还继续上传给你?

早期 P2P(Napster / Gnutella / KaZaA)都死在这一题上——大家都下载、没人上传,俗称搭便车(free-riding)。BitTorrent 用一招叫 tit-for-tat(以牙还牙) 的策略,让”自私”反而变成协议正常运转的燃料。

为什么重要

不理解这篇论文,下面几件事都没法解释:

  • 为什么 2003 年之后 P2P 文件分发突然规模化(Linux ISO / 游戏更新 / 学术数据集)
  • 为什么”协议设计 = 博弈论”成了一个独立学科分支(mechanism design 在网络里的应用)
  • 为什么后来的 Bitcoin / IPFS / 区块链激励层都直接引用这篇论文
  • 为什么”激励设计比加密更难”——Cohen 自己说过:加密可以靠数学保证,激励要靠人性

核心要点

BitTorrent 的抗自私设计可以拆成 三招

  1. 把文件切成小块(piece):一个 700MB 的 ISO 切成约 2800 个 256KB 的块。关键点:你下到第几块就立刻能上传那几块给别人,不用等整个文件下完。

  2. tit-for-tat:你给我多少,我给你多少:每个客户端只给最近给过自己最多带宽的几个 peer继续上传,叫做 unchoke(解除阻塞);其他人 choke(阻塞)。每 10 秒重新评估一次。这就像现实里”你请我吃饭,我请你回去”——纯粹的礼尚往来。

  3. rarest first:最稀有的块先抢:不下载顺序块,而是先抢全网拷贝最少的块。这样一来,你手里很快就有了”别人需要但少有”的稀缺资源,就有了议价权——别人愿意拿块跟你换。

三招加起来形成一个自发的市场:每个人都为自己利益最大化(多下载),但行为副产物是整个网络更健康(人人都在上传)。

三招的内在逻辑

为什么是这三招,而不是别的?可以从 激励兼容 这个词来看:

  • 切块:解决”还没下完就没法回报”的死循环——任何人任何时刻都既是下载者又是上传者
  • tit-for-tat:解决”我为什么要给”——把”贡献多少”和”得到多少”绑死
  • rarest first:解决”我有什么可换”——逼着每个人手里总有别人需要的稀缺资源

三招互相支撑,少一个都崩。比如只切块没 tit-for-tat,还是搭便车;只 tit-for-tat 没切块,等下完了协议就失去抓手;只 rarest first 没前两个,根本起不来。

实践案例

案例 1:choke / unchoke 算法每 10 秒做什么

假设你正同时连着 30 个 peer。算法每 10 秒:

  1. 测量过去 10 秒每个 peer 给你下载的速度
  2. 排序,挑前 4 名 → unchoke(继续给他们上传)
  3. 其余 26 个 → choke(暂停给他们上传)
  4. 额外随机选 1 个 choked peer 给上传——叫 optimistic unchoke

第 4 步是精髓:万一这个随机被选中的人其实带宽很好,下次他就会回报你。这是探索 vs 利用的经典权衡——不全押在已知好邻居上,留 1/5 给未知。

案例 2:为什么 Napster 死在搭便车上

Napster 的下载是 client-server 心态——服务器在哪、谁有文件,索引中心知道;下载方连过去单方面拉。下完了?关掉就是了。研究测量过 KaZaA:70% 用户从不上传,剩下 30% 扛起整个网络。规模一大就崩。

BitTorrent 的设计前提是没人会自愿上传,所以协议强制:你想下得快?必须给别人上传。把”道德要求”换成”协议机制”——这是关键转折。

案例 3:optimistic unchoke 给新手一条活路

设想你是刚加入 swarm 的新人——手里一个块都没有,没法跟别人交换。如果只有 tit-for-tat,你永远进不了别人的”前 4 名”,永远拿不到上传,永远启动不起来。

optimistic unchoke 就是为这种情况设计的:每 30 秒随机给一个 choked peer 上传一会儿。新人有概率被选中、拿到第一批块、然后才有资本跟别人交换。这是一个冷启动 + 探索 的经典做法——少量带宽换网络的可达性。

案例 4:rarest first 救活一个濒死 swarm

假设 100 个 peer 在下一个 1000 块的文件,初始种子(seed)只有 1 个。如果大家都”顺序下”,第 1 块会被疯抢但第 999 块永远只有 seed 有——seed 一断,文件就永久丢失最后那段。

rarest first 强迫大家优先抢稀缺块,于是稀缺块迅速被复制到多个 peer 手里。即使 seed 中途下线,整个 swarm 仍能自给自足完成下载。这是 BitTorrent 抗故障的核心机制。

踩过的坑

  1. tit-for-tat 不是真”以牙还牙”:原始博弈论里的 tit-for-tat 是 1v1,BitTorrent 是多对多。Cohen 实际用的是”奖励前 N 名”的近似版,不严格满足博弈论意义上的纳什均衡。后来有论文证明它可被利用(BitTyrant 2007 客户端能多骗 70% 带宽)。

  2. 种子完成后没有激励继续上传:tit-for-tat 只在双向下载时有效。一旦你下完了(成为 seeder),协议给不出激励让你继续传——这一段靠”利他主义”或”做种比例规则”(私有 tracker 才有)兜着。

  3. NAT 与防火墙穿透没在论文里讨论:现实里 80% peer 在 NAT 后面,连不通。后来靠 µTP / DHT / NAT 打洞协议补丁式解决。

  4. piece size 选择是个权衡:太小协议开销大、太大上传粒度粗。论文用 256KB 是经验值,不是从理论推出来的。

  5. endgame mode 没在主论文里讲:下载快结束时,剩余几块会卡很久(因为只有少数 peer 有)。实际客户端会切到 endgame——同时向所有 peer 请求最后几块,先到先得,多余的取消。这是”协议规范是骨架、实战还要补很多肉”的典型例子。

关键术语速查

读论文时会反复出现这几个词,先建立直觉:

  • swarm(蜂群):同时下同一个文件的所有 peer 的集合,是 BT 里最小的”经济单元”
  • seeder:手里有完整文件的人,只上传不下载——swarm 的”供给方”
  • leecher:还没下完的人,又下又传——swarm 的”中间商”
  • tracker:协调服务器,告诉新加入者”swarm 里都有谁”,传文件本身
  • choke / unchoke:暂停 / 恢复给某个 peer 上传,是 tit-for-tat 的执行动作
  • piece:协议层的最小交易单位(256KB),不是网络层的包

理解这 6 个词,论文 80% 就能跟下来了。

适用 vs 不适用场景

适用

  • 大文件(> 100MB)一对多分发——Linux 发行版 / 游戏补丁 / 数据集
  • 短时间高峰流量——内容热度集中在前几小时
  • 公网环境,参与者数量多(几十到几万)
  • 不在意延迟、在意吞吐的批量传输

不适用

  • 小文件(< 10MB)——协议开销 > 节省的带宽
  • 单用户私密下载——swarm 太小起不来
  • 实时流(直播 / 视频通话)——延迟不可控
  • 敏感数据——所有 peer 都能看到你在下什么(隐私差)

历史小故事(可跳过)

  • 1999 年:Napster 上线,证明 P2P 能做大规模文件分发,但服务器集中导致法律和扩展性双崩。
  • 2000 年:Gnutella 完全去中心,但每次搜索要广播全网,搜索开销爆炸
  • 2001 年:KaZaA 用超级节点缓解搜索,但搭便车率 70%,网络长期瘸腿。
  • 2001 年 4 月:Bram Cohen 在 CodeCon 公布 BitTorrent,几个月后第一个客户端上线。
  • 2003 年 5 月:Cohen 把核心思想写成 5 页论文投到 P2PEcon Workshop——这就是本文。
  • 2004–2006 年:BitTorrent 一度占全球互联网流量的 35%,逼得 ISP 开始流量整形。
  • 2009 年之后:HTTP CDN(Akamai 类)+ HTTPS 普及,BT 流量份额下降,但其激励 + 协议思想被区块链全面继承。

学到什么

  1. 协议可以替代道德——不要假设用户”应该”做什么,要假设他们只做对自己最有利的事,再设计让”对自己最有利 == 对网络最有利”
  2. 简单局部规则 → 复杂全局行为:每个 peer 只看 30 个邻居、每 10 秒做一次选择,整体却涌现出健康市场
  3. mechanism design = 协议设计的内核:博弈论不只在拍卖、广告里有用,分布式系统也是它的主场
  4. 理论的近似就够用:Cohen 没做严格博弈论证明,但工程上跑得起来——可被利用 ≠ 在实践中被打败
  5. 零基础也能读懂:这篇论文只有 5 页、几乎不带数学公式,全是机制和直觉——证明顶级系统论文不一定非得堆推导

延伸阅读

关联

  • akamai-2002 —— Akamai 用边缘节点 + 中心调度做内容分发;BT 用对等市场做内容分发,对照看
  • 经济学 / 博弈论里的 tit-for-tat(Axelrod 1984)—— BT 把它从囚徒困境搬进了网络协议
  • mechanism design —— 博弈论的”反向”:先定目标,再设计规则让自利行为达成目标

反向链接

  • akamai-2002 —— Akamai 2002 — 把网站搬到离用户 10 毫秒的地方
  • tor-2004 —— Tor 洋葱路由 — 让你的网络请求穿上三层马甲