目录
[2.5 P2P 文件分发:人人都是服务器](#2.5 P2P 文件分发:人人都是服务器)
[P2P vs C/S:时间效率的较量](#P2P vs C/S:时间效率的较量)
[BitTorrent:最流行的 P2P 文件分发协议](#BitTorrent:最流行的 P2P 文件分发协议)
大家好~ 继续啃机械工业出版社出版的计算机科学丛书《计算机网络-自顶向下方法》(原书第7版)。2.4 节学了 DNS------因特网的目录服务,现在进入第2章第五个应用------P2P 文件分发。
在 2.1 节我们讲过 P2P(Peer-to-Peer)体系结构------对等方之间直接互通信,没有总是开着的中央服务器。本节深入 P2P 在文件分发场景中的具体应用。
你有没有用过 BitTorrent(BT 下载)?它是最典型的 P2P 文件分发应用。和传统的"从服务器下载"不同,BT 下载时你同时从多个"同样在下载"的用户那里获取文件的不同部分------下载的人越多反而越快!这就是 P2P 的自扩展性。
本节将回答这些问题:P2P 比 C/S 快多少?BitTorrent 是怎么工作的?peer 之间怎么交换数据?怎么防止"白嫖"(只下载不上传)?什么是 DHT?
全程生活化比喻 + 卡通配图,帮大家把 P2P 文件分发看得明明白白~
2.5 P2P 文件分发:人人都是服务器

P2P 文件分发(P2P file distribution):一种文件传输方式,文件不是从单一服务器下载,而是从多个对等方(peer)同时获取不同的文件块。每个 peer 既是下载者(客户端)也是上传者(服务器)。
在传统的 C/S 模型中,一个文件从服务器发给 N 个客户端,服务器要发送 N 份文件副本------N 越大,服务器负担越重,总时间越长。
但在 P2P 模型 中,每个已经下载到文件块的 peer 也可以把块上传给其他 peer------下载的人越多,能上传的人也越多,系统的总上传能力随 peer 数量增长而增长。这就是 P2P 的自扩展性(self-scalability)。
P2P vs C/S:时间效率的较量

教材给出了文件分发时间的分析:
假设:文件大小 F,服务器上传速率 us,peer 的下载速率 di 和上传速率 ui,N 个 peer。
C/S 模型的分发时间 :服务器要给每个 peer 发一份完整文件,总数据量 NF。时间至少为 max(NF/us, F/dmin)------NF/us 是服务器上传瓶颈,F/dmin 是最慢 peer 的下载瓶颈。时间随 N 线性增长。
P2P 模型的分发时间 :服务器只需发出一份文件(通过 peer 转发扩散),总上传能力随 N 增长。时间约为 max(F/us, F/dmin, NF/(us + Σui))------前两项是瓶颈,第三项是所有 peer 的总上传能力。时间随 N 增长远慢于线性。
通俗对比:
- C/S 就像"一个老师教 N 个学生"------老师要讲 N 遍,学生越多越慢。
- P2P 就像"学生会了就教别人"------老师只讲一遍,学会的学生再教其他学生,人越多教得越快。
BitTorrent:最流行的 P2P 文件分发协议

BitTorrent 是一种 P2P 文件分发协议,由 Bram Cohen 于 2001 年开发。它是最广泛使用的 P2P 协议之一。
BitTorrent 的核心概念:
1. Torrent(种子)
一个 torrent 是一组共享同一个文件的 peer 的集合。文件被分成等大小的块(chunk),每块大小通常为 256KB~1MB。每个 peer 可以下载和上传块。
2. Torrent 文件(.torrent)
每个 torrent 有一个 torrent 文件,包含元信息:
- 文件被分成多少块、每块大小
- 每块的哈希值(用于校验完整性)
- tracker 的地址
3. Tracker(跟踪器)
每个 torrent 有一个 tracker 服务器。新 peer 加入时先连 tracker,获取当前在线的 peer 列表。tracker 不传输数据,只负责协调------告诉 peer "谁在线,你可以从谁那里拿数据"。(2.1节讲过这是混合体系结构。)
4. Seed(种子)和 Leecher(水蛭)
拥有完整文件的 peer 叫 seed(种子),只拥有部分文件的 peer 叫 leecher(水蛭)。新 peer 一开始是 leecher,逐渐下载到完整文件后变成 seed。
通俗类比:BitTorrent 就像一群朋友拼一幅拼图------大家各有几块碎片(chunk),互相交换。有个"前台"(tracker)告诉你"谁手里有什么碎片",你去找他们交换。等拼完整了(成为 seed),你可以继续帮别人拼。
分块交换:拼图游戏

BitTorrent 的核心是 peer 之间的分块交换。每个 peer 需要从其他 peer 那里获取自己还没有的块,同时把自己已有的块上传给其他 peer。
peer 怎么决定优先请求哪些块?
最稀有优先(Rarest First):peer 优先请求在 torrent 中最稀有的块。例如某个块只有 1 个 peer 有,而其他块有 10 个 peer 有,先请求最稀有的------避免那个 peer 下线后块就没了。
通俗类比:最稀有优先就像"先抢限量版"------最少的碎片最可能消失,先拿到手最安全。
peer 怎么决定给谁上传?
以牙还牙:激励机制

P2P 有个天然的问题------"搭便车(free-riding)":如果有人只下载不上传,系统对其他人不公平,长期会导致没人愿意上传。
BitTorrent 用**以牙还牙(Tit-for-Tat)**机制解决:
基本规则:Alice 给哪些 peer 上传?优先给那些也给她上传的 peer。每个 peer 维护一个"给过我数据"的列表,定期检查谁上传得最多,优先回馈那些 peer。
通俗类比:以牙还牙就像"礼尚往来"------你给我什么,我就给你什么。你什么都不给我,我也不给你。这样鼓励大家都贡献。
乐观疏通(Optimistic Unchoking):每个 peer 周期性地(每隔约 30 秒)随机选一个新 peer 尝试上传------万一这个新 peer 能提供更好的数据交换呢?这就像"偶尔给陌生人一个机会"------帮助发现更好的合作伙伴。
惩罚搭便车者:如果一个 peer 只下载不上传(搭便车),其他 peer 不会给它上传数据,它的下载速度会非常慢------这就是 P2P 的自然激励机制。
分布式散列表(DHT)

BitTorrent 还使用**分布式散列表(DHT, Distributed Hash Table)**来实现无 tracker 的 peer 发现。
DHT(分布式散列表):一种分布式数据存储机制,把键值对(key-value pair)分散存储在所有参与节点上,不需要中央服务器。
DHT 的工作原理:
- 每个节点负责一个键值范围(key range)。
- 节点按标识符(ID)组成一个环形结构(如 Chord 环)。
- 查找某个键时,沿着环路由到负责该键的节点。
- 节点可以动态加入和离开。
DHT 的好处:不需要 tracker------peer 之间通过 DHT 直接查找"谁有某个文件",去中心化程度更高。
通俗类比:DHT 就像"没有总机,但每个人知道一部分电话簿"------你想找某个人的电话,你问你的邻居,邻居说"这个人的信息在隔壁老王那里",你去找老王。每个人只存一部分信息,但通过接力查询总能找到。
本节核心总结(必看)

看完2.5小节,我们可以用一句话概括:
P2P 文件分发让每个 peer 既是下载者又是上传者,具有自扩展性------下载人数越多反而越快;BitTorrent 通过 torrent 文件、tracker 协调、分块交换(最稀有优先)、以牙还牙激励机制和乐观疏通实现高效文件分发,DHT 实现无 tracker 的去中心化 peer 发现。
最后梳理本节必掌握的核心概念:
- P2P 文件分发(P2P file distribution):文件从多个 peer 同时获取不同块,人人都是服务器;
- 自扩展性(self-scalability):peer 越多,系统总上传能力越大,分发时间增长远慢于线性;
- C/S vs P2P 分发时间:C/S 随 N 线性增长,P2P 远慢于线性;
- Torrent(种子):共享同一文件的 peer 集合,文件被分成等大块(chunk);
- Torrent 文件(.torrent):包含块信息、哈希值和 tracker 地址的元数据文件;
- Tracker(跟踪器):协调 peer 发现的服务器,不传输数据,混合体系结构;
- Seed(种子):拥有完整文件的 peer;
- Leecher(水蛭):只拥有部分文件的 peer;
- 最稀有优先(Rarest First):优先请求 torrent 中最稀有的块;
- 以牙还牙(Tit-for-Tat):优先给也上传给你的 peer 上传,惩罚搭便车者;
- 乐观疏通(Optimistic Unchoking):周期性随机选新 peer 尝试上传,发现更好伙伴;
- 搭便车(free-riding):只下载不上传的自私行为;
- DHT(Distributed Hash Table):分布式散列表,无 tracker 的去中心化 peer 发现机制。
结语
2.5 节深入了 P2P 文件分发------从 P2P vs C/S 的时间效率对比(自扩展性),到 BitTorrent 的完整架构(torrent/tracker/seed/leecher),到分块交换机制(最稀有优先),到以牙还牙激励(惩罚搭便车),再到 DHT 去中心化发现。
P2P 的核心思想是"人人为我,我为人人"------每个人既是下载者也是上传者,利用集体的带宽和存储,实现比 C/S 更高效的文件分发。
接下来 2.6 节我们将进入视频流和内容分发网(CDN)------看看 Netflix、YouTube 这些视频平台是怎么把高清视频流畅地送到你屏幕上的。感兴趣的朋友可以关注一下,一起跟着《计算机网络-自顶向下方法》,从基础开始,逐步吃透计算机网络~
如果觉得本节笔记对你有帮助,欢迎点赞、收藏,有不懂的地方也可以在评论区留言,我们一起讨论学习!