BitTorrent是一种用于分发文件的协议。它通过URL标识内容,并且旨在与Web网络无缝集成。相对于简单的HTTP下载,它的优势在于当多个用户同时下载同一个文件时,这些用户之间可以互相上传文件块,多个用户共同参与文件传输,而非依赖于单一的文件服务器。使得文件源能够支持大量用户同时下载而只对其自身的负载产生较小的影响。
BitTorrent文件分发由以下实体组成:一个普通的Web服务器
一个静态的metainfo文件
一个BitTorrenttracker
一个原始下载器
网络浏览器
BT下载客户端
一个文件在最理想情况下能够被许多最终用户共享下载。
要开始服务,主机要执行以下步骤:启动一个tracker(或者已经运行一个)。
启动一个普通的Web服务器,比如Apache(或者已经有一个运行中)。
在他们的Web服务器上将扩展名.torrent与MIME类型application/x-bittorrent相关联(或者已经这样做了)。
使用要提供服务的完整文件和tracker的URL生成metainfo(.torrent)文件。
将metainfo文件放在Web服务器上。
从其他网页链接到metainfo(.torrent)文件。
启动一个已经拥有完整源文件的下载器。
要开始下载,用户执行以下操作:安装BitTorrent客户端。
上网冲浪。
打开.torrent文件的链接。
选择在本地保存文件的位置,或选择要继续的部分下载。
等待下载完成。
退出下载客户端(它会一直上传直到收到退出指令)。
Bencode编码Bencode编码用于将任意数据类型的值序列化(也称为“串行化”)为字节流,以便在网络上传输或存储在磁盘上。Bencode编码支持字符串、整数、列表和字典四种基本数据类型。
对于字符串类型,采用长度前缀加冒号的方式表示,例如”spam”会被编码为4:spam。
对于整数类型,以字符”i”开始,后面跟着十进制表示的整数和字符”e”,例如3被编码为i3e,-3被编码为i-3e。
对于列表类型,以字符”l”开始,后面跟着列表中各个元素的Bencode编码,最后以字符”e”结束,例如[‘spam’,‘eggs’]被编码为l4:spam4:eggse。
对于字典类型,以字符”d”开始,后面跟着按照key的ASCII码排序的键值对的B编码,最后以字符”e”结束,例如{‘cow’:‘moo’,‘spam’:‘eggs’}被编码为d3:cow3:moo4:spam4:eggse。需要注意的是,所有字典类型的键必须是字符串,并且按照原始字符串的排序方式进行排序。
Bencode编码提供了一种简单、紧凑、可读性较强的数据序列化方案,适用于各种数据类型的序列化和反序列化操作。
Metainfo文件MetaInfo文件(也称为.torrent文件)是使用bencoding编码的字典,包含以下键:
announceTracker的URL地址。info这个键映射到一个字典中,其中包含下面描述的键。在包含文本的.torrent文件中的所有字符串都必须使用UTF-8编码。
infodictionaryBitTorrent下载文件时所使用的元数据信息。它包含了多个键值对,其中每个键都代表了一个特定的属性,例如建议保存的文件名、文件块的大小和哈希值等。这些属性可以帮助客户端正确地下载并组装文件。
其中一些重要的属性包括:
name:建议保存的文件名,它纯粹是为了提供建议而不具有强制性。
piecelength:文件被分成固定大小的块,该属性指定每个块的大小(通常是2的幂次方)。
pieces:每个块对应的哈希值,用于验证文件的完整性。
length:文件长度(只适用于单个文件的情况),或者所有文件拼接后的总长度。
如果下载的是单个文件,则只需要使用name和length属性。如果是多个文件,则需要使用files列表来表示文件的目录结构,其中每个文件都由一个字典表示,包含length和path属性。
trackersTrackerGET请求包含以下关键字:
info_hash:元信息文件中info值的bencoded形式的20字节SHA1哈希值。该值几乎肯定需要进行转义。请注意,这是元信息文件的子字符串。info-hash必须是.torrent文件中编码形式的哈希值,这与对元信息文件进行bencoded解码、提取info字典并编码它完全相同,如果bencoded编码完全验证了输入(例如,键排序、前导零的缺失),则必须这样做。反之,这意味着客户端必须拒绝无效的元信息文件或直接提取子字符串。不能对无效数据执行解码-编码往返。
peer_id:长度为20的字符串,用作此下载器的ID。每个下载器在开始新下载时都会随机生成自己的ID。该值也几乎肯定需要进行转义。
ip:可选参数,指定此对等方所在的IP地址(或DNS名称)。通常用于源地址,如果源位于与跟踪器相同的计算机上,则使用此参数。
port:此对等方正在侦听的端口号。常见行为是让下载器尝试侦听端口,并在该端口被占用时尝试、等端口号,并在后放弃。
uploaded:到目前为止已上传的总量,以十进制ASCII编码。
downloaded:到目前为止已下载的总量,以十进制ASCII编码。
left:此对等方仍需下载的字节数,以十进制ASCII编码。请注意,这不能从downloaded和文件长度计算出来,因为它可能是恢复下载,并且有可能一些已下载的数据未通过完整性检查而需要重新下载。
event:这是一个可选关键字,映射到started、