BT协议作为一种构建在TCP协议上的应用层协议,可以通过流水线作业来提高数据传输的效率。具体而言,当客户端向peer发送数据请求时(即发送request消息),一次请求多个slice(即在一个数据包中发送多个request消息请求多个slice)。假如客户端一次只发送一个slice请求,则peer给客户端发送完一个slice的数据后就进入等待,等待客户端发送新的数据请求。如果一次发送多个slice请求,则peer发送完一个slice后接着发送下一个slice,从而避免了等待,提高了数据传输的效率。事实上,HTTP协议的1.1版本就广泛地使用了流水线作业的思想,大大地提高了浏览器和Web服务器之间的传输效率。
2.片断选择算法
一个良好的片断选择策略对于提高下载速度至关重要,对于提高整个文件共享系统的性能也有重要影响。
片断选择的第一个策略是,一旦向某个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的拥有率进一步降低,而拥有这些低拥有率piece的peer一旦离开共享系统,则整个文件会越来越不完整,最后导致许多peer不能下载到一个完整的文件拷贝。
片断选择的第三个策略是,随机选择第一个要下载的piece。开始下载时,不能采用最少优先策略。原因在于,采用最少优先策略,如果某个piece的拥有率很低,那么下载到这个piece就相对较难。如果随机选择一个piece,那么更容易下载到该piece,一旦客户端下载到一个完整的piece,就可以提供给其他peer下载,而由于客户端向其他peer上传数据,会导致其他peer对客户端解除阻塞,从而有利于在起始阶段获得较高的下载速度。当然在下载到一些piece后,客户端应该采用最少优先策略来下载数据,这虽然会导致客户端的下载速度在短期内有所下降,但随后下载速度会有较大提高。
片断选择的第四个策略是,最后阶段模式。有时,从一个传输速度很慢的peer处下载一个piece会花费很长时间,在下载的过程中这不是什么大问题。但在下载接近完成时,如果发生这种情况,会导致客户端迟迟不能下载完成。为了解决这个问题,在最后阶段,客户端向所有peer发送对这个piece的某些slice的请求,一旦收到某个peer发来的slice,则向其他peer发送cancel消息,只从当前这个peer处下载。
3.阻塞算法
BT并不集中分配资源,每个peer有责任尽可能地提高自己的下载速度。peer从它可以连接的peer下载文件,并根据对方提供的下载速率给予同等的上传回报,对于合作者,提供上传服务,对于不合作的,就阻塞对方。阻塞是一种临时拒绝上传的策略,虽然上传停止了,但是下载仍然继续。在解除阻塞时,连接并不需要重新建立。因为阻塞过程中只是拒绝传输piece消息,其他消息,如have消息,interested消息仍可以传输。阻塞算法虽然不是BT协议一部分,但是它对提高性能是必要的。
每个客户端一直与固定数量的peer保持疏通(通常是4个),那么以什么方式来决定是否保持与某个peer疏通呢?通常的做法是,严格地根据当前的下载速度来决定哪些peer应该保持疏通。但计算当前下载速度是个大难题。当前的实现通常是计算最近10秒从每个peer处下载数据的速度。以10秒为间隔重新选择保持疏通(即解除阻塞)的peer,是为了避免频繁地阻塞和解阻塞,造成资源的浪费。实践表明,10秒足以使下载速度达到最大。
如果只是简单地为提供最高下载速率的4个peer提供上载服务,那么就没有办法发现那些空闲的连接是否有更好的下载速度。为了解决这个问题,在任何时候,每个peer都拥有一个称为“optimistic unchoking(优化非阻塞)”peer,这个连接总是保持疏通状态,而不管它的下载速率是多少。每隔30秒,重新选择一个peer作为优化非阻塞peer。30秒足以让该peer的上载能力达到最大。
一旦某个peer完成了下载,它不能再通过下载速率(因为下载速率已经为0了)来决定为哪些peer提供上载了。目前采用的解决办法是,优先选择那些从它这里得到更好下载速率的peer,保持与它们疏通。这样做的理由是尽可能的利用上载带宽。一旦某个peer完成了下载,那么它也就成为了种子。种子拥有一份完整的文件拷贝,并提供给其他peer下载。为了整个系统的性能,每个peer在完成下载后应该作为种子存在一段时间,作为对整个系统的回报。原始种子,即最初提供文件进行共享、并制作生成了种子文件,并把种子文件发布到Web服务器的种子,它至少应该存在到系统中生成另外一个种子时才能离开,否则当前参与下载的所有peer都不能获得一份完整的文件拷贝。
本节对BT协议的解释和分析参考了“BT协议规范”(Bittorrent Protocol Specification)和BT协议设计者所著的“BT性能卓越的原因”(Incentives Build Robustness in BitTorrent)一文。