BitTorrent (协议)

733 阅读4分钟

###BitTorrent (协议) 普通的HTTP/FTP下载使用TCP/IP协议,BitTorrent协议是架构于TCP/IP协议之上的一个P2P文件传输通信协议,处于TCP/IP结构的应用层

种子文件 根据BitTorrent协议,文件发布者会根据要发布的文件生成提供一个.torrent文件,即种子文件,也简称为“种子”

扩展名一般为“.torrent”,包含Tracker信息和文件信息两部分。

Tracker信息主要是BT下载中需要用到的Tracker服务器的地址和针对Tracker服务器的设置。 文件信息是根据对目标文件的计算生成的。

下载者要下载文件内容,需要先得到相应的种子文件,然后使用BT客户端软件进行下载。

下载时,BT客户端首先解析种子文件得到Tracker地址,然后连接Tracker服务器。Tracker服务器回应下载者的请求,提供下载者其他下载者(包括发布者)的IP。下载者再连接其他下载者,根据种子文件,两者分别告知对方自己已经有的块,然后交换对方所没有的数据。此时不需要其他服务器参与,分散了单个线路上的数据流量,因此减轻了服务器负担。

下载者每得到一个块,需要算出下载块的Hash验证码与种子文件中的对比,如果一样则说明块正确,不一样则需要重新下载这个块。这种规定是为了解决下载内容准确性的问题。

一般的HTTP/FTP下载,发布文件仅在某个或某几个服务器,下载的人太多,服务器的带宽很易不胜负荷,变得很慢。而BitTorrent协议下载的特点是,下载的人越多,提供的带宽也越多,下载速度就越快。同时,拥有完整文件的用户也会越来越多,使文件的“寿命”不断延长

BitTorrent协议内的Bencode规则进行编码。它的主要原理是需要把提供下载的文件虚拟分成大小相等的块,块大小必须为2k的整数次方(由于是虚拟分块,硬盘上并不产生各个块文件),并把每个块的索引信息和Hash验证码写入种子文件中;所以,种子文件就是被下载文件的“索引”

  • announce:Tracker的主服务器
  • announce-list:Tracker服务器列表
  • comment:种子文件的注释
  • comment.utf-8:种子文件注释的utf-8编码
  • creation date:种子文件建立的时间,是从1970年1月1日-00:00:00到现在的秒数。
  • info - 该条映射到一个字典,该字典的键将取决于共享的一个或多个文件:
    • name - 建议保存到的文件和目录名称
    • piece length - 每个文件块的字节数。通常为 256KiB = 262144B
    • pieces 每个文件块的SHA-1的集成Hash。因为SHA-1会返回160-bit的Hash,所以pieces将会得到1个160-bit的整数倍的字符串。和一个length(相当于只有一个文件正在共享)或files(相当于当多个文件被共享)
    • length - 文件的大小(以字节为单位)
    • files - 一个字典的列表(每个字典对应一个文件)与以下的键:
      • path - 一个对应子目录名的字符串列表,最后一项是实际的文件名称
      • length - 文件的大小(以字节为单位)
   "announce": "udp://tracker.coppersurfer.tk:6969/announce",
   "announce-list": [
      [
         "udp://tracker.coppersurfer.tk:6969/announce"
      ],
      [
         "udp://9.rarbg.com:2710/announce"
      ],
      [
         "udp://p4p.arenabg.com:1337"
      ],
      [
         "udp://tracker.internetwarriors.net:1337"
      ],
      [
         "udp://tracker.opentrackr.org:1337/announce"
      ]
   ],
   "comment": "Torrent downloaded from https://yts.mx ( former yts.Lt/yts.am/yts.ag )",
   "created by": "YTS.AG",
   "creation date": 1598278426,
   "info": {
      "files": [
         {
            "length": 933321356,
            "path": [
               "The.Caller.1987.720p.BluRay.x264.AAC-[YTS.MX].mp4"
            ]
         },
         {
            "length": 53226,(字节)
            "path": [
               "www.YTS.MX.jpg"
            ]
         }
      ],
      "name": "The Caller (1987) [720p] [BluRay] [YTS.MX]",
      "piece length": 524288,
      "pieces": "<hex>A3 ...</hex>"
   }
}

BT中相关概念

  • Tracker:收集下载者信息的服务器,并将此信息提供给其他下载者,使下载者们相互连接起来,传输数据。
  • 种子:指一个下载任务中所有文件都被某下载者完整的下载,此时下载者成为一个种子。发布者本身发布的文件就是原始种子。
  • 做种:发布者提供下载任务的全部内容的行为;下载者下载完成后继续提供给他人下载的行为