种子与磁链—p2p下载
参考内容:BT种子的原理是什么?-知乎
如果是通过某个指向文件的 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 文件如何用于下载
- BT 客户端读取
.torrent文件并载入内存。 - BT 客户端提取 torrent 文件中的 Tracker 服务器地址,然后与 Tracker 进行通讯并申请下载文件(文件通过 hash 值作为标记)
- Tracker 收到请求后,会记录该客户端的公网 IP,同时返回下载过该文件或正在下载该文件的 IP。
- 下载过程中,协议要求客户端 5 分钟跟 Tracker 通讯一次,如果太久不通讯,会被标识为下线。
- 客户端拿到了一堆 IP 后,会逐个尝试连接,连接上之后开始通信。例如相互告知自己目前有文件的哪些分块,这样就可以相互传输资源,加快下载。
- 如果 torrent 中有一个 P2SP 的 Http 地址辅助下载,那么客户端也可以同时从这个 Http 服务器请求数据,并将这个服务器当成一个普通的节点。
MagNet Link
先前的工作方式依然会面临因为 Tracker 服务器受到打击而无法使用的问题,而磁力链接 (MagNet Link) 则摆脱了对 Tracker 服务器的依赖——因为每个用户的电脑都可以作为 Tracker 服务器。
使用技术
DHT (Distributed Hash Table)
DHT 是一种分布式存储方法,其作用是找到那些与本机正在下载(上传)相同文件的对端主机(Peer)。DHT 的工作方式可以简化理解为“接力问路”:
- 加入网络:当用户启动 BT 客户端并开启 DHT 功能时,用户的电脑会自动成为这个全球分布式网络的一个节点 (Node)。客户端会保存一小部分其他节点的联系方式。
- 发布信息:开始一个下载任务时,客户端会向 DHT 网络“广播”:“嗨,我正在下载这个 Info Hash 的文件,我的联系方式是 XXX.XXX.XXX.XXX”。
- 查找信息:客户端会根据要下载文件的 Info Hash,计算出一个“距离”。然后它会去问自己认识的节点:“你知道谁在下载这个 Info Hash 的文件吗?”
- 接力指路:被问到的节点可能不知道,但它会根据“距离”算法,告诉你:“我不知道,但你应该去问那个节点,它离目标‘更近’”。
- 找到目标:客户端就这样一站一站地问下去,最终会找到那些“负责”存储该 Info Hash 联系信息的节点,并从它们那里获取到一份正在下载该文件的用户 IP 列表。
PEX (Peer Exchange)
如果说 DHT 是一个用来寻找“第一批”用户的全球网络,那么 PEX 则是在已经找到一些用户之后,用来快速扩大“朋友圈”的技术。PEX 允许已经连接到同一个文件下载任务(同一个 Swarm 或“集群”)的用户之间,互相交换他们所知道的其他用户的 IP 地址列表。
PEX 的工作流程为:
- 建立连接:客户端通过 Tracker 或 DHT 找到了第一个用户,比如 Peer A,并成功与之建立了连接。
- 交换信息:在与 Peer A 传输文件数据的同时,客户端会问它:“除了我,你还连接着谁?” Peer A 会把它自己知道的、也在下载这个文件的其他用户列表(比如 Peer B, C, D)发给客户端。
- 扩大连接池:客户端收到这份新列表后,就会尝试去连接 Peer B, C, D,从而快速增加可连接的用户数量。同时,客户端也会把自己的已知用户列表分享给 Peer A 和其他连接上的用户。
Magnet links 如何工作
相比一个 .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 网站通过几个关键机制来维持社区的健康和高速下载体验:
- 严格的邀请/考核制
通常需要通过以下方式加入 PT 站:- 邀请码:由网站内的资深会员发出。邀请人通常会对被邀请人负有连带责任。
- 开放注册:极少数情况下,网站会在特定时间(如节假日)短暂开放注册,但名额有限。
- 考核:有些 PT 站会开放申请,你需要证明自己的网络条件(上传速度)、硬盘空间,甚至需要回答一些关于 BT 和 PT 的知识问答。
- “分享率 (Ratio)” 是唯一法则
这是 PT 的灵魂。每个用户都有一个分享率,计算公式为:- 生存要求:每个 PT 站都会设定一个最低分享率标准(例如 > 0.8 或 > 1.0)。如果你的分享率长时间低于这个标准,账号会收到警告,甚至被封禁。
- 激励机制:这个规则强制每个成员都必须成为一个“贡献者”,而不仅仅是“索取者”。它确保了网络中的每一个资源都有足够多的人在做种 (Seeding),从而保证了极高的下载速度。
- Passkey:你的专属“身份证”
PT 网站完全禁用 DHT 和 PEX,所有下载都必须通过它自己的私有 Tracker 服务器。为了追踪每个人的上传和下载量,它会为每个用户生成一个独一無二的字符串,叫做 Passkey。- 当你从 PT 网站下载
.torrent文件时,这个 Passkey 会自动嵌入到文件的 Tracker URL 中。 - 你的 BT 客户端每次向 Tracker 服务器汇报上传/下载数据时,都会带上这个 Passkey。服务器以此来识别是你,并精确地记录你的流量。
- Passkey 绝对不能泄露,否则别人可能会用你的身份去下载,而流量会算在你的头上,导致你的分享率暴跌。
- 当你从 PT 网站下载
- 保种规则 (Seeding Rules)
除了总的分享率,很多 PT 站还有针对单个种子的保种规则,例如:- H&R (Hit & Run):指下载完一个种子后在短时间内就停止做种的行为,这是被严厉禁止的。
- 最低做种时间:要求每个下载完成的种子,必须持续做种一定时间(如 72 小时)。
- 最低分享率:要求单个种子的分享率必须达到 1.0 才能停止做种。
PT 社区的“经济系统”
为了帮助用户管理分享率,PT 社区通常还有一套虚拟经济系统:
- 魔力值 (Bonus Points):根据你的做种时间和种子数量,系统会持续奖励你一种叫做“魔力值”的积分。魔力值可以用来兑换上传量、邀请码,甚至在分享率不达标时“续命”。
- Freeleech (免费下载):网站会定期或不定期地将某些种子设置为 “Freeleech”。下载这些种子时,下载流量不计入你的账户,但上传流量照算。这是提升分享率的最佳时机,也是 PT 鼓励用户下载大体积文件(如蓝光原盘)的重要手段。通常分为 100% Free, 50% Free (只计算一半下载量), 2x Upload (上传量翻倍计算) 等。
