p2p&BT种子
创建时间: 2025年9月9日 14:41
重点就是学习这四个核心流程
- 节点发现 (Peer Discovery) → 典型技术就是 DHT / Tracker / Gossip
- 连接建立 (Peer Connection) → NAT 穿透、TCP/UDP
- 资源定位 (Resource Lookup) → DHT、种子分片表
- 数据传输 (Data Exchange) → 分片传输、哈希校验、Tit-for-Tat
前置概念了解
DHT网络
DHT 全称 Distributed Hash Table(分布式哈希表),DHT = BT 网络能完全去中心化的关键
较为官方的解释
在 BT 网络里,它是一种 去中心化的“找人协议”。
- Tracker = 中央通讯录(有点中心化)
- DHT = 全网分布式通讯录(完全去中心化)
工作原理看这个解释:
- 节点加入网络
- 每个 BT 客户端(qBittorrent、Transmission 等)都会运行一个 DHT 节点。
- 节点有一个 ID(通常是随机数)。
- 资源标识(Info Hash)
- 每个种子有一个唯一的
Info Hash
(SHA-1 哈希值)。 - 你要下载某个资源,就拿着这个 Hash 去查。
- 每个种子有一个唯一的
- Kademlia 算法(常见实现)
- BT 用的 DHT 协议通常是 Kademlia。
- 它把所有节点组织成一个“分布式哈希表”。
- 你问某个 Info Hash,消息会在网络里跳转,逐步找到 谁在做种/下载这个资源。
- 返回节点列表
- 最终,你会得到一批节点的 IP:Port → 直接连他们下载。
Tracker
就是追踪服务器,官方解释: 它是一个运行在互联网上的服务器,专门负责帮助 BT 网络里的 Peer(节点)发现彼此。
我们需要关注的是Tracker不储存文件,只储存谁有这个文件哪个部分
这个解释也十分贴切
当你加载 .torrent
或磁力链接时,客户端会:
-
从种子文件 / 磁力链接中拿到 Tracker 地址。
-
向 Tracker 发送请求:
我有 info_hash=xxxx 的资源,告诉我还有哪些人也在分享? -
Tracker 回复:
🔍
有这几个 IP:Port 节点 → 去找他们下载吧
就算没有Tracker,理论上也是能下的,通过DHT网络查询
最大作用就是,提速!,帮助我们更快地找到更多节点
PT
PT = Private Tracker(私有追踪器)
总结一句话:PT就是一种“会员制的 BT 网络”,靠规则维持资源高质量和长期活跃
较为官方的解释:
PT = Private Tracker(私有追踪器)
它是 BitTorrent 的一种“半封闭生态”,区别于公用 BT 网络(Public Tracker + DHT)。
在 PT 网络里:
- 下载必须通过 指定的 Tracker,而且要求登录账号(和邀请码机制)。
- 禁止 DHT、PEX(节点交换)、公用 Tracker → 只允许 Tracker 分发 Peer 列表。
- 这样保证下载只发生在 特定社区内部。
NAT以及穿透
我们需要先了解和学习什么是NAT,计算机网络中
NAT 是 Network Address Translation 的缩句,中文意思是网络地址转换。
一个类比想象成一个公司或者公寓
- 内部网络(局域网):就像公司里的很多员工或公寓楼里的很多住户,每个人都有一个内部分机号或房间号(这就是私有IP地址,如
192.168.1.101
)。这些号码只在内部有效,外面的人不知道。 - 外部网络(互联网):就是公司或公寓楼外面的世界。
- NAT设备(通常是路由器):就是前台。这个前台有一个对外的总机电话号码或街道地址(这就是公有IP地址)。
可以从这里看出来,NAT主要的作用就是帮助我们节省了很多IP地址,这样就构造出来内网,外网这两个隔离环境和概念
关于NAT穿透我的理解
了解NAT之后我们会发现一个问题,就是NAT后的设备,我们内部设备访问公网没有什么问题,很方便和便捷,但是一个问题是,我们尝试去让访问公网访问我们就是比较难了,这时候就需要NAT穿透了
“打洞”难易程度,也就是穿透的难易程度取决于这个NAT的“严格程度”,有很多NAT类型,这里举几个
收集于网络
- 全锥形 NAT (Full Cone NAT):最容易穿透,只要外部知道 IP:Port 就能连进来。
- 受限锥形 NAT (Restricted Cone NAT):外部必须先被内部“打过招呼”。
- 端口受限锥形 NAT (Port Restricted Cone NAT):更严格,必须精确匹配 IP+Port 才能通信。
- 对称型 NAT (Symmetric NAT):最难穿透,因为映射端口会随目标不同而改变。
认识NAT后就需要了解穿透的方法
(1) UPnP / NAT-PMP
- 客户端直接跟路由器协商,请求开放一个端口映射到自己。
- 常见于家庭路由器,但公司/校园网络一般禁用。
(2) TCP/UDP Hole Punching(打洞)
- 双方先通过一个“中介服务器”(例如 BT 的 Tracker 或 DHT 节点)互相交换各自的公网 IP:Port。
- 然后双方同时向对方发起连接请求(UDP/TCP)。
- NAT 会认为这是“相关的连接”,从而打通。
- UDP 更容易成功,TCP 打洞复杂一些。
(3) Relay(中继)
- 如果实在打不通(例如对称 NAT),就用一个中间服务器转发流量。
- BT 网络里常用 中继节点/超级节点 来帮忙。
这里我想到内网渗透的时候,进行这个代理转发
它俩解决的问题都是——解决了“外部无法直接访问内网”的问题
- 代理转发的话,主要就是一个隧道来打通一个网络,在 受控机器 上部署一个“跳板”或者“转发器”,把流量从公网 → 内网传过去
感觉更接近这个中继的思想
实验搭建
种一个种子
.torrent
文件
这里做一个实验,我为我以前一个图片做一个种子
具体使用软件Torrent是Transmission Qt Client
这里Tracker添加了
udp://tracker.opentrackr.org:1337/announceudp://tracker.opentrackr.com:1337/announceudp://tracker.dler.com:6969/announceudp://tracker.internetwarriors.net:1337/announceudp://tracker.moeking.me:6969/announce
还有一些属性
说明 (M):可选,可以写一些备注
来源 (S):一般不用填。它用于绑定 WebSeed(HTTP 下载源),下载客户端会额外从 HTTP 服务器补数据。
私有 Torrent (P):默认不要勾。这个是 PT(Private Tracker)站点用的,勾上就禁止 DHT/PEX,只能通过指定 Tracker 找人
最后生成一个image.torrent
这里还是使用迅雷,虽然说风评不好
因为这个资源只有我自己有.所以比较慢
但是还是下载成功了
种子文件
BT 种子文件(.torrent
)本质上是一个 bencode 编码 的字典结构
可以看一下这个例子
d 8:announce 42:udp://tracker.opentrackr.org:1337/announce 13:announce-list ll42:udp://tracker.opentrackr.org:1337/announcee l42:udp://tracker.dler.com:6969/announcee 7:comment 11:Example file 10:created by 12:uTorrent 3.5.5 13:creation date i1694275200e 4:info d 6:lengthi12345e 4:name12:example.txt 12:piece lengthi16384e 6:pieces<hash1><hash2>... ee
可以看到这个格式还是比较清晰的,具体规则如下,
BT 协议自己定义的一种简单编码方式,用于存储和传输数据:
- 字符串:
<长度>:<内容>
- 例:
4:peer
→ 表示字符串"peer"
- 例:
- 整数:
i<数字>e
- 例:
i123e
→ 表示整数123
- 例:
- 列表:
l<元素...>e
- 例:
l4:spam4:eggse
→ 表示[ "spam", "eggs" ]
- 例:
- 字典:
d<键值对...>e
(键必须按字典序排序)-
例:
d3:cow3:moo4:spam4:eggse
→
{ "cow": "moo", "spam": "eggs" }
-
磁力链接
磁力链接基本格式如下
magnet:?xt=urn:btih:<info_hash>&dn=<name>&tr=<tracker_url>&...
magnet:?
→ 表示协议头,说明这是一个磁力链接。xt=urn:btih:<hash>
→ 最重要的部分,xt = eXact Topic,btih = BitTorrent Info Hash。btih
= 种子文件信息的哈希值(SHA-1,20字节,通常40位16进制)。- 只要知道这个 hash,BT 客户端就能通过 DHT 或 Tracker 找到对应的资源。
dn=<name>
→ display name,可选参数,用来显示资源的文件名。tr=<tracker_url>
→ tracker 服务器地址,可以有多个。- 其他参数还有
xl
(文件大小)、as
(备用下载地址)、ws
(Web种子)等等
这个磁力链接跟BT种子的区别
对比点 | 种子文件(.torrent) | 磁力链接(Magnet) |
---|---|---|
保存内容 | 文件元数据(完整) | 仅包含文件哈希等关键标识 |
获取方式 | 需要先下载 .torrent 文件 | 直接用一串链接 |
启动速度 | 较快(信息已在文件中) | 稍慢(需从网络获取元信息) |
分享方式 | 文件形式,不方便直接传播 | 文本链接,传播非常方便 |
依赖 | Tracker 或 DHT | 主要依赖 DHT(也可带 tracker 参数) |
我以前一直疑惑的一个事情,其实一些冷门的磁力是下载是十分慢的,为什么我使用pikpak,迅雷这些软件能下载那么快
具体是如下
网上回答如下:
总归来说技术逻辑就是
- 云端先下再转存
- 你提交磁力/种子/链接之后,不是你的电脑直接去 BT 网络拉数据,而是 PikPak 的服务器先在他们的高速机房里帮你下载。
- 它们通常有很快的带宽、更多的 Tracker/DHT 节点资源,可以快速拉满文件。
- 之后,你从 PikPak 云端把文件 **以“网盘下载”或“在线播放”**的方式取回来,相当于用 HTTP/HTTPS CDN 加速。
- 这一步速度就取决于你到 PikPak 服务器的网络质量(通常比 BT 点对点快很多)。
- CDN/多源加速
- PikPak 会把热门资源缓存到自己的服务器或 CDN 节点上。
- 你点开的时候,如果别人已经缓存过,你几乎是“秒下/秒播”。
- 这跟 BT 要看有没有人做种完全不同。
- 绕过“冷启动”问题
- 普通 BT 下载时,如果冷门资源没人在线做种,你会下不动。
- PikPak 的服务器集群通常长期挂种,能保证资源可用性。
- 它们可能还会结合其他来源(比如 WebSeed、网盘共享等)补种。
- 优化传输协议
- 本地下载的时候,PikPak 用的其实就是普通的 HTTP/HTTPS,不受 BT 上传下载速率对等、NAT 穿透、Tracker 延迟的影响。
- 简单理解:你下的不是 BT,而是 PikPak 的网盘文件。
大概就这些吧,后续补充