用C语言开发一个BT下载软件(一) ------ BitTorrent协议 -1

  BitTorrent(简称BT)是一个文件分发协议,每个下载者在下载的同时不断地向其他下载者上传已下载的数据。它是属于一个应用层的协议。

  基于BT协议的文件分发系统由以下几个实体构成:

  1. 一个web服务器
  2. 一个种子文件
  3. 一个Tracker服务器
  4. 一个原始文件提供者
  5. 一个网络浏览器
  6.  若干个下载者

      web服务器上保存着种子文件。种子文件又称为元文件或metafile,它保存了被共享文件的一些信息,如文件名、大小、Tracker服务器地址,种子文件以.torrent为后缀。Tracker服务器保存着当前下载某共享文件的所有下载者的IP和端口。原始文件提供者提供完整的共享文件供其他下载者下载。种子文件就是提供者使用BT客户端生成的。每个下载者通过运行BT客户端软件下载共享文件。某个下载者本身称为客户端,其他下载者称为peer。

      下载过程:客户端首先解析种子文件,从中获取待下载的共享文件的一些信息,包括Tracker服务器地址。然后客户端连接Tracker获取当前下载该文件的所有下载者的IP和端口。之后客户端根据IP和端口连接其他下载者,从它们那里下载文件,同时把自己已下载的部分提供给其他下载者下载。

      共享文件在逻辑上被划分为大小相同的块,称为piece,每个piece通常为256KB。实际使用中,每个piece又被划分为大小相同的slice,每个slice固定为16KB。peer之间每次传输以slice为单位。种子文件中包含有每个piece的hash值。BT协议规定使用Sha1算法对每个piece生成20字节的hash值,作为每个piece的指纹。每当客户端下载完一个piece时,即对该piece使用Sha1算法计算其hash值,并与种子文件中保存的该piece的hash值进行比较,如果一致即表明下载了一个完整而正确的piece。一旦某个piece被下载,该piece即可提供给其他peer下载。

      待开发的BT客户端应包含以下功能:
  • 解析种子文件以获取待下载文件的信息
  • 连接Tracker服务器获取peer的IP和端口
  • 连接peer进行数据上传和下载
  • 对要发布的共享文件制作和生成种子文件
      种子文件和Tracker的返回信息都用一种简单而高效的编码方式进行编码,称为B编码。Tracker本身作为一个web服务器,客户端与Tracker交换信息基于HTTP协议。客户端与其他peer采用面向连接的可靠传输协议TCP进行通信。

B编码

      B编码有4种类型:字符串、整型、列表、字典。
      字符串的编码格式:<字符串的长度>:<字符串>,例如字符串spam,经过B编码后为:4:spam。
      整型的编码格式:i<十进制的整型数>e,例如整数3,-3和0的B编码分别为:i3e,i-3e,i0e。
      列表的编码格式:l<任何合法的类型>e,例如列表l4:spam4eggse表示两个字符串,一个是spam,一个是eggs。
      字典的编码格式:d<关键字><值>e,关键字是一个经过B编码的字符串,值可以是任何合法的B编码类型。d和e之间可以出现多个关键字和值对。例如d4:spaml3:aaa3:bbbee是一个字典,关键字是spam,值是一个列表,列表中有2个字符串aaa和bbb。

种子文件的结构

      种子文件就是一个B编码的字典。包含以下关键字。
关键字 含义
info 对应的值是一个字典,它有2种模式,“single file”和"multiple file",单文件模式是指待共享文件只有一个,多文件模式是待共享的文件不止1个。比如一部分电影分上下部2个文件。
announce 值为Tracker的URL
announce-list 可选,存放的是备用Tracker的URL


      info是最重要的关键字,它的值是一个字典,无论是单文件模式还是多文件模式,该字典都包含以下关键字:
关键字 含义
piece length 每个piece的长度,通常为i252144e,即256K
pieces 对应的值为一个字符串,它存放的是各个piece的hash值,该字符串的长度是20的倍数,因为每个piece的hash值的长度都是20字节

对于单文件模式,info的值还包括以下关键字:
  • name:共享文件的文件名
  • lengtth:共享文件的长度
对于多文件模式,info的值还包括以下关键词:
  • name:存放所有共享文件的文件夹名
  • files:它的值是一个列表,列表中包含多个字典,一个字典对应着一个共享的文件。此字典中又包含以下关键字
                    (1)path:共享文件的路径和文件名
                    (2)length:共享文件的长度

你可能感兴趣的:(C)