用C语言开发一个BT下载软件 (二) ------ 算法和策略
2017-12-24 05:27
507 查看
流水线作业
当客户端向peer发送数据请求时(即发送request消息),一次请求多个slice(即在一个数据包中发送多个request消息请求多个slice)。peer发送完一个slice后接着发送下一个slice,从而避免了等待,提高了数据传输的效率。
片断(piece)选择算法
一旦向某个peer发送对某个piece中的slice请求后,则该piece中的其他slice也从该peer处下载,这样可以尽快地下载到一个完整的piece。
“最少优先”:即某个piece在所有peer中的拥有率最低,则优先下载该piece。
随机选择第一个要下载的piece。刚开始下载时,不能采用最少优先策略。因为某个piece拥有率很低,下载到这个piece难度较大。随机选择一个piece,更容易下载到该piece。一旦客户端下载到一个完整的piece,就可以提供给其他peer下载,而由于客户端向其他peer上传数据,会导致其他peer对客户端解除阻塞,有利于在起始阶段获得较高的下载速度。在下载到一些piece后,客户端应该采用最少优先策略。
最后阶段模式:在最后阶段,客户端向所有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在完成下载后应该作为种子存在一段时间,作为对整个系统的回报。
当客户端向peer发送数据请求时(即发送request消息),一次请求多个slice(即在一个数据包中发送多个request消息请求多个slice)。peer发送完一个slice后接着发送下一个slice,从而避免了等待,提高了数据传输的效率。
片断(piece)选择算法
一旦向某个peer发送对某个piece中的slice请求后,则该piece中的其他slice也从该peer处下载,这样可以尽快地下载到一个完整的piece。
“最少优先”:即某个piece在所有peer中的拥有率最低,则优先下载该piece。
随机选择第一个要下载的piece。刚开始下载时,不能采用最少优先策略。因为某个piece拥有率很低,下载到这个piece难度较大。随机选择一个piece,更容易下载到该piece。一旦客户端下载到一个完整的piece,就可以提供给其他peer下载,而由于客户端向其他peer上传数据,会导致其他peer对客户端解除阻塞,有利于在起始阶段获得较高的下载速度。在下载到一些piece后,客户端应该采用最少优先策略。
最后阶段模式:在最后阶段,客户端向所有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下载软件 (四) ------ 代码实现-2-位图管理模块的代码实现
- 用C语言开发一个BT下载软件(一) ------ BitTorrent协议 -2
- 用C语言开发一个BT下载软件 (三) ------ 系统结构设计
- 用C语言开发一个BT下载软件 (四) ------ 代码实现-4-信号处理模块
- 用C语言开发一个BT下载软件 (四) ------ 代码实现-3-出错处理模块和运行日志模块
- 用C语言开发一个BT下载软件 (四) ------ 代码实现-5-Peer管理模块
- 用C语言开发一个BT下载软件(一) ------ BitTorrent协议 -1
- 用C语言开发一个BT下载软件 (四) ------ 代码实现-1-种子文件解析模块
- linux c 编程开发BT下载软件
- 推荐一个金融软件开发的文档下载站
- 下载了一个用IBM Rational软件开发平台进行SOA开发的实践指南
- BT下载软件开发笔记——种子解析模块的设计与实现
- 综合图形学算法及OpenGL技术开发一个小型图形软件系统
- Linux平台下基于BitTorrent应用层协议的下载软件开发--策略管理模块(policy.c)
- Linux平台下基于BitTorrent应用层协议的下载软件开发--出错处理模块(bterror.c)
- Linux平台下基于BitTorrent应用层协议的下载软件开发--策略管理模块(policy.h)
- Linux平台下基于BitTorrent应用层协议的下载软件开发--出错处理模块(bterror.h)
- linux c编程.做一个BT下载软件
- Asp.net 2.0 自定义控件开发[开发一个图表(WebChart)控件(柱状图示例)](示例代码下载)
- Asp.net 2.0 自定义控件开发[开发一个图表(WebChart)控件(柱状图示例)](示例代码下载)