P2P 网络自引导技术
毕业设计相关的内容查了一些论文,好像也没有什么太多的发展,基本上都是2009年左右的内容了,算是稍微整理一下。
自主引导问题:端到端网络(Peer-to-Peer, P2P)网络通常需要一个或一组引导(Bootstrap)节点。在 P2P 网络中,引导也是唯一一个中心化的任务,新节点需要依赖引导节点的帮助来发现其他的节点并建立连接。现有的 P2P 系统会在软件内置一个引导节点列表,新节点在启动时通过这个引导节点列表依次去请求加入网络。那么,是否存在一种技术,使得运行同一个 P2P 服务的节点可以直接发现其他同类节点,而不需要引导的帮助。
随机地址探测
一种暴力的地址探测方法[1],即在固定端口下随机抽取 IP 地址进行探测,运行了同样 P2P 应用的主机会进行响应
但是这样的方法只能适用于规模较大的 P2P 网络,例如 BitTorrent
基于 IPv6 的随机地址探测
IPv6 简介
IPv6 地址[3][7]的长度为 128 bits,在实际使用的时候写为 16 进制的字符串,每 32 bits 作为一个分组,以冒号作为分隔符
即每个 IPv6 的地址的通用格式为 x:x:x:x:x:x:x:x
,每个 x
表示一个长度为 4 的十六进制字符串
表示规则:
忽略前导 0:在每个分组内,如果字符串具有前导 0 则忽略;
双冒号:在一个地址中,可以使用双冒号
::
代替一个或多个分组都是 0 的连续字符串。在一个地址中,双冒号只能使用一次,通常使用它来表示最长的连续为 0 的多个分组,其他为 0 的分组则直接使用 0 写出;例如:
2001:0db8:0000:0000:ab00:0000:0000:0000
=>2001:db8:0:0:ab00::
地址类型:单播地址、组播地址、任播地址
- 单播:用于唯一标识支持 IPv6 点设备上的接口;
- 组播:将单个 IPv6 数据包发送到多个目的地;
- 任播:任播地址是可分配到多个设备的 IPv6 的任播地址,发送到这类地址的数据包会被路由到最近的拥有该地址的设备;
全局单播地址
全局单播地址(Global Unicast Address,GUA)类似于公有 IPv4 地址,具有全局唯一性,它的格式为:
|------ Global Routing Prefix (n bits) ------|------ Subnet-ID (64-n) bits ------|------ Interface ID (64 bits) ------|
- 全局路由前缀(Global Routing Prefix)是网络提供商分配给客户、站点的前缀,通常 n=48,以前 48 bits 为前缀;
- 子网 ID(Subnet-ID)用于确认组织内部的子网;
- 接口 ID(Interface ID)相当于 IPv6 的主机部分,使用“接口 ID”作为名称是由于一个主机可能存在多个接口;
随机地址探测
通过 IPv6 的地址格式,可以使得随机地址探测相比在 IPv4 下具备更高的效率[2]
定义一个 P2P 网络具备唯一的名称为 $s$,以及哈希函数 $h(s) \rightarrow x$ 可以将任意字符串 $s$ 进行映射得到 $x \in (0, 2^{64})$
地址探测过程:
- 应用启动时,计算得到应用的 P2P 网络的 id 信息 $x \leftarrow h(s)$,得到目标地址格式为 $a = pre|sid|x$;
- 节点向多个全局路由前缀的最多 $c$ 个子网下的节点发送 UDP 探测包,依次改变 $pre$ 的值,然后探测最多 $c$ 次,保持 $x$ 不变,直到接收到响应;
- 接收到响应后可以与目标主机通过特定的协议进行握手;
对于每一个这样的主机,在完成握手后设置自身的 IPv6 为同样的格式 $a = pre|sid|x$;,以 $x$ 作为接口 ID;
如果设置失败(通过邻居发现机制发现子网下具有相同的 IP),说明当前子网下存在运行相同 P2P 应用的程序(也可能是小几率的碰撞),则以子网下的地址作为引导节点接入到 P2P 网络;
如果节点的 IP 设置成功,则启动一个 UDP 服务以接收其他节点的引导请求;
单一引导网络
另外一种自引导点方式是构建一个“引导网络”用于节点的引导,Michael 等人[3]提出的方案中包含了两个模块分别用于引导网络的初始化和提供引导信息
- BootstrapManager:负责进行 P2P 引导网络的初始化;
- BootstrapStorage:通过分布式存储的方式来存放引导信息,降低所有节点的存储开销;
- BootstrapCache:存放某个 P2P 网络的路由缓存,简化网络的引导过程;
另外一种单一引导网络是 Universal Ring[6],同样是构建一个 P2P 网络用来引导其他应用的网络,但是多了一个要求:在加入引导网络的时候需要一个类似 SSL 证书发放的机制来给节点发放证书,用于验证节点的身份,更具体的内容就没有看了。
基于区块链的引导
基于区块链的引导方式是单一引导网络的一种引申,公有链作为一种可提供公开读取服务的分布式网络,那么也可以将它用于实现 P2P 节点的引导
DIBDApp[5] 就是一种基于区块链的分布式文件框架,它提供基于区块链的自引导方式,同时提供文件的上传、下载、浏览功能,算是一种 BitTorrent 和 EVM 区块链的结合。
自引导功能的实现:
- 在区块链上部署名为 BootstrapTracker 的智能合约,其地址作为应用的标识符。智能合约提供
join
和get_node
两种方法,分别用于表示加入应用网络和读取引导节点信息; - 服务启动时调用
get_node
方法得到已注册的引导节点信息; - 服务内嵌 BitTorrent 客户端,通过引导节点信息加入到 P2P 网络;
- 如果以引导节点的身份加入,那么当前节点也调用
bootstrap
方法注册自己的信息;
- 1.Decentralized Bootstrapping of P2P Systems: A Practical View ↩
- 2.Decentralized and Autonomous Bootstrapping for IPv6-based Peer-to-Peer Networks ↩
- 3.A Generic, Self-Organizing, and Distributed Bootstrap Service for Peer-to-Peer Networks ↩
- 4.计算机网络原理 • IPv6 编址 ↩
- 5.Decentralizing indexing and bootstrapping for online applications ↩
- 6.One Ring to Rule them All: Service Discovery and Binding in Structured Peer-to-Peer Overlay Networks ↩
- 7.IPv6 - Wikipedia ↩