流水线作业

当客户端向peer发送数据请求时(即发送request消息),一次请求多个slice(即在一个数据包中发送多个request消息请求多个slice)。peer发送完一个slice后接着发送下一个slice,从而避免了等待,提高了数据传输的效率。

片断(piece)选择算法

  1. 一旦向某个peer发送对某个piece中的slice请求后,则该piece中的其他slice也从该peer处下载,这样可以尽快地下载到一个完整的piece。
  2. “最少优先”:即某个piece在所有peer中的拥有率最低,则优先下载该piece。
  3. 随机选择第一个要下载的piece。刚开始下载时,不能采用最少优先策略。因为某个piece拥有率很低,下载到这个piece难度较大。随机选择一个piece,更容易下载到该piece。一旦客户端下载到一个完整的piece,就可以提供给其他peer下载,而由于客户端向其他peer上传数据,会导致其他peer对客户端解除阻塞,有利于在起始阶段获得较高的下载速度。在下载到一些piece后,客户端应该采用最少优先策略。
  4. 最后阶段模式:在最后阶段,客户端向所有peer发送对这个piece的某些slice请求,一旦收到某个peer发来的slice,则向其他peer发送cancel消息。


阻塞算法

peer从它可以连接的peer下载文件,并根据对方提供的下载速率给予同等的上传回报,对于合作者,提供上传服务,对于不合作的,就阻塞对方。阻塞是一种临时拒绝上传的策略,在解除阻塞时,连接并不需要重新建立,因为阻塞过程中只是拒绝传输piece消息,其他消息,比如have消息,interested消息仍可以传输。

每个客户端一直与固定数量的peer保持疏通(通常是4个)。那么以什么方式来决定是否保持与某个peer疏通呢?通常是根据当前下载的速度来决定哪些peer应该保持疏通,计算最近10秒从每个peer处下载数据的速度。以10秒为间隔重新选择保持疏通(即解除阻塞)的peer,是为了避免频繁地阻塞和解除阻塞,造成资源的浪费。

如果只是简单地为提供最高下载速率的4个peer提供上载服务,那么就没办法发现那些空闲的连接是否有更好的下载速度。为了解决这个问题,在任何时候,每个peer都保持一个称为“optimistic unchoking peer”(优化非阻塞),让这个连接总是保持疏通状态,而不管它的下载速率是多少。每隔30秒,重新选择一个peer作为优化非阻塞peer。引入“优化非阻塞”的peer后,可能有2种结果:其一,新引入的peer速度很慢,比先前保持疏通的4个peer中最慢的速度还要慢,那么30秒后,当重新选择优化非阻塞peer时,速度最慢的新引入peer自动会被淘汰;其二,新引入的peer速度比先前保持疏通的4个peer中最慢的速度要快,那么30秒后重新决定时,速度最慢的先前4个peer中的那个会被淘汰,新引入的peer进入保持疏通的名单之列。通过这种“竞争上岗”的方式,可以保证尽可能让速度最快的peer得到下载机会。

一旦某个peer完成了下载,它就不能再通过下载速率(因为下载速率全部为0了)来决定为哪些peer提供上载了。解决办法是:优先选择那些从它这里得到更好下载速率的peer保持疏通,这样可以尽可能地利用上载带宽。一旦某个peer完成了下载,那么它就称为了种子,拥有了一份完整的文件拷贝。为了整个系统的性能,每个peer在完成下载后应该作为种子存在一段时间,作为对整个系统的回报。

