总览
规范节点优先级(Canonical Peer Priority)的目的是解决 BitTorrent 的两个问题:
- 在一个 swarm 中,如果大多数节点总是保持完全连接,并且没有可用的空余连接来接受新进连接,则加入这样的 swarm 可能会很困难。当某个节点由于某种原因断开连接时,其他节点通常会立即尝试建立新的出站连接,以达到连接上限,使其与其他节点保持连接。但是,由于已经存在的节点和它们要建立的出站连接总数已经达到上限,因此新的入站连接将被拒绝,这导致加入 swarm 门槛变得更高。换言之,一个网络中的节点数量和连接状态对新节点加入的影响,节点连接数量越多,意味着新的节点加入需要面对的门槛就越高。同时,节点间连接状态的变化也会影响其他节点的连接行为,可能会导致新的连接被拒绝。
- 攻击者可以通过不断地向一个 BitTorrent swarm 发送连接请求,以填满所有可用空余连接并防止其他节点建立连接,从而对该网络发起分布式拒绝服务(DDoS)攻击。这样一来,合法的节点将无法连接到其他节点,从而导致网络变得无法使用或明显变慢。
为了解决 P2P 中可能出现的分布式拒绝服务攻击(DDoS),需要制定一个公式,让所有节点都同意优先考虑某些 IP 地址的节点。只要这个公式被正确定义,并且大多数节点都同意,所有节点都可以平等地加入 P2P 网络,这个公式可以帮助保护 P2P 网络免受 DDoS 攻击的影响。
概述
用于确定节点优先级的公式如下:
priority = crc32-c(sort(masked_client_ip, masked_peer_ip))这是一个计算优先级(priority)的公式,其中使用了 CRC32 算法和排序函数。 具体来说,该公式需要输入两个参数:masked_client_ip 和 masked_peer_ip。这些参数可能是 IP 地址或类似标识符的数据。在这里,它们被掩码处理以保护隐私。 首先,该公式会将两个参数合并成一个字符串。然后,它会对这个字符串进行排序,以确保相同的参数组合始终得到相同的结果。最后,它会使用 CRC32 算法计算出这个字符串的校验和,并将其作为优先级返回。 因此,该公式的目的是为给定的一组参数生成一个唯一的数值,以便将其用于比较和排序。根据具体的应用场景,生成的优先级可能表示不同的含义,例如决定网络流量的优先级或者排序搜索结果等。
如果 IP 地址相同,则应改用端口号(16 位整数):
priority = crc32-c(sort(client_port, peer_port))这个表达式是一个计算优先级的函数,它是由以下三部分组成: 1. client_port:客户端使用的端口号。 2. peer_port:对等方使用的端口号。 3. crc32-c(sort(client_port, peer_port)):将 client_port 和 peer_port 进行排序后,再进行 CRC32-C 校验。 整个表达式的含义是,通过对 client_port 和 peer_port 进行排序,并计算它们的 CRC32-C 值来生成一个唯一的优先级值。这个优先级值可以用来比较多个连接或任务的优先级,从而确定哪个连接或任务应该先处理。
在 IPv4 地址中如何选择子网掩码,如果两个 IP 地址不在同一个 /16 或 /24 子网中,那么它们需要使用 FF.FF.55.55 作为子网掩码。如果两个 IP 地址在同一个 /16 子网中,那么它们需要使用 FF.FF.FF.55 作为子网掩码。如果两个 IP 地址在同一个 /24 子网中,那么它们需要使用 FF.FF.FF.FF 作为子网掩码。
对于 IPv6 地址,IPv6 的子网掩码应该从 FFFF:FFFF:FFFF:5555:5555:5555:5555:5555 开始。如果两个 IPv6 地址在同一个 /48 子网中,则子网掩码应该只保留后 2 个字节(即 FF55),并将其插入到第 4 个字节位置上,形成 FFFF:FFFF:FFFF:FF55:5555:5555:5555:5555 的子网掩码。如果两个 IPv6 地址在同一个 /56 子网中,则子网掩码应该只保留后 2 个字节,并将其插入到第 5 个字节位置上,形成 FFFF:FFFF:FFFF:FFFF:5555:5555:5555:5555 的子网掩码,以此类推。
客户端应该从节点识别的 IP 地址中派生自己的 IP 地址部分,这样客户端和节点才能得到相同的哈希值。客户端可以使用通过扩展协议提供的 IP 地址作为提示,但不应盲目信任它
案例
如果客户端是 123.213.32.10,节点是 98.76.54.32,则它们都应该到达的哈希值是 crc32-c(624C14007BD50000) 或 ec2d7224。
如果客户端是 123.213.32.10,节点是 123.213.32.234,则它们都应该到达的哈希值是 crc32-c[(7BD5200A7BD520EA) 或 99568189。
后记
在连接之前,可以计算出节点的优先级,因此客户端在决定连接哪些节点时,这种方法可以优化客户端的性能和网络连接质量,因为它可以帮助客户端选择更可靠、更稳定的节点,从而提高数据传输的效率和可靠性。
此规范建议将优先级限制在特定的种子文件中,而不是在所有的文件或网络活动中使用。使用种子文件级别的优先级可以帮助客户端更好地管理种子文件内的节点连接,从而提高传输效率和可靠性。此规范并不打算影响客户端如何在不同的种子文件之间分配空余节点。
Google 提供了一个 CRC32-C 参考实现。
CPP 通过为每一个正在下载同一文件的节点赋予一个优先级来改进文件的传输速度。具体来说,当一个节点发现另一个节点拥有它所需要的块时,它会将该节点的优先级提高。这使得其他节点更有可能向具有较高优先级的节点上传数据,从而加快了整个文件的下载速度。同时,拥有较高优先级的节点也能够获得更多的下载机会,使得它们自己的下载速度也能够得到提升。
总之,CPP 可以让节点更加智能地选择要交换数据的节点,提高节点下载和上传数据的效率,从而加快了文件的传输速度,从而提高整个 BitTorrent 网络的性能。
参考链接
- http://bittorrent.org/beps/bep_0040.html