P2P 与 BitTorrent

P2P 是一种体系结构,就好像 C/S 体系结构一样,但不同的是,P2P 对总是打开的基础设施服务器有最小的(或者没有)依赖,成对间歇连接的主机(称为对等方)彼此直接通信。

基于 P2P 这种体系结构产生了许多应用,譬如文件分发应用分布式散列表(DHT),而文件分发应用中一个典型的例子就是 BitTorrent 协议。

如果要类比 P2P 与 BitTorrent 之间的关系,就好像 C/S 体系结构与 FTP 协议之间的关系。

P2P 与 C/S

以文件分发应用为例,在 C/S 文件分发中,该服务器必须向每个对等方发送该文件的一个副本,即服务器承受了极大的负担,并且消耗了大量的服务器带宽。在 P2P 文件分发中,每个对等方能够向任何其他对等方重新分发它已经收到的该文件的任何部分,从而在分发过程中协助该服务器。

对于 C/S 体系结构,随着对等方数量的增加,分发时间呈线性增长并且没有界。然而,对于 P2P 体系结构,最小分发时间不仅总是小于 C/S 体系结构的分发时间,并且对于任意的对等方数量,总是小于一对一的 C/S 体系结构的分发时间。因此,具有 P2P 体系结构的应用程序能够是自扩展的。这种扩展性的直接成因是:对等方除了是比特的消费者外还是它们的重新分发者

BitTorrent

如前所述,BitTorrent 是最为流行的 P2P 文件分发协议,通常也简称为 BT,最初由 Bram Cohen 所研发。

用 BitTorrent 的术语来讲,参与一个特定文件分发的所有对等方的集合被称为一个洪流(torrent)。在一个洪流中的对等方彼此下载等长度的文件块(chunk),典型的块长度为 256 KB。当一个对等方首次加入一个洪流时,它没有块。随着时间的流逝,它累积了越来越多的块。当它下载块时,也为其他对等方上载了多个块。一旦某对等方获得了整个文件,它也许(自私地)离开洪流,或(大公无私地)留在该洪流中并继续向其他对等方上载块。同时,任何对等方可能在任何时候仅具有块的子集就离开该洪流,并在以后重新加入该洪流中。

每个洪流具有一个基础设施节点,称为 tracker(追踪器)。当一个对等方加入某洪流时,它向 tracker 注册自己,并周期性地通知 tracker 它仍在该洪流中。以这种方式,tracker 跟踪参与在洪流中的对等方。

当一个新的对等方 A 加入该洪流时,tracker 随机地从参与对等方的集合中选择对等方的一个子集,将这个子集中每个对等方的 IP 地址发送给 A。A 持有对等方的这张列表,试图与该列表上的所有对等方创建并行的 TCP 连接。我们称所有这样与 A 成功地创建一个 TCP 连接的对等方为邻近对等方。一个对等方的临近对等方将随时间而波动。

在任何给定的时刻,A 将具有块的子集并知道它的邻居具有哪些块。利用这些信息,A 将做出两个重要决定:

  • 它应当从它的邻居请求哪些块呢?
  • 它应当向哪些向它请求块的邻居发送块?

在决定请求哪些块的过程中,A 使用一种称为最稀缺优先(rarest first)的技术。这种技术的思路时,针对它没有的块在它的邻居中决定最稀缺的块(最稀缺的块就是那些在它的邻居中副本数量最少的块),并首先请求那些最稀缺的块。这样,最稀缺块得到更为迅速的重新发放,其目标是(大致地)均衡每个块在洪流中的副本数量。

为了决定它响应哪个请求,BitTorrent 使用了一种被称为一报还一报(tit-for-tat)的交换激励机制。其基本想法是,A 根据当前能够以 最高速率 向它提供数据的邻居,给出其优先权。特别是,A 对于它的每个邻居都持续地测量接收到比特的速率,并确定以最高速率流入的 4 个邻居。每过 10 秒,它重新计算该速率并可能修改这 4 个对等方的集合。用 BitTorrent 术语来说,这 4 个对等方被称为疏通(unchoked)。重要的是,每过 30 秒,它也要随机地选择另外一个邻居并向其发送块。我们将这个被随机选择的对等方称为 B。现在站在 B 的角度上看,因为 A 正在向 B 发送数据,它可能成为 B 前 4 位上载者之一,这样的话 B 将开始向 A 发送数据。如果 B 向 A 发送数据的速率足够高,B 接下来也能成为 A 的前 4 位上载者。换言之,每过 30 秒 A 将随机地选择一名新的对换伴侣并开始与那位伴侣进行对换。如果这两名对等方都满足此对换,它们将对方放入其前 4 位列表中并继续与对方进行对换,直到该对等方之一发现了一个更好的伴侣为止。这种效果是对等方能够以趋向于找到彼此的协调的速率上载。随机选择邻居也允许新的对等方得到块,因此它们能够具有对换的东西。除了这 5 个对等方( 4 个对等方和一个试探的对等方)的所有其他相邻对等方均被 阻塞,即它们不能从 A 接收到任何块。

BitTorrent 客户端

就如同 FTP 协议有众多的 FTP 客户端一样,BitTorrent 协议也有众多的 BitTorrent 客户端。最早的 BitTorrent 客户端应该是由 BitTorrent 发明人 Bram Cohen 开发的,很巧,软件的名字也叫 BitTorrent,现在已经成长为一家公司,也收购了著名的开源 BitTorrent 客户端 µTorrent

出于种种原因,现在并不推荐使用以上两款软件,BitTorrent 发明人 Bram Cohen 也已经离开了那家公司,更推荐使用开源跨平台的 qBittorrent

其他

如前所述,tracker 服务器是一个 BitTorrent 网络的重点,大部分客户端都支持自定义 tracker 列表,GitHub 上就有一些精选的 tracker 列表:

为了降低对 tracker 服务器的依赖,BitTorrent 中也使用到了前面提到的分布式散列表(DHT)。