【枫の文章】一篇文章了解和使用BT(BitTorrent)
- 内容介绍
- 文章标签
- 相关推荐
前言:
这篇文章带你入门BT,了解BT协议和客户端,并最佳化使用他们。
一、BT是什么
BT全称BitTorrent,中文别称比特洪流、比特流等,是一种基于用户群对用户群(peer-to-peer)的文件传输协议。
它不依赖类似传统HTTP下载所需要的中心服务器,文件可以是完全或部分分片存在于BT网络内的一个或多个用户中,并且有别于HTTP服务器,理论BT用户越多,下载且上传同一个文件的用户就越多,下载该文件的速度就越快。
下载文件时,下载一方的速度完全来源于上传一方或多方的速度。
早期Internet尚不完善,传输速率较低的时候,BT传输应运而生,成为了一种热门快速的文件分发方式,直到今天。
二、BT术语与概念解释
1. torrent文件(种子文件)
要想进行BT下载,首先需要先获取到文件所对应的.torrent文件。
该文件是BitTorrent协议规范产物,它是一个元数据文件,包含了如下内容:
- 文件大小
- 文件名称
- 文件块数量
- Tracker服务器地址或列表
- 文件块Hash校验值
- Torrent文件自身的Info Hash
- 一些其他辅助字段,比如创建时间、生成工具、制作者信息等
一个最典型的torrent文件:
image109×176 25.7 KB
文件大小:描述了torrent对应文件内容的总大小。下载时,BT工具会根据此信息正确显示文件的总大小(一些BT工具也会进行预留磁盘空间)
文件名称:描述了torrent对应每一个文件内容的名称。下载时,BT工具会根据此信息正确显示文件名称。
文件块数量:描述了torrent对应文件内容的总分块数量,BT工具按照此分块数量统计已下载数量和总计数量,从而计算进度。
Tracker服务器地址或列表:描述了此torrent初始Tracker,BT工具可以根据此内容发现同样正在下载此torrent的其他用户(peers),同时维护种群(所有下载了此torrent的用户群)列表。
文件块Hash校验值:描述了每一个文件分块的校验值,BT工具会在某一个分块下载完毕后与torrent中描述的校验值比对,防止文件分块损坏和恶意节点。
Torrent文件自身的Info Hash:每一个torrent制作完毕后都会有一个自身的Hash,这个Hash在BT网络中是唯一的,用于标识种子的唯一性,类似种子的“身份ID”。
2. Magnet (磁力链接)
后期Torrent网络和工具升级后,下载文件不再需要拿到完整的torrent文件,也可以只拿到一个磁力链接,如下是一个磁力链接示例:
magnet:?xt=urn:btih:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
其中XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 就是Torrent文件自身的Info Hash,BT工具收到这个链接后,根据其中的Info Hash,前往BT网络中下载此Info Hash对应的torrent文件,然后再启动下载,算是一种torrent的简化描述方式。
3. Peer(节点)
任何参与了上传或下载的人,都叫Peer。
包含Seeder和Leecher。
4. Seeder(做种者)
拥有100%完整文件且正在保持上传的人。
他们是BT网络中最可爱、最值得尊敬的贡献者,拥有完整文件且以上传流量居多,为其他正在下载文件的用户提供速度。
5. Leecher(吸血者)
只下载却不上传的人。
这分为狭义和广义。
狭义的Leecher指的是正在下载的Peer。
广义的Leecher指的是只下载不上传的Peer。
对于广义的Leecher,他们是BT网络中最卑劣的破坏者,吸取其他Peer的上传流量,得到文件后自私地不给任何人上传的用户。
6. Swarm(种群)
某个torrent中所有Peer的集合就叫种群。
7. Tracker
Tracker是一个中心化的服务器,它记录着torrent信息以及其对应的Peers信息。
BT客户端开始进行某一个torrent任务后,会连接到配置的Tracker服务器。
Tracker会进行如下工作:
- Peer发现
- 维护Swarm
- 统计与状态更新
- 提供 Torrent 健康度信息
Peer发现:这是Tracker最主要的能力,当一个新用户加入torrent并开始下载时,该客户端会向Tracker发送请求,告诉Tracker如下内容:
- 我想要下载的文件内容
- 我的IP地址
- 我的BT软件监听端口
- 我的下载进度
- 我下载的数据大小
- 我上传的数据大小
Tracker收到请求后会进行记录,然后把同样正在下载和做种该torrent的其他Peer列表返回给请求的客户端。
客户端收到该列表之后,从本机尝试对这些IP发起连接,建立P2P。
一旦建立成功,对方将为下载客户端提供上传,下载客户端将会产生下载速度。
维护Swarm:Tracker会维护不同torrent的状态:
- 哪些Peer正在下载
- 哪些Peer正在做种
- 全部Peer信息
统计与状态更新:BT客户端会定期向Tracker汇报自己的状态,包括:
- 某Torrent的事件状态,如started(开始下载),stopped(停止下载)和completed(完成下载)
这样Tracker就可以统计某个torrent的正在下载/正在上传/总Peer数,也可以统计不同Peer的下载量和上传量。
提供 Torrent 健康度信息:通过统计,Tracker就可以向BT客户端返回torrent的健康信息,比如Seeders和Leechers信息,用户可以从BT客户端直接看到该torrent的状态。
8. DHT(分布式哈希表)
早期BT发现用户只能靠Tracker,而Tracker很明显是一个中心化的服务,与BT去中心化的设计有一定的违背,并且中心化服务会因各种原因崩溃不可用,因此后期BT协议中增加了子协议,也就是DHT。
DHT全称Distributed Hash Table,分布式哈希表。在Tracker服务器完全不可用时,DHT可以提供去中心化的Peer发现能力,从而提供更好的Peer发现和连接环境。
主流的BT客户端目前均支持DHT,且集成了DHT功能,一般集成的算法是Kademlia DHT。
DHT不需要每一个客户端都存储完整的Peer信息,而只存储距离torrent的Info Hash最近逻辑距离的Peer信息,算法使用XOR异或,大致逻辑如下:
- 每个DHT节点在整个网络中都有一个节点ID,写作Node ID
- torrent文件中也有一个Info Hash,写作targetID
- 距离计算方式为distance = nodeID XOR targetID
- 最后谁XOR后更小,谁就在逻辑上接近torrent,就负责记录该torrent的Peer信息。
示例:
| 节点 NodeID | infohash | XOR 距离 |
|---|---|---|
| 0b00001100 | 0b00001010 | 0b00000110 → 6 |
| 0b11100011 | 0b00001010 | 0b11101001 → 233 |
| 0b00001011 | 0b00001010 | 0b00000001 → 1 |
- 距离最小 = 1 → 这个节点就是 离 infohash 最近的节点, 也就负责存储该Info Hash的Peer信息。
当下载的客户端开始下载时,客户端会从自己已经连接到的DHT节点中,通过XOR得知距离Info Hash最近的节点是谁,然后连接该节点获取Peer信息,该DHT节点会返回它知道的Peers,同时如果它知道更近的DHT节点,则会把更近的DHT节点信息告诉下载的客户端,客户端进行递归查询。
如果客户端是初始客户端并不知道任何DHT节点,主流BT工具会在其内置一些bootstrap nodes,也就是已知的DHT节点,BT客户端会通过这些节点获得更多DHT信息,然后进行上述的递归查询获得更多节点信息。
注意,DHT节点数量不是越多越好,因为DHT本质上是分布式存储,我们的客户端只负责维护一小部分寻址和路由,加上XOR算法进行递归查询,效率很高,一般300-1000个DHT节点就是十分健康的DHT状态,太高的DHT会使得BT工具维护消耗更大性能且没有明显有益提升。
9. PEX (节点交换协议)
PEX全称Peer Exchange,节点交换协议,是除Tracker和DHT以外,另一种发现Peer的方式。
这种方式没有Tracker和DHT那么难理解,其实非常简单。
当你下载一个torrent时,你会通过Tracker或DHT发现一些Peers并连接上,PEX就是你和其他Peer连接后,其他Peer会告诉你他知道的正在下载此torrent的更多Peer,你也会将自己知道的Peer告诉对方,从而双方都获得更多Peer信息。
10. LSD(局域网节点发现)
LSD全称Local Service Discovery,局域网节点发现。
这个功能是不在Internet上路由的,针对局域网。
该功能实现方式如下:
- 客户端发送组播数据,目标为
239.192.152.143:6771 - 局域网内的其他BT客户端会监听此组播,收到数据后会返回自己正在下载和做种的torrent信息
- 如果双方都在下载某一个torrent,则通过局域网直接建立连接,不在Internet上路由,速度超快。
11. TCP/µTP协议
这两种协议在Peer连接时会使用到,也就是我们下载文件时与Peer网络传输的两种协议。
其中,标准的BT协议传输就使用TCP,因此我们在BT软件中看见的Peer连接类型为TCP/BT就意味着,我们和此Peer连接使用的是标准BT协议。
µTP(Micro Transport Protocol)是 BitTorrent 网络中常用的一种传输层协议,与后期加入BitTorrent实现中,开发者就是BitTorrent Inc.。
µTP使用UDP传输数据,但µTP实现了类似TCP的重传和可靠性传输,并提供了拥塞控制,目的是在P2P下载中降低链路拥堵,避免影响其他的应用和服务。
µTP是一种优先延迟的轻量协议,它既不占用TCP连接池,也会在其他服务需要高带宽时主动退让。同时,基于UDP也让µTP有更好的NAT表现,能够比TCP更加轻易穿透NAT和防火墙,这有利于BT协议中最重要的点对点连接建立。
但是,µTP基于UDP,UDP流量在ISP侧会有比TCP更加严格的限制,因此µTP协议的实际Internet传输速度并没有TCP快。
12. WebTorrent
这个一般由torrent文件发布者集成进入torrent文件中,将一个或多个传统HTTP下载链接加入torrent描述中,当BT工具开始下载时,除了进行P2P传输,还会连接到这些传统HTTP服务器上使用HTTP协议进行文件下载。
WebTorrent实际上就是传统的HTTP下载,但在torrent中可以有效帮助加速文件稳定分发,帮助BT网络健康运行,提升下载速度。
三、BT下载准备
1. 准备材料
要想下载BT,需要准备好如下的材料:
- 支持BT协议的工具
- 良好的网络连接(最好同时支持IPv4和IPv6,并支持全球入站连接)
- 一台可以稳定工作的计算机(不要拿手机等不稳定的设备)
- 良好的心态
首先是支持BT协议的工具,这个特别特别多,我这里简单举例一些常用的:
- BitTorrent
- µTorrent
- qBittorrent
- Deluge
- BiglyBT
- Transmission
- BitComet
还有一些其他实现了BT协议的客户端,这里不一一列举。
本篇教程以qBittorrent为例,此工具在性能和可配置项上提供了更好的均衡选择。
2. BT客户端参数配置
下载并安装工具后,启动即可进入主界面。
image1375×892 138 KB
我们需要配置几个项,让qBittorrent以更好的状态工作。
首先,我们需要启用不完整文件的特殊后缀,这样防止我们一时遗忘使用了尚未完成下载的文件:
image1173×934 164 KB
之后我们适当调整qBittorrent的高级配置:
- 物理内存使用限制:这个根据自己设备的总物理内存限制来,更高的物理内存限制可以在qBittorrent有大量任务时提供更好的性能表现,一般设置为自己总物理内存的1/8即可,比如我16G内存设置为2048MB,也就是2GB。
- 处理内存优先级:这个是qBittorrent的进程优先级,我们下载BT一般都是让软件在后台跑,所以保持默认的“低于正常”即可,不会对其他进程造成太多影响。
- 当IP和端口更改时重新通知所有Tracker:这个推荐开启,尤其是我们本地可能是动态拨号获取IP的情况,此选项可以尽快把我们的新IP发送给Tracker,以便于其他Peer获得我们这边最新的IP和端口信息。
- 校验时内存扩增使用量:这个是对torrent文件校验时,内存的缓存数据块大小,值越大校验越快,建议设置为物理内存使用限制的1/4,我这里就是512MB。
- 磁盘队列大小:由于磁盘写入速度有时候会跟不上网络的下载速度,这会产生磁盘写入缓存,这个值控制缓存最大可以有多少,默认的1024KB对于现在的网络速度来说有些太小了,我们一般调整为32768KB,也就是32MB,兼顾内存占用和缓冲区大小。
- 发送分块上传建议:推荐开启,客户端将会对Peer告知建议上传的分块顺序,提升上传表现(当然,需要对方客户端接受建议)。
- 发送缓冲区上限:此项决定上传时,会提前预读多少上限的数据进入缓冲区等待发送,这样可以避免频繁读取硬盘造成上传速度和RTT波动。家庭网络保持默认500KB即可,如果是高上传的服务器可以适当调高到1-4MB,值越高占用内存越大。
- 发送缓冲区下限:客户端会保持最低这个大小的缓冲区数据,与上限不同的是,不足下限大小数据会立刻从硬盘中读取来满足。默认10KB对于现在的网络也比较小,一般设置为64KB,高上传或服务器用户可以设置为256KB-512KB。
- 每秒传出连接数:客户端每秒最高能传出这些数量的连接,典型的情况是发现了很多Peer之后,客户端需要逐一尝试连接他们,以及RSS服务,Tracker服务器的连接等所有需要对外传出的情况。这一项调整需要看自己的路由器性能怎么样,如果路由器性能比较好,这一项可以适当调高,如果调的太高可能会影响网络。建议修改为50-100,比较自信的用户可以调整为200-300,但家庭网络用户最好别高于500。
其他高级设置项保持默认即可。
image1173×934 167 KB
3. BT客户端网络配置
之后我们需要配置BT软件的监听端口和网络:
我们需要选择一个未被其他服务定义的端口,比如36276,你也可以选择自己喜欢的端口,也可以让BT客户端自己选择,但请注意不要设置互联网服务的默认预留端口,比如HTTP的80等。
image1173×933 138 KB
一般来说,BT软件会使用路由器的自动端口转发来完成端口映射,进而打通NAT,常见的自动端口映射就是UPnP协议,我们需要在路由器中打开UPnP功能,不同厂商的固件位置不同,我这里拿小米举例:
image720×403 77.6 KB
之后,打开qBittorrent中的UPnP自动端口映射开关:
image1173×933 139 KB
当然,不使用UPnP也是没有问题的,可以自己在路由器中进行端口映射配置,将BT软件监听的端口和BT软件所在机器的IP地址映射到WAN区域的同一个端口上。
假设路由器WAN侧地址为223.1.1.1,BT客户端所在电脑的IP为192.168.31.5,监听端口为36276,那么UPnP会添加一条映射,即发送给223.1.1.1的36276端口的所有数据就全部发给192.168.31.5的36276端口,这样我们的BT软件监听的端口就可以被外网访问,我们可以在拨测网站上测试一下我们的外网IP和对应的端口有没有TCP回应:
image1893×616 102 KB
如果TCPing已经有了回应,那么说明我们BT软件的监听端口已经成功暴露到了Internet上,其他人可以通过我们的IP加端口访问到我们,这在一些BT客户端中称为“端口开放”(如BitComet)。
如果经过上述配置,端口从Internet测试没有反应,这也许不是你的问题,而是因为现在运营商对家庭宽带用户是不给公网IP地址的,我们路由器只能收到一个运营商NAT分配的内网地址,针对这种情况,后面我会单独出一个子教程讲解这种情况的应对办法。
上述为IPv4的做法,IPv6由于广泛使用PD进行前缀委托分配地址,很多设备都是具有IPv6公网地址的,我们只需要检查操作系统防火墙和路由器设备的IPv6防火墙已放行即可开放端口。
端口是否暴露在Internet上不影响我们下载文件,但无暴露的BT客户端可能会发现更少的Peer(因为有些Seeder和我们一样,也是没有暴露到公网的,如果双方都没有暴露公网端口,那么你们两个之间将永远无法建立连接。也因此,会影响我们作为Seeder时的上传效率(因为很多Leecher无法连接到我们进行下载)。
设备尽可能同时拥有IPv4和IPv6网络也是如此,可以从两套网络中分别查找Peers,从而提高下载与上传的速度。
之后,我们需要调整qBittorrent的连接限制:
- 全局最大连接数:各种建立的连接不会超过这个数量,对于BT下载这一项其实可以建议直接关闭,如果连接数过大影响了你的网络稳定性,那么可以根据自身需求,从高到低逐步下调此参数。注意,不宜过低,过低会影响与Peer建立的连接数量,影响下载和上传速度。
- 每torrent最大连接数:同全局最大连接数,但这一项是针对每个任务的,同样建议关闭,影响网络才限制。
- 全局上传窗口数上限:这个翻译有点问题,其实就是全局能给多少个Peer上传,默认20太低了,很容易就占满导致我们上传效果很差,可以直接关闭。
- 每个torrent上传窗口数上限:这个同全局,默认4个也是太低了,建议直接关闭。
image1173×934 138 KB
4. BT客户端配置Tracker服务器
网络上有良好的项目已经为我们总结了几份可用的Tracker列表,本教程感谢他们:
GitHub - ngosang/trackerslist: Updated list of public BitTorrent trackers
Updated list of public BitTorrent trackers
GitHub - XIU2/TrackersListCollection: 🎈 Updated daily! A list of popular BitTorrent...
🎈 Updated daily! A list of popular BitTorrent Trackers! / 每天更新!全网热门 BT Tracker 列表!
我们只需要将他们提供的Tracker List添加到qBittorrent即可:
image1173×934 145 KB
这样qBittorrent会为每一个添加的torrent任务追加这些Tracker服务器,从而提升Peer发现的数量,提升下载和上传速度。
四、开始下载,并观察状态
一切配置结束,我们找个Torrent文件添加在工具中开始下载:
添加下载后,稍等一会,切换到用户选项卡,可以快速看到与大量的Peer建立了连接:
image2125×772 259 KB
可以看见一些参数:
- Peer的IP
- Peer的端口
- 使用了BT还是µTP协议,亦或是WebTorrent(会显示为Web,这个torrent没有)
- 该Peer的标志位
- Peer的客户端名称
- Peer的下载进度
- 我们的下载速度(也就是我们从Peer那里的下载速度)
- 我们的上传速度(也就是上传给Peer的速度)
- 已经下载的数据量
- 已经上传的数据量
- 文件关联(对方所持有的文件中有多少比例对我们的下载是有帮助的)
其中有一个标志位,这里全部列举供参考,标志位指示了此Peer与我们之间的状态,
提示:不同工具的显示情况不同,含义也不一样,有些标志位不是一定会显示的,这里只是qBittorrent示例:
| 标志 | 说明 |
|---|---|
| I | 对方主动连接到你(如果有Peer的标志位带有这个,说明我们的端口暴露情况良好) |
| D | 我们期待下载,对方同意上传 |
| d | 我们期待下载,对方拒绝上传 |
| K | 我们不想下载,对方同意上传 |
| U | 对方期待下载,我们同意上传 |
| ? | 对方不想下载,我们同意上传 |
| E | 使用了加密的BT协议传输 |
| X | 来自PEX的Peer |
| H | 来自DHT的Peer |
| P | 使用µTP协议传输 |
| S | 下载者不知为何突然停止 |
image420×263 61.8 KB
我们还可以看到Tracker的工作状态:
比如Tracker是否正在工作,为我们返回的用户信息等:
image1499×696 131 KB
五、怎么避免被吸血
1. 迅雷与吸血
早年间,谈到吸血一直避免不了谈到迅雷。
迅雷这个客户端比较特殊,从迅雷7开始,它会从各种各样的其他BT客户端那边吸取上传进行下载,但是自己只会上传给其他迅雷客户端,而不会给其他BT客户端上传,这样的行为无异于对其他BT客户端网络造成恶劣影响,并且迅雷下载任务完毕后不会进行任何做种动作,也就是迅雷客户端不会成为BT网络中的Seeder,因此,迅雷是拖累BT网络的存在。
自从迅雷开放自己的下载SDK集成后,大量客户端名称为“Xunlei 0019”标志,在BT网络中发挥了一定的正向作用,这些客户端在任务正在下载时会给其他BT客户端上传,但下载完毕后依旧不会做种,所以迅雷从0019这个客户端上并不是纯粹的拖累BT网络的存在,对抗方式也会有所不同。
2. PCDN与吸血
自从PCDN开始赚钱之后,很多人跑PCDN业务来赚点零花钱,但是很多地区运营商会对大流量上下传不对等的用户进行宽带限制和封禁,因此很多PCDN用户就开始寻求稳定下载的刷流来源,BT网络就被这种恶劣的人盯上。
他们通过伪造Peer汇报的客户端名称,通过多种手段规避BT客户端的反吸血检测,从越来越多的Seeder那里源源不断获取下载来弥补自己的上下流量不对等局面,Seeder们成为了他们牟利的工具,让Seeder的流量为这些垃圾们工作,让真正需要文件的用户得不到相应的带宽,这种行为比迅雷还恶劣的多的多的多,因此催生了一个BT威胁与反吸血网络项目。
3. PeerBanHelper - BT威胁情报网络与主动反吸血
与传统BT软件内置反吸血策略只测量规定时间内Peer有没有上传定量的数据不同,PeerBanHelper通过共享情报网,主动的反吸血探测策略和算法进行恶意Peer的探测,目前,PeerBanHelper支持如下的功能模块:
image329×738 47.8 KB
因此为自己的BT客户端配置一个PeerBanHelper可以有效封禁这些恶意Peer。
首先,我们需要在qBittorrent客户端中启用WebUI功能。
- 启用WebUI功能
- IP地址设置为127.0.0.1,仅允许本机连接,更加安全
- 端口随意
- 用户名和密码设置强度高的
image1173×934 149 KB
之后,我们下载PeerBanHelper安装程序并进行安装:
Releases · PBH-BTN/PeerBanHelper
Automatically block unwanted, leeches and abnormal BT peers with support for customized and cloud rules.| BT 反吸血工具 - 自动封禁不受欢迎、吸血和异常的 BT 客户端,并支持自定义规则。支持 qB/qBEE/Deluge/BiglyBT/BitComet - PBH-BTN/Pee...
安装后,会启动浏览器WebUI,我们进行配置
image2030×1329 149 KB
设置一个token,token需要记住,这将是我们后续进入WebUI的凭证:
image1873×1317 108 KB
建议加入BTN网络,向BTN网络共享恶意Peer的情报,帮助更多人规避吸血。
目前使用自动注册的匿名帐户,建议后续注册BTN账号,使用账号进行绑定:
image2037×1326 164 KB
将我们刚才配置的WebUI信息一次填入这里,点击测试下载器,如果一切无误会显示测试成功:
image2061×1340 160 KB
不启用高级选项:
image1913×1345 90.5 KB
看到这个页面说明PeerBanHelper已经启动成功,可以帮助我们反吸血:
image1990×1402 160 KB
我们可以关闭浏览器,保持PeerBanHelper后台运行,即可安心成为一名Seeder。
六、总结
BT网络初衷即我为人人,人人为我,希望大家在力所能及的情况下保持开机上传,为BT网络贡献力量,成为一名光荣的Seeder。
网友解答:--【壹】--:
是枫酱!我们有救了!
桜井かえで:BT网络初衷即我为人人,人人为我,希望大家在力所能及的情况下保持开机上传,为BT网络贡献力量,成为一名光荣的Seeder。
--【贰】--:
很详细,感谢大佬
--【叁】--:
好文,mark了说是
另外没后提到vpn最好不要下种与版权风险说是
--【肆】--:
有空学习一下,一直都一知半解,只会全默认用着qbit+peerbanhelper
--【伍】--:
就是下载完要一直挂着的意思吧,没想到我居然是吸血者
早期是下完就关,后来想想不对啊,关了咋上传,现在都是挂一段时间
--【陆】--:
感谢大佬
--【柒】--:
哪个设置最简单,我下载过四五次qb,每次都要看教程视频设置,最后嫌麻烦才在转到motix
--【捌】--:
先赞后看,养成习惯!
--【玖】--:
我发现一个问题,我好像不太懂什么叫只下载不上传,是下载完成后不关闭客户端吗,持续多久才能不叫只下载不上传
--【拾】--:
扔在我的收藏夹里面吃灰吧
--【拾壹】--:
这个时候就要问候一下某些只下载不上传的专有软件和国内糟糕的互联网环境,QoS PCDN DPI…
--【拾贰】--:
这倒没有,qb之前设置了不大会用,现在用的是motrix,默认设置
那个分享率在哪看
--【拾叁】--:
感谢佬友的详细讲解~
--【拾肆】--:
学到一点
--【拾伍】--:
好文,mark了
--【拾陆】--:
感谢枫佬的文章
--【拾柒】--:
支持支持
--【拾捌】--:
看着满满干货,抽空会详细了解一番,确实不很清楚,感谢佬友
--【拾玖】--:
已收藏,感谢佬
前言:
这篇文章带你入门BT,了解BT协议和客户端,并最佳化使用他们。
一、BT是什么
BT全称BitTorrent,中文别称比特洪流、比特流等,是一种基于用户群对用户群(peer-to-peer)的文件传输协议。
它不依赖类似传统HTTP下载所需要的中心服务器,文件可以是完全或部分分片存在于BT网络内的一个或多个用户中,并且有别于HTTP服务器,理论BT用户越多,下载且上传同一个文件的用户就越多,下载该文件的速度就越快。
下载文件时,下载一方的速度完全来源于上传一方或多方的速度。
早期Internet尚不完善,传输速率较低的时候,BT传输应运而生,成为了一种热门快速的文件分发方式,直到今天。
二、BT术语与概念解释
1. torrent文件(种子文件)
要想进行BT下载,首先需要先获取到文件所对应的.torrent文件。
该文件是BitTorrent协议规范产物,它是一个元数据文件,包含了如下内容:
- 文件大小
- 文件名称
- 文件块数量
- Tracker服务器地址或列表
- 文件块Hash校验值
- Torrent文件自身的Info Hash
- 一些其他辅助字段,比如创建时间、生成工具、制作者信息等
一个最典型的torrent文件:
image109×176 25.7 KB
文件大小:描述了torrent对应文件内容的总大小。下载时,BT工具会根据此信息正确显示文件的总大小(一些BT工具也会进行预留磁盘空间)
文件名称:描述了torrent对应每一个文件内容的名称。下载时,BT工具会根据此信息正确显示文件名称。
文件块数量:描述了torrent对应文件内容的总分块数量,BT工具按照此分块数量统计已下载数量和总计数量,从而计算进度。
Tracker服务器地址或列表:描述了此torrent初始Tracker,BT工具可以根据此内容发现同样正在下载此torrent的其他用户(peers),同时维护种群(所有下载了此torrent的用户群)列表。
文件块Hash校验值:描述了每一个文件分块的校验值,BT工具会在某一个分块下载完毕后与torrent中描述的校验值比对,防止文件分块损坏和恶意节点。
Torrent文件自身的Info Hash:每一个torrent制作完毕后都会有一个自身的Hash,这个Hash在BT网络中是唯一的,用于标识种子的唯一性,类似种子的“身份ID”。
2. Magnet (磁力链接)
后期Torrent网络和工具升级后,下载文件不再需要拿到完整的torrent文件,也可以只拿到一个磁力链接,如下是一个磁力链接示例:
magnet:?xt=urn:btih:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
其中XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 就是Torrent文件自身的Info Hash,BT工具收到这个链接后,根据其中的Info Hash,前往BT网络中下载此Info Hash对应的torrent文件,然后再启动下载,算是一种torrent的简化描述方式。
3. Peer(节点)
任何参与了上传或下载的人,都叫Peer。
包含Seeder和Leecher。
4. Seeder(做种者)
拥有100%完整文件且正在保持上传的人。
他们是BT网络中最可爱、最值得尊敬的贡献者,拥有完整文件且以上传流量居多,为其他正在下载文件的用户提供速度。
5. Leecher(吸血者)
只下载却不上传的人。
这分为狭义和广义。
狭义的Leecher指的是正在下载的Peer。
广义的Leecher指的是只下载不上传的Peer。
对于广义的Leecher,他们是BT网络中最卑劣的破坏者,吸取其他Peer的上传流量,得到文件后自私地不给任何人上传的用户。
6. Swarm(种群)
某个torrent中所有Peer的集合就叫种群。
7. Tracker
Tracker是一个中心化的服务器,它记录着torrent信息以及其对应的Peers信息。
BT客户端开始进行某一个torrent任务后,会连接到配置的Tracker服务器。
Tracker会进行如下工作:
- Peer发现
- 维护Swarm
- 统计与状态更新
- 提供 Torrent 健康度信息
Peer发现:这是Tracker最主要的能力,当一个新用户加入torrent并开始下载时,该客户端会向Tracker发送请求,告诉Tracker如下内容:
- 我想要下载的文件内容
- 我的IP地址
- 我的BT软件监听端口
- 我的下载进度
- 我下载的数据大小
- 我上传的数据大小
Tracker收到请求后会进行记录,然后把同样正在下载和做种该torrent的其他Peer列表返回给请求的客户端。
客户端收到该列表之后,从本机尝试对这些IP发起连接,建立P2P。
一旦建立成功,对方将为下载客户端提供上传,下载客户端将会产生下载速度。
维护Swarm:Tracker会维护不同torrent的状态:
- 哪些Peer正在下载
- 哪些Peer正在做种
- 全部Peer信息
统计与状态更新:BT客户端会定期向Tracker汇报自己的状态,包括:
- 某Torrent的事件状态,如started(开始下载),stopped(停止下载)和completed(完成下载)
这样Tracker就可以统计某个torrent的正在下载/正在上传/总Peer数,也可以统计不同Peer的下载量和上传量。
提供 Torrent 健康度信息:通过统计,Tracker就可以向BT客户端返回torrent的健康信息,比如Seeders和Leechers信息,用户可以从BT客户端直接看到该torrent的状态。
8. DHT(分布式哈希表)
早期BT发现用户只能靠Tracker,而Tracker很明显是一个中心化的服务,与BT去中心化的设计有一定的违背,并且中心化服务会因各种原因崩溃不可用,因此后期BT协议中增加了子协议,也就是DHT。
DHT全称Distributed Hash Table,分布式哈希表。在Tracker服务器完全不可用时,DHT可以提供去中心化的Peer发现能力,从而提供更好的Peer发现和连接环境。
主流的BT客户端目前均支持DHT,且集成了DHT功能,一般集成的算法是Kademlia DHT。
DHT不需要每一个客户端都存储完整的Peer信息,而只存储距离torrent的Info Hash最近逻辑距离的Peer信息,算法使用XOR异或,大致逻辑如下:
- 每个DHT节点在整个网络中都有一个节点ID,写作Node ID
- torrent文件中也有一个Info Hash,写作targetID
- 距离计算方式为distance = nodeID XOR targetID
- 最后谁XOR后更小,谁就在逻辑上接近torrent,就负责记录该torrent的Peer信息。
示例:
| 节点 NodeID | infohash | XOR 距离 |
|---|---|---|
| 0b00001100 | 0b00001010 | 0b00000110 → 6 |
| 0b11100011 | 0b00001010 | 0b11101001 → 233 |
| 0b00001011 | 0b00001010 | 0b00000001 → 1 |
- 距离最小 = 1 → 这个节点就是 离 infohash 最近的节点, 也就负责存储该Info Hash的Peer信息。
当下载的客户端开始下载时,客户端会从自己已经连接到的DHT节点中,通过XOR得知距离Info Hash最近的节点是谁,然后连接该节点获取Peer信息,该DHT节点会返回它知道的Peers,同时如果它知道更近的DHT节点,则会把更近的DHT节点信息告诉下载的客户端,客户端进行递归查询。
如果客户端是初始客户端并不知道任何DHT节点,主流BT工具会在其内置一些bootstrap nodes,也就是已知的DHT节点,BT客户端会通过这些节点获得更多DHT信息,然后进行上述的递归查询获得更多节点信息。
注意,DHT节点数量不是越多越好,因为DHT本质上是分布式存储,我们的客户端只负责维护一小部分寻址和路由,加上XOR算法进行递归查询,效率很高,一般300-1000个DHT节点就是十分健康的DHT状态,太高的DHT会使得BT工具维护消耗更大性能且没有明显有益提升。
9. PEX (节点交换协议)
PEX全称Peer Exchange,节点交换协议,是除Tracker和DHT以外,另一种发现Peer的方式。
这种方式没有Tracker和DHT那么难理解,其实非常简单。
当你下载一个torrent时,你会通过Tracker或DHT发现一些Peers并连接上,PEX就是你和其他Peer连接后,其他Peer会告诉你他知道的正在下载此torrent的更多Peer,你也会将自己知道的Peer告诉对方,从而双方都获得更多Peer信息。
10. LSD(局域网节点发现)
LSD全称Local Service Discovery,局域网节点发现。
这个功能是不在Internet上路由的,针对局域网。
该功能实现方式如下:
- 客户端发送组播数据,目标为
239.192.152.143:6771 - 局域网内的其他BT客户端会监听此组播,收到数据后会返回自己正在下载和做种的torrent信息
- 如果双方都在下载某一个torrent,则通过局域网直接建立连接,不在Internet上路由,速度超快。
11. TCP/µTP协议
这两种协议在Peer连接时会使用到,也就是我们下载文件时与Peer网络传输的两种协议。
其中,标准的BT协议传输就使用TCP,因此我们在BT软件中看见的Peer连接类型为TCP/BT就意味着,我们和此Peer连接使用的是标准BT协议。
µTP(Micro Transport Protocol)是 BitTorrent 网络中常用的一种传输层协议,与后期加入BitTorrent实现中,开发者就是BitTorrent Inc.。
µTP使用UDP传输数据,但µTP实现了类似TCP的重传和可靠性传输,并提供了拥塞控制,目的是在P2P下载中降低链路拥堵,避免影响其他的应用和服务。
µTP是一种优先延迟的轻量协议,它既不占用TCP连接池,也会在其他服务需要高带宽时主动退让。同时,基于UDP也让µTP有更好的NAT表现,能够比TCP更加轻易穿透NAT和防火墙,这有利于BT协议中最重要的点对点连接建立。
但是,µTP基于UDP,UDP流量在ISP侧会有比TCP更加严格的限制,因此µTP协议的实际Internet传输速度并没有TCP快。
12. WebTorrent
这个一般由torrent文件发布者集成进入torrent文件中,将一个或多个传统HTTP下载链接加入torrent描述中,当BT工具开始下载时,除了进行P2P传输,还会连接到这些传统HTTP服务器上使用HTTP协议进行文件下载。
WebTorrent实际上就是传统的HTTP下载,但在torrent中可以有效帮助加速文件稳定分发,帮助BT网络健康运行,提升下载速度。
三、BT下载准备
1. 准备材料
要想下载BT,需要准备好如下的材料:
- 支持BT协议的工具
- 良好的网络连接(最好同时支持IPv4和IPv6,并支持全球入站连接)
- 一台可以稳定工作的计算机(不要拿手机等不稳定的设备)
- 良好的心态
首先是支持BT协议的工具,这个特别特别多,我这里简单举例一些常用的:
- BitTorrent
- µTorrent
- qBittorrent
- Deluge
- BiglyBT
- Transmission
- BitComet
还有一些其他实现了BT协议的客户端,这里不一一列举。
本篇教程以qBittorrent为例,此工具在性能和可配置项上提供了更好的均衡选择。
2. BT客户端参数配置
下载并安装工具后,启动即可进入主界面。
image1375×892 138 KB
我们需要配置几个项,让qBittorrent以更好的状态工作。
首先,我们需要启用不完整文件的特殊后缀,这样防止我们一时遗忘使用了尚未完成下载的文件:
image1173×934 164 KB
之后我们适当调整qBittorrent的高级配置:
- 物理内存使用限制:这个根据自己设备的总物理内存限制来,更高的物理内存限制可以在qBittorrent有大量任务时提供更好的性能表现,一般设置为自己总物理内存的1/8即可,比如我16G内存设置为2048MB,也就是2GB。
- 处理内存优先级:这个是qBittorrent的进程优先级,我们下载BT一般都是让软件在后台跑,所以保持默认的“低于正常”即可,不会对其他进程造成太多影响。
- 当IP和端口更改时重新通知所有Tracker:这个推荐开启,尤其是我们本地可能是动态拨号获取IP的情况,此选项可以尽快把我们的新IP发送给Tracker,以便于其他Peer获得我们这边最新的IP和端口信息。
- 校验时内存扩增使用量:这个是对torrent文件校验时,内存的缓存数据块大小,值越大校验越快,建议设置为物理内存使用限制的1/4,我这里就是512MB。
- 磁盘队列大小:由于磁盘写入速度有时候会跟不上网络的下载速度,这会产生磁盘写入缓存,这个值控制缓存最大可以有多少,默认的1024KB对于现在的网络速度来说有些太小了,我们一般调整为32768KB,也就是32MB,兼顾内存占用和缓冲区大小。
- 发送分块上传建议:推荐开启,客户端将会对Peer告知建议上传的分块顺序,提升上传表现(当然,需要对方客户端接受建议)。
- 发送缓冲区上限:此项决定上传时,会提前预读多少上限的数据进入缓冲区等待发送,这样可以避免频繁读取硬盘造成上传速度和RTT波动。家庭网络保持默认500KB即可,如果是高上传的服务器可以适当调高到1-4MB,值越高占用内存越大。
- 发送缓冲区下限:客户端会保持最低这个大小的缓冲区数据,与上限不同的是,不足下限大小数据会立刻从硬盘中读取来满足。默认10KB对于现在的网络也比较小,一般设置为64KB,高上传或服务器用户可以设置为256KB-512KB。
- 每秒传出连接数:客户端每秒最高能传出这些数量的连接,典型的情况是发现了很多Peer之后,客户端需要逐一尝试连接他们,以及RSS服务,Tracker服务器的连接等所有需要对外传出的情况。这一项调整需要看自己的路由器性能怎么样,如果路由器性能比较好,这一项可以适当调高,如果调的太高可能会影响网络。建议修改为50-100,比较自信的用户可以调整为200-300,但家庭网络用户最好别高于500。
其他高级设置项保持默认即可。
image1173×934 167 KB
3. BT客户端网络配置
之后我们需要配置BT软件的监听端口和网络:
我们需要选择一个未被其他服务定义的端口,比如36276,你也可以选择自己喜欢的端口,也可以让BT客户端自己选择,但请注意不要设置互联网服务的默认预留端口,比如HTTP的80等。
image1173×933 138 KB
一般来说,BT软件会使用路由器的自动端口转发来完成端口映射,进而打通NAT,常见的自动端口映射就是UPnP协议,我们需要在路由器中打开UPnP功能,不同厂商的固件位置不同,我这里拿小米举例:
image720×403 77.6 KB
之后,打开qBittorrent中的UPnP自动端口映射开关:
image1173×933 139 KB
当然,不使用UPnP也是没有问题的,可以自己在路由器中进行端口映射配置,将BT软件监听的端口和BT软件所在机器的IP地址映射到WAN区域的同一个端口上。
假设路由器WAN侧地址为223.1.1.1,BT客户端所在电脑的IP为192.168.31.5,监听端口为36276,那么UPnP会添加一条映射,即发送给223.1.1.1的36276端口的所有数据就全部发给192.168.31.5的36276端口,这样我们的BT软件监听的端口就可以被外网访问,我们可以在拨测网站上测试一下我们的外网IP和对应的端口有没有TCP回应:
image1893×616 102 KB
如果TCPing已经有了回应,那么说明我们BT软件的监听端口已经成功暴露到了Internet上,其他人可以通过我们的IP加端口访问到我们,这在一些BT客户端中称为“端口开放”(如BitComet)。
如果经过上述配置,端口从Internet测试没有反应,这也许不是你的问题,而是因为现在运营商对家庭宽带用户是不给公网IP地址的,我们路由器只能收到一个运营商NAT分配的内网地址,针对这种情况,后面我会单独出一个子教程讲解这种情况的应对办法。
上述为IPv4的做法,IPv6由于广泛使用PD进行前缀委托分配地址,很多设备都是具有IPv6公网地址的,我们只需要检查操作系统防火墙和路由器设备的IPv6防火墙已放行即可开放端口。
端口是否暴露在Internet上不影响我们下载文件,但无暴露的BT客户端可能会发现更少的Peer(因为有些Seeder和我们一样,也是没有暴露到公网的,如果双方都没有暴露公网端口,那么你们两个之间将永远无法建立连接。也因此,会影响我们作为Seeder时的上传效率(因为很多Leecher无法连接到我们进行下载)。
设备尽可能同时拥有IPv4和IPv6网络也是如此,可以从两套网络中分别查找Peers,从而提高下载与上传的速度。
之后,我们需要调整qBittorrent的连接限制:
- 全局最大连接数:各种建立的连接不会超过这个数量,对于BT下载这一项其实可以建议直接关闭,如果连接数过大影响了你的网络稳定性,那么可以根据自身需求,从高到低逐步下调此参数。注意,不宜过低,过低会影响与Peer建立的连接数量,影响下载和上传速度。
- 每torrent最大连接数:同全局最大连接数,但这一项是针对每个任务的,同样建议关闭,影响网络才限制。
- 全局上传窗口数上限:这个翻译有点问题,其实就是全局能给多少个Peer上传,默认20太低了,很容易就占满导致我们上传效果很差,可以直接关闭。
- 每个torrent上传窗口数上限:这个同全局,默认4个也是太低了,建议直接关闭。
image1173×934 138 KB
4. BT客户端配置Tracker服务器
网络上有良好的项目已经为我们总结了几份可用的Tracker列表,本教程感谢他们:
GitHub - ngosang/trackerslist: Updated list of public BitTorrent trackers
Updated list of public BitTorrent trackers
GitHub - XIU2/TrackersListCollection: 🎈 Updated daily! A list of popular BitTorrent...
🎈 Updated daily! A list of popular BitTorrent Trackers! / 每天更新!全网热门 BT Tracker 列表!
我们只需要将他们提供的Tracker List添加到qBittorrent即可:
image1173×934 145 KB
这样qBittorrent会为每一个添加的torrent任务追加这些Tracker服务器,从而提升Peer发现的数量,提升下载和上传速度。
四、开始下载,并观察状态
一切配置结束,我们找个Torrent文件添加在工具中开始下载:
添加下载后,稍等一会,切换到用户选项卡,可以快速看到与大量的Peer建立了连接:
image2125×772 259 KB
可以看见一些参数:
- Peer的IP
- Peer的端口
- 使用了BT还是µTP协议,亦或是WebTorrent(会显示为Web,这个torrent没有)
- 该Peer的标志位
- Peer的客户端名称
- Peer的下载进度
- 我们的下载速度(也就是我们从Peer那里的下载速度)
- 我们的上传速度(也就是上传给Peer的速度)
- 已经下载的数据量
- 已经上传的数据量
- 文件关联(对方所持有的文件中有多少比例对我们的下载是有帮助的)
其中有一个标志位,这里全部列举供参考,标志位指示了此Peer与我们之间的状态,
提示:不同工具的显示情况不同,含义也不一样,有些标志位不是一定会显示的,这里只是qBittorrent示例:
| 标志 | 说明 |
|---|---|
| I | 对方主动连接到你(如果有Peer的标志位带有这个,说明我们的端口暴露情况良好) |
| D | 我们期待下载,对方同意上传 |
| d | 我们期待下载,对方拒绝上传 |
| K | 我们不想下载,对方同意上传 |
| U | 对方期待下载,我们同意上传 |
| ? | 对方不想下载,我们同意上传 |
| E | 使用了加密的BT协议传输 |
| X | 来自PEX的Peer |
| H | 来自DHT的Peer |
| P | 使用µTP协议传输 |
| S | 下载者不知为何突然停止 |
image420×263 61.8 KB
我们还可以看到Tracker的工作状态:
比如Tracker是否正在工作,为我们返回的用户信息等:
image1499×696 131 KB
五、怎么避免被吸血
1. 迅雷与吸血
早年间,谈到吸血一直避免不了谈到迅雷。
迅雷这个客户端比较特殊,从迅雷7开始,它会从各种各样的其他BT客户端那边吸取上传进行下载,但是自己只会上传给其他迅雷客户端,而不会给其他BT客户端上传,这样的行为无异于对其他BT客户端网络造成恶劣影响,并且迅雷下载任务完毕后不会进行任何做种动作,也就是迅雷客户端不会成为BT网络中的Seeder,因此,迅雷是拖累BT网络的存在。
自从迅雷开放自己的下载SDK集成后,大量客户端名称为“Xunlei 0019”标志,在BT网络中发挥了一定的正向作用,这些客户端在任务正在下载时会给其他BT客户端上传,但下载完毕后依旧不会做种,所以迅雷从0019这个客户端上并不是纯粹的拖累BT网络的存在,对抗方式也会有所不同。
2. PCDN与吸血
自从PCDN开始赚钱之后,很多人跑PCDN业务来赚点零花钱,但是很多地区运营商会对大流量上下传不对等的用户进行宽带限制和封禁,因此很多PCDN用户就开始寻求稳定下载的刷流来源,BT网络就被这种恶劣的人盯上。
他们通过伪造Peer汇报的客户端名称,通过多种手段规避BT客户端的反吸血检测,从越来越多的Seeder那里源源不断获取下载来弥补自己的上下流量不对等局面,Seeder们成为了他们牟利的工具,让Seeder的流量为这些垃圾们工作,让真正需要文件的用户得不到相应的带宽,这种行为比迅雷还恶劣的多的多的多,因此催生了一个BT威胁与反吸血网络项目。
3. PeerBanHelper - BT威胁情报网络与主动反吸血
与传统BT软件内置反吸血策略只测量规定时间内Peer有没有上传定量的数据不同,PeerBanHelper通过共享情报网,主动的反吸血探测策略和算法进行恶意Peer的探测,目前,PeerBanHelper支持如下的功能模块:
image329×738 47.8 KB
因此为自己的BT客户端配置一个PeerBanHelper可以有效封禁这些恶意Peer。
首先,我们需要在qBittorrent客户端中启用WebUI功能。
- 启用WebUI功能
- IP地址设置为127.0.0.1,仅允许本机连接,更加安全
- 端口随意
- 用户名和密码设置强度高的
image1173×934 149 KB
之后,我们下载PeerBanHelper安装程序并进行安装:
Releases · PBH-BTN/PeerBanHelper
Automatically block unwanted, leeches and abnormal BT peers with support for customized and cloud rules.| BT 反吸血工具 - 自动封禁不受欢迎、吸血和异常的 BT 客户端,并支持自定义规则。支持 qB/qBEE/Deluge/BiglyBT/BitComet - PBH-BTN/Pee...
安装后,会启动浏览器WebUI,我们进行配置
image2030×1329 149 KB
设置一个token,token需要记住,这将是我们后续进入WebUI的凭证:
image1873×1317 108 KB
建议加入BTN网络,向BTN网络共享恶意Peer的情报,帮助更多人规避吸血。
目前使用自动注册的匿名帐户,建议后续注册BTN账号,使用账号进行绑定:
image2037×1326 164 KB
将我们刚才配置的WebUI信息一次填入这里,点击测试下载器,如果一切无误会显示测试成功:
image2061×1340 160 KB
不启用高级选项:
image1913×1345 90.5 KB
看到这个页面说明PeerBanHelper已经启动成功,可以帮助我们反吸血:
image1990×1402 160 KB
我们可以关闭浏览器,保持PeerBanHelper后台运行,即可安心成为一名Seeder。
六、总结
BT网络初衷即我为人人,人人为我,希望大家在力所能及的情况下保持开机上传,为BT网络贡献力量,成为一名光荣的Seeder。
网友解答:--【壹】--:
是枫酱!我们有救了!
桜井かえで:BT网络初衷即我为人人,人人为我,希望大家在力所能及的情况下保持开机上传,为BT网络贡献力量,成为一名光荣的Seeder。
--【贰】--:
很详细,感谢大佬
--【叁】--:
好文,mark了说是
另外没后提到vpn最好不要下种与版权风险说是
--【肆】--:
有空学习一下,一直都一知半解,只会全默认用着qbit+peerbanhelper
--【伍】--:
就是下载完要一直挂着的意思吧,没想到我居然是吸血者
早期是下完就关,后来想想不对啊,关了咋上传,现在都是挂一段时间
--【陆】--:
感谢大佬
--【柒】--:
哪个设置最简单,我下载过四五次qb,每次都要看教程视频设置,最后嫌麻烦才在转到motix
--【捌】--:
先赞后看,养成习惯!
--【玖】--:
我发现一个问题,我好像不太懂什么叫只下载不上传,是下载完成后不关闭客户端吗,持续多久才能不叫只下载不上传
--【拾】--:
扔在我的收藏夹里面吃灰吧
--【拾壹】--:
这个时候就要问候一下某些只下载不上传的专有软件和国内糟糕的互联网环境,QoS PCDN DPI…
--【拾贰】--:
这倒没有,qb之前设置了不大会用,现在用的是motrix,默认设置
那个分享率在哪看
--【拾叁】--:
感谢佬友的详细讲解~
--【拾肆】--:
学到一点
--【拾伍】--:
好文,mark了
--【拾陆】--:
感谢枫佬的文章
--【拾柒】--:
支持支持
--【拾捌】--:
看着满满干货,抽空会详细了解一番,确实不很清楚,感谢佬友
--【拾玖】--:
已收藏,感谢佬

