p2p技术吧 关注:13贴子:138
  • 3回复贴,共1

BitTorrent的P2P下载是怎么做到的?

只看楼主收藏回复


上图是我们常理解的P2P下载彼此传输数据的图,不过在这个过程中以下这两个问题是如何保证的呢?
1、 如何知道哪些Client在下载同一个文件?
2、 对某一个文件,如何做到同时从多个来源进行下载?
对于第一个问题的解决方案:
设计一个TrackerServer(跟踪服务器),每一个Client需要去这里上报自己正在下载的文件以及自己的ip地址和监听的端口。新来的Client先要连接到TrackerServer,根据要下载的文件查询当前正在下载这个文件的Clients (Peers)。
对于第二个问题的解决方法:
Client从TrackerServer获取Peers后,分别向他们发起连接并询问当前的下载进度,然后,同时连接多个Peers分别下载他们已完成的文件片段,最后拼接出完整的文件。
那么对于下载进度应该如何表达呢?
因为文件不是被顺序下载的(因为需要从Peers同时下载不同的片段),所以不可以通过当前已完成的字节数来表示进度。那么,最简单有效的方式就是把文件分割成相同大小的片段(Piece),片段的大小一般是2^n,比如2^18=256K,通过已完成Pieces的序号列表来表示当前的下载进度。
另外,因为Pieces序号是连续的,可以通过BitMap的方式表示每个Piece Index是否已完成。Piece Index所在的bit位为1,表示该Piece已经下载完成。
如果下载任务是一个文件夹(包含很多文件), 可以把这些文件按照固定的顺序连接起来(逻辑上)进行Pieces切分。
当Client获取到Peers的完成列表后,就可以将不同的Pieces分配到对应的Peers进行并行下载,同时将自己已完成的Pieces提供给其他Peers来下载。
互帮互助、互通有无的和谐社会就此开启了。
到目前为止,我们还有几个关键问题没有解决:
1、怎么找到待下载文件的TrackerServer?
2、Peers对文件分片的规则是否一致?
3、在TrackerServer上怎么wei一的标识一个下载任务?
4、下载来的Pieces是否在传输过程中出现了错误或者被恶意篡改?
为了解释上面的问题,此处应该有.torrent文件(BT种子)出场了。


1楼2018-11-28 16:31回复
    老铁,现在p2p只能搜索,不能下载了吗


    来自Android客户端2楼2018-11-28 23:36
    回复
      该楼层疑似违规已被系统折叠 查看此楼


      3楼2018-11-29 10:15
      回复


        IP属地:山东4楼2018-12-21 09:18
        回复