用C语言开发一个BT下载软件 (二) ------ 算法和策略相关推荐

  1. c语言bt下载程序,用C语言开发一个BT下载软件(一) ------ BitTorrent协议 -1

    BitTorrent(简称BT)是一个文件分发协议,每个下载者在下载的同时不断地向其他下载者上传已下载的数据.它是属于一个应用层的协议. 基于BT协议的文件分发系统由以下几个实体构成: 一个web服务 ...

  2. 用C语言开发一个BT下载软件(一) ------ BitTorrent协议 -1

    BitTorrent(简称BT)是一个文件分发协议,每个下载者在下载的同时不断地向其他下载者上传已下载的数据.它是属于一个应用层的协议. 基于BT协议的文件分发系统由以下几个实体构成: 一个web服务 ...

  3. 用C语言开发一个BT下载软件 (三) ------ 系统结构设计

    整个系统各个模块功能如下图所示: 种子解析:负责解析种子文件,从中获取Tracker服务器的地址,待下载文件的文件名和长度,piece长度,各个piece的hash值. 连接Tracker:根据HTT ...

  4. 鸿蒙系统开发实战-开发一个聊天技巧软件堪称聊天神器

    鸿蒙开发实战-开发一个聊天助手APP 鸿蒙系统开发实战-开发一个聊天技巧软件堪称聊天神器.目前鸿蒙系统可真是过了一把自主研发的瘾,通过一个鸿蒙程序开发实战教程来演示如何开发一款聊天神器,视频教程放在了 ...

  5. linux 安装bt下载软件,centos6.3安装linux下的BT软件qbittorrent的方法

    原创内容,转载请注明出处:https://www.myzhenai.com/thread-15430-1-1.html https://www.myzhenai.com.cn/post/942.htm ...

  6. 基于易语言开发的小说下载工具

    基于易语言开发的小说下载工具 这次的编程,是为了交作业,嘻嘻 老规矩,上个图 ***让我女朋友露个脸,哈哈哈哈哈*** 起因:看到论坛里面,没什么用易语言下载小说的软件,是易语言不好用吗?还是Pyth ...

  7. 用Go语言开发一个编程语言

    用Go语言开发一个编程语言 最近小弟业余时间闲来无事,所以就尝试一下自己开发一个轻量级的解释型语言. 出于学习的目的,我目前已经利用业余时间开发了一个多月,目前实现了变量声明,内置函数调用.自定义函数 ...

  8. vc6开发一个抓包软件_开发一个软件多少钱?3种软件开发公司报价

    开发一个软件多少钱?现在随着智能手机的发展,各种各样的app大受市场欢迎,同时也方便了大家日常生活,开发一个自己的app软件成为不少传统企业及创业者的首选.但是如何选择靠谱的开发公司呢?同样的app开 ...

  9. vc6开发一个抓包软件_开发一个软件多少钱?传统app开发与0代码app制作方法对比...

    开发一个软件多少钱?app开发难吗?app制作需要哪些流程? app开发很难:按照传统的开发方式需要最少5名以上的技术人员,团队配合花费3个月左右的时间才能搞定,成本20万以上. app开发也很简单: ...

最新文章

  1. Log4net之配置文件
  2. linux命令应用之一
  3. 老王亲述:我的运维心路历程
  4. C#字符串中特殊字符的转义
  5. 锋利的JQuery学习笔记01
  6. IO、NIO、AIO 内部原理分析
  7. JavaFX技巧20:有很多需要展示的地方吗? 使用画布!
  8. 蓝桥杯“基础练习:查找整数
  9. 用python分析拼多多_利用Python分析拼多多上卖的最热的产品, 结果出乎大多数人意料!...
  10. docker安装部署和常用命令
  11. 大数据调度工具之Oozie
  12. python3 shell,python3执行shell命令
  13. WIN10 安装Eplan 2.7 没有可激活合适的加密狗 的异常解决办法
  14. plc单片机组态软件php_学习plc单片机组态软件,嵌入式的一些心得
  15. matlab二维傅里叶变换ffshift,形象理解二维傅里叶变换
  16. 行为树 中断的理解
  17. 搬运: CVonline: 图像数据库(一) (更新于20190821)
  18. 第一个用python实现的数据化运营分析实例——销售预测
  19. 字号与磅值的对应关系
  20. 关于hibernate的见解

热门文章

  1. SQL Server中SQL是什么?
  2. UDC的Server
  3. 信用卡通过消费日期计算还款日
  4. 华为mate30手机来微信没有提示灯,指示灯不闪烁怎么办?
  5. Nginx源码分析之 HTTP2
  6. 用laravel 搭一套AI chatgpt 写作助手和内容创作 saas 系统
  7. 目标检测 Faster R-CNN运行及实时性DEMO测试
  8. JAVA静态字段用法_如何使用javaassist 访问 静态字段及修改方法中的某一句话
  9. 交流信号采集电路设计(超详细分析)
  10. 蜘蛛牌窗口-游戏规则和说明