BT下载实现的关键算法和策略
流水线作业
网络协议一般都要求具有较高的传输效率,BT协议就是采用了流水线作业来提供传输效率的。
当客户端向peer发送数据请求时(即发送request消息),一次请求多个slice(即一个数据包发送多个request消息请
求多个slice)。假如客户端一次只发送一个slice请求,则peer给客户端发送完一个slice的数据后进入等待,等待客户
端发送新的
数据请求。如果一
次发送多个slice请求,则peer发送完一个slice后接着发送下一个slice,从而避免了等待
提高数据传输的效率。
HTTP协议的1.1版本就广泛地采用流水线作业的思想,大大提高了浏览器和Web服务器之间的
传输效率。
片断选择算法
片段选择有四大策略,良好的策略对于提高下载速度至关重要。
一、一旦向某个peer发送对某个piece中的slice的请求后,则该piece中的其他slice也从该peer处下载,这样可以
尽快地下载到一个完整的piece。因为某个peer拥有某个piece中的一个slice,则它必定拥有该piece的其他slice,并且
如果peer愿意发送一个slice给客户端,它也应该愿意发送piece中的其他slice给客户端。
二、最少优先。即某个piece在所有peer中拥有率最低,则优先下载该piece。此做法可以防止拥有此piece的
peer突然离开,导致某个piece的缺失,从而当前如何一个参与下载的peer都不能下载到一个完整的文件;如果下载了
某些拥有率较低的piece,则其他很多peer会向客户端请求数据,而要想从客户端下载到数据,那些peer就要提供数据
给客户端下载,这样对于提高客户端的下载速度也是有帮助的。对于这个共享系统而言,优先下载拥有率低的piece
可以使得整个系统提高每个piece的拥有读,整个系统会趋向与最优。如果所有peer优先下载拥有率较高的piece,则
piece拥有率更低,可能会导致很多peer得不到完整的文件。
三、随机选择第一个要下载的piece。开始下载时,不能采用最少优先策略。因为如果piece的拥有率很低,则
下载到这个piece就相对较难。如果随即选择一个piece,那么更容易下载到该piece,一旦客户端下载到一个完整
piece,就可以提供给其他peer下载,而由于客户端向其他peer上传数据,会倒在其他peer对客户端解除阻塞,从而
有利于在起始阶段获得较高的下载速度。当在下载到一些piece后,客户端 应采用最少优先策略来下载数据,这虽然
会导致客户端的下载速度在短期内有所下降,但随后下载速度会有较大提高。
四、最后阶段模式。有时,从一个传输速度很慢的peer处下载一个piece会花费很长时间,在下载的过程中不是
什么大问题,但在下载接近完成时,如果发生这种情况,会导致客户端迟迟不能下载完成。为了解决这个问题,在
最后阶段,客户端向所有peer发送对这个piece的某些slice请求,一旦收到某个peer发来的slice,则向其他peer发
送cancel消息,只从当前这个peer处下载。
阻塞算法
peer从它可以连接的peer下载文件,并根据对方提供的下载速度给予同等的上传回报,对于合作者,提供上传服
务,
对于不合作的,就
阻塞对方。阻塞是一种临时拒绝上传的策略,虽然上传停止了,但是下载仍然继续。在 解除
阻塞
时,连接并不需要重新建立。因为
阻塞过程中只是传输piece消息,其他消息,如have消息,intersted消息仍可以
传输。阻塞算法不是BT协议的一部分。
PS:建议阅读BT设计者所写的“BT性能卓越的原因”。