注:参考了btsource、jbittorrent实现和utorrent机制

一、做种

现在很多BT软件都提供了做种功能,在做种时,我们都必须指定tracker服务器地址,如果该地址无效,则做出来的种子对BT协议来说是没有任何实际意义的。

二、bt tracker服务

对于纯BT协议来说,每个BT网络中至少要有一台Tracker服务器(追踪服务器),tracker主要基本工作有以下几个方面:

  • 记录种子信息(torrent文件信息)
  • 记录节点信息
  • 计算并返回节点列表给BT客户端

每次我们利用BT软件做完种子后,总要找个论坛之类的来上传自己的种子,这样别人就可以下载到这个种子。为什么要上传种子呢?原因:

  • 上传种子,其实就是把种子信息记录到tracker服务器上
  • 种子可以在论坛传播,种子的扩展程度就决定了种子的健康度和下载度

当其他用户用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服务器会记录相关信息,并对该用户的下载及社区活动进行相关限制。

测试,勿点

BtTracker原理相关推荐

  1. UUID的使用及其原理

    今天敲项目要用UUID,想起之前老师告诉UUID的使用,但没说具体的生成逻辑,于是我进行了百度 首先,UUID的使用: //生成随机的UUID String uuid = UUID.randomUUI ...

  2. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理

    1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...

  3. git原理及常见使用方法

    Git 原理入门-来自阮一峰 Git 是最流行的版本管理工具,也是程序员的必备技能之一. 即使天天使用它,很多人也未必了解它的原理.Git 为什么可以管理版本?git add.git commit这些 ...

  4. 微机原理—定时计数控制接口

    别看题目很高深,其实就是很简单的定时器和计数器而已. 通常用手机定个闹钟,就是定时器的使用. 工厂里通过传送带上安装传感器,传感器传输给计算机的信号用来计数. 这是一些很简单的应用,通过很小的一个芯片 ...

  5. 三层交换机原理:01路由器如何隔离广播域?

    前言: 当网络规模较大的时候,需要设备来隔离广播域,防止网络中因产生广播风暴而导致网络效率降低,而二层交换机不能隔离广播域,所以需要三层路由器设备来隔离广播域! 但三层路由器为什么能够隔离广播域,是如 ...

  6. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  7. BiLSTM-CRF学习笔记(原理和理解) 维特比

    https://www.zhihu.com/question/20136144 维特比详解 BiLSTM-CRF 被提出用于NER或者词性标注,效果比单纯的CRF或者lstm或者bilstm效果都要好 ...

  8. 【Learning Notes】线性链条件随机场(CRF)原理及实现

    1. 概述 条件随机场(Conditional Random Field, CRF)是概率图模型(Probabilistic Graphical Model)与区分性分类( Discriminativ ...

  9. Jieba分词原理与解析

    1 HMM模型 马尔科夫过程: 以天气判断为例:引出隐马尔科夫模型 于是我们可以将这种类型的过程建模为有一个隐藏的马尔科夫过程和一个与这个隐藏马尔科夫过程概率相关的并且可以观察到的状态集合.这就是本文 ...

  10. 自然语言处理课程(二):Jieba分词的原理及实例操作

    上节课,我们学习了自然语言处理课程(一):自然语言处理在网文改编市场的应用,了解了相关的基础理论.接下来,我们将要了解一些具体的.可操作的技术方法. 作为小说爱好者的你,是否有设想过通过一些计算机工具 ...

最新文章

  1. 如何让网页不受电信114劫持
  2. runnable和handler联合实现计时循环
  3. arguments.length
  4. 记录,再次运行vue项目报错POST http://127.0.0.1:8888/api/private/v1/login/login
  5. 《Sibelius 脚本程序设计》连载(五) - 1.2 编辑第一个插件
  6. 华为鸿蒙系统还没发布吗,华为没有孤军奋战,合作伙伴“雪中送炭”,鸿蒙系统正式发布!...
  7. Easyui validatebox修改——1.当text发生变化时在校验,2.取消校验,3扩展自定义验证
  8. 左手手机右手智慧屏 华为9月要搞大事情
  9. TensorFlow tf.keras.layers.RNN
  10. java swing 等待框_java – 让用户使用Swing等待
  11. 七嘴八舌Google
  12. 经典算法(1)- 求1到N的质数
  13. php面试题2--php面试题系列
  14. Linux 软件包安装
  15. win11找不到恢复环境怎么恢复出厂设置
  16. 学习做视频剪辑,几分钟教会你剪辑技巧
  17. 简单实用的基于python的OCR中文字符识别——基于windows平台(附代码)
  18. 2020年度“全球酒店集团225强”排名公布,首旅如家再进榜单前十
  19. 【电子器件笔记7】MOS管参数和选型
  20. 安卓毕业设计app项目基于Uniapp+SSM实现的安卓的掌上校园系统食堂缴费图书馆预约

热门文章

  1. Opencv基础------RGB颜色通道的分量显示和调整
  2. Ubuntu配置locale
  3. bochs在安卓上模拟kali linux系统
  4. python 包络线_Matlab 如何绘制复杂曲线的包络线
  5. 阿里云与线下IDC对接IPsec虚拟专用网络
  6. RFT学习--适用范围
  7. 赛后题解——真假亚瑟王(数论)
  8. win10解决安装.NET Framework 3.5安装不上,错误代码:0x800F081F,解决办法:超级管用。
  9. 轻量级微信小说小程序源码+UI不错/很火的
  10. Android push到/system/app下,导致找不到so文件,抛出java.lang.UnsatisfiedLinkError的原因分析和解决方案