注:参考了btsource、jbittorrent实现和utorrent机制
一、做种
现在很多BT软件都提供了做种功能,在做种时,我们都必须指定tracker服务器地址,如果该地址无效,则做出来的种子对BT协议来说是没有任何实际意义的。
二、bt tracker服务
对于纯BT协议来说,每个BT网络中至少要有一台Tracker服务器(追踪服务器),tracker主要基本工作有以下几个方面:
每次我们利用BT软件做完种子后,总要找个论坛之类的来上传自己的种子,这样别人就可以下载到这个种子。为什么要上传种子呢?原因:
当其他用户用BT软件打开种子后,BT软件会对种子进行解析(BDecode),主要得到种子的相关信息,包括:文件名、文件大小、tracker地址等。然后BT软件会向tracker地址发送请求报文,开始进行下载。BT向tracker发送的是Get请求,请求的内容主要有以下几个方面:
info_hash |
必填 |
种子文件info字段的SHA1值(20字节) |
peer_id |
必填 |
节点标识,由BT客户端每次启动时随机生成 |
port |
必填 |
节点端口,主要用于跟其他节点交互 |
uploaded |
必填 |
总共上传的字节数,初始值为0 |
downloaded |
必填 |
总共下载的字节数,初始值为0 |
left |
必填 |
文件剩余的待下载字节数 |
numwant |
必填 |
BT客户端期望得到的节点数 |
ip |
选填 |
BT客户端IP,选填的原因是Tracker可以得到请求的IP地址,不需要客户端直接上传 |
event |
选填 |
started/stopped/completed/空。当BT客户端开始种子下载时,第一个发起的请求为started, 在下载过程中,该值一直为空,直到下载完成后才发起completed请求。做种过程中,发送 的event也为空。如果BT客户端停止做种或退出程序,则会发起stopped请求。 |
tracker收到该请求后主要进行以下几步处理:
1. 根据info_hash查找种子信息,如果tracker没有该种子的任何信息,tracker服务器可以返回错误或返回0个种子数
2. 如果tracker找到了种子信息,接下来就会去查找是否数据库中已存在该peer_id的节点。接下来根据event的值进行相关处理。
3. 如果event是stopped,说明该节点已不可用,系统会删除tracker上关于该节点的记录信息。
4. 如果event是completed,说明种子节点+1,非种子-1。
5. 如果event是started,说明这是种子第一次连接tracker,tracker需要记录该节点信息,此外如果left=0,说明这是一个种子节点。
6. 如果event是空,则说明节点正在下载或上传,需要更新tracker服务器上该节点的信息。
7. 最后tracker从本地挑选出numwant个节点信息返回给BT客户端,实际返回的节点数不一定就是numwant,tracker只是尽量达到这个数量。
Tracker响应
Tracker正常返回的信息结构主要是:
interval |
必填 |
请求间隔(秒) |
|
complete |
选填 |
种子节点数 |
|
Incomplete |
选填 |
非种子节点数 |
|
peers |
ip |
必填 |
IP地址 |
peer_id |
选填 |
节点标识 |
|
port |
必填 |
端口 |
如果Tracker检查发现异常,可以返回错误信息:
failure reason |
错误原因 |
Tracker如何挑选种子节点并返回给客户端?
最普遍也是最简单的方式,那就是随机返回,tbsource采用的就是随机返回的机制。不少研究论文也提出了相关的算法,如IP地址策略和阶段返回策略。
IP地址策略是指根据IP地址所含拓扑信息来判断两个节点的距离,从而返回距离请求节点较近的节点列表。该方法主要适用于IPV6。
阶段返回策略,根据节点的下载进度,返回下载进度相近的节点列表。
个人观点:无论tracker采用什么算法,对BT客户端来说,能够提高的下载效率都是很有限的,采用“高级”的算法有时反而会增加tracker的负载。因此随机返回还算是比较高效的。
Bt协议中,有两个策略可以用来提高整个BT网络的健壮性和下载速度,它们分别是:最少片段优先策略(BT客户端处理)和最后阶段模式。为了响应“最后阶段模式”,当种子节点的下载进度大于80%(个人指定)时,tracker服务器应该尽量返回种子节点给客户端,帮助客户端尽快完成下载,使其成为种子节点。
三、private tracker原理
Privatetracker简称PT,目前主要应用于高清视频下载。其实PT就是“我为人人,人人为我”这个目标的最佳实践者。在实际的BT下载过程中,用户通过种子下载完文件后,出于“自私”的考虑(怕占用自己带宽),往往会退出做种,从而降低种子的热度。这就是为什么一个种子过了一段时间后,往往下载速度很慢或下载不完。
为了真正地实现BT理念,PT强制每个下载者必须上传一定量数据后,才能进行下载。如何保证这种行为呢?
现在的PT一般存在于网络社区中,每个注册网络社区的用户都会分配到一个随机的KEY,任何从社区下载的种子,都会包含用户的KEY。每次用户通过种子下载时,都会连接到社区的tracker服务器上,tracker服务器会检查KEY对应用户的上传下载量,如果上传量不满足标准,则tracker服务器会记录相关信息,并对该用户的下载及社区活动进行相关限制。
测试,勿点