种子
在 BitTorrent 网络中,种子是一个包含了文件信息和 Tracker 信息的文件,它是一个元数据文件,包含了文件的名称、大小、文件夹结构、文件的哈希值、tracker 地址等信息。种子文件的后缀名通常是 .torrent
。
根据 BitTorrent 协议,文件的发布者会根据本地文件生成一个 .torrent 文件,这个文件就被称为种子文件。之后的文章会介绍如何生成种子文件。
种子文件本质上是一个文本文件,包含部分信息
- Tracker 服务器的地址
- 文件的信息,包括文件的哈希值、文件的名称、文件的大小等。
种子文件是一个元数据文件,包含了文件的元数据信息,但不包含文件的实际内容。
文件的信息是根据目标文件计算生成,计算的方法在 BitTorrent 协议中定义,采用 Bencode 规则进行编码。
主要原理就是把文件分成一定大小的块,块大小是 2k 的整数次方,然后将每个块的索引信息和 Hash 验证写入到种子文件。种子文件某种意义上来说也可以被认为是一个索引文件。
在本站 发布的资源。每个用户都会下载包含特定信息的种子文件以便 tracker 服务器记录用户的流量情况。
当发布者制作好 torrent,并且上传到 Private Tracker 上之后,下载者需要首先得到种子文件,然后使用响应的 PT 客户端 进行下载,下载的时候,PT(BT) 客户端首先解析种子文件得到 Tracker 地址,然后根据种子文件中的 passkey 验证并连接 Tracker 服务器,然后 Tracker 服务器会返回一个 Peer 列表,下载者就可以根据 Peer 列表进行连接,然后根据种子文件,获知连接的 Peer 自己有哪些块,然后进行下载,下载完成之后,下载者会变成 Seeder,也就是上传者,然后其他下载者就可以从这个 Seeder 那里下载。
所以这也就是为什么说 BitTorrent 是对等网络,通过 Tracker 服务器获取了 Peer 列表之后,下载者和上传者之间是直接连接的,而不是通过 Tracker 服务器进行数据传输,Tracker 服务器只是用来存储用户信息,上传下载量等,并用于点对点传输时的数据交换中心。
下载者每下载一块,需要算出下载块的 Hash 验证并与种子文件中的内容进行对比,如果一致,则表示下载的块正确,不一样则需要重新下载块。
在一般的 HTTP 或者 FTP 下载时,因为是中心化的协议,所以通常文件仅仅发布在某个或几个服务器中,下载的人越多,服务器的带宽压力就越大,下载的速度就越慢,而 BitTorrent 协议是分布式的,每个下载者都是上传者,所以下载者越多,提供的带宽也越多,下载速度就越快,这也是 BitTorrent 协议的优势之一。