这一节我将从网络连接开始为大家介绍主流的几种区块链p2p网络结构,让大家对区块链网络更加深层次的理解。
网络连接是指网络在应用级的互联。在我们生活中无处不在,比如:人们使用的手机Wifi无限网络、有点交换机网络。网络连接类型定义了网络所连接设备的多少和方式,从而决定了网络的通信机制。网络连接类型在物理上仅有点到点连接和多点连接两种。
点到点连接
点到点连接,这样的网络只涉及两台设备,例如,两台笔记本之间互联进行数据传输。
多点连接
顾名思义,指三台或多台设备之间的连接组成的网络。计算机网络普遍是多点连接的。
网络连接的机器之间通过传输层协议进行数据传输,目前除却少数区块链项目使用UDP协议以外,绝大部分都采用TCP/IP协议。
P2P全称“peer-to-peer”,顾名思义,就是网络上节点到节点之间的网络连接。网络中的节点,既是资源服务的提供者,也是接受者,也就是说各个节点共同提供网络服务,节点间是平等的,不存在任何“特殊”节点。
P2P网络技术解决的两个问题,一是资源定位,二是资源获取。P2P网络拓扑结构大致分为四类中心化、全分布式非结构化、全分布式结构化、半分布式。
即存在一个中心节点保存了其他所有节点的索引信息,索引信息一般包括节点 IP 地址、端口、节点资源等。类似QQ就是此种网络拓扑结构。
缺点
1、节点规模扩展时容易出现性能瓶颈;
2、存在单点故障问题,中央索引服务器的瘫痪容易导致整个网络的崩溃,因此可靠性和安全性较低。
比较适合小型网络而言,对于大型网络会放大上述有限。
即在一个新加入节点和 P2P 网络中的某个节点间随机建立连接通道,从而形成一个随机拓扑结构。
节点与节点之间的传输过程更接近“泛洪算法”,即:交易从某个节点产生,接着广播到临近节点,临近节点一传十十传百,直至传播到全网。
区别于中心化拓扑结构,他没有中央服务器,每台机器在网络中是真正的对等关系。
缺点
1、由于是非结构化的网络,所以是一个完全的随机图,节点之间的链路不遵循预定义的拓扑结构,所以一般而言不提共任何性能保障;
2、存在分区,断链现象;
优点
容错性好,并且少数节点的频繁加入退出对系统影响小
全分布式结构化拓扑的P2P网络是采用分布式散列表(Distributed Hash Table, 简写成DHT)技术来组织网络中的结点,通过这类技术可以实现网络的结构化,例如代表性的算法有Tapestry,Pastry,Chord和CAN。
Pastry 是微软研究院提出的可扩展的分布式对象定位和路由协议,可用于构建大规模的P2P系统。在Pastry中,每个结点分配一个128位的结点标识符号(nodeID) ,所有的结点标识符形成了一个环形的nodeID空间,范围从0到2128 - 1 ,结点加入系统时通过散列结点IP地址在128位nodeID空间中随机分配。
混合了集中式和分布式结构,如下图所示,网络中存在多个超级节点组成分布式网络,而每个超级节点则有多个普通节点与它组成局部的集中式网络。
一个新的普通节点加入,则先选择一个超级节点进行通信,该超级节点再推送其他超级节点列表给新加入节点,加入节点再根据列表中的超级节点状态决定选择哪个具体的超级节点作为父节点。
这种结构的泛洪广播只发生在超级节点之间,可以避免大规模泛洪存在的问题。在实际应用中,混合式结构是相对灵活并且比较有效的组网架构,实现难度也相对较小,因此目前较多系统基于混合式结构进行开发实现。其实,比特币网络如今也是这种结构。
Ok,以上我们详细的讲解了P2P网络拓扑结构,接下来进入正题,我们以比特币P2P网络为例,那么它又和我们上诉所说的有什么区别呢?
首先我们知道,P2P是点对点的网络,既然是点对点,那就存在着节点的发现(定位)以及交互,接下来我们就从这两部分进行讲解。
节点发现是任何区块链节点接入区块链 P2P 网络的第一步。节点发现可分为初始节点发现和启动后节点发现。
初始化节点发现
一般分为两种,DNS-send和hard-code。
1、DNS方式:初始化时会进行中心化域名查找,比特币的社区维护者会维护一些域名。
2、硬编码方式:在代码中硬编码一些地址,这些地址我们称之为子节点,初始化时会尝试进行连接。当所有的种子节点全部失效时,全节点会尝试连接这些种子节点。
启动后节点发现
在 Bitcoin 的网络中,一个节点可以将自己维护的对等节点列表 (peer list) 发送给临近节点,所以在初始节点发现之后,你的节点要做的第一件事情就是向对方要列表。
在以太坊网络中,也会维护类似的一个节点列表 (NodeTable),但是这个节点列表与比特币的简单维护不同,它采用了 P2P 网络协议中一个成熟的算法,叫做 Kademlia 网络,简称 KAD 网络。
它使用了 DHT 来定位资源,全称 Distributed Hash Table,中文名为分布式哈希表。KAD 网络会维护一个路由表,用于快速定位目标节点。由于 KAD 网络基于 UDP 通信协议,所以以太坊节点的节点发现是基于 UDP 的,如果找到节点以后,数据交互又会切换到 TCP 协议上。
区块链的 P2P 网络结构是一种全分布式的拓扑结构。但是,如今我们的网络环境是由局域网和互联网组成的。那么公网上的节点怎么发现你部署在局域网中的节点呢?
如果这个局域网是你可以控制的,那很好说,只需要在 VPC 网络中配置路由,将公网 IP 和端口映射到局域网中你的 IP 和端口即可(内网穿透)。
如果是不可控制又怎么办呢?办法就是NAT 技术和 UPnP 协议。
NAT技术简而言之,就是替换TCP报文中的源地址并映射到内网。
UPnP是通用即插即用(Universal Plug and Play)的缩写它主要用于设备的智能互联互通,所有在网络上的设备马上就能知道有新设备加入。
比特币和以太坊均使用了 UPnP 协议作为局域网穿透工具,只要局域网中的路由设备支持 NAT 网关功能、支持 UPnP 协议,即可将你的区块链节点自动映射到公网上。
一旦节点建立连接以后,节点之间的交互是遵循一些特定的命令,这些命令写在消息的头部,消息体写的则是消息内容。
命令分为两种,一种是请求命令(Ping),一种是数据交互命令(Pong)。
节点连接后第一件事就是握手。这一点在比特币和以太坊上的流程是差不多的,就是相互问候一下,提供一些简要信息。比如先交换一下版本号,看看是否兼容。只是以太坊为握手过程提供了对称加密,而比特币没有。
通过这种方式(握手),节点获得可连接的对等节点列表,同时它也会向网络发布自己的消息以便其他节点查找。节点在本地会保存上次连接的同步对等节点信息,因此,当节点重启时它可以快速与先前的对等节点重新建立连接。
Ping机制可以维护节点间的连接,如果节点持续某个连接长达90分钟没有任何通信,它会被认为已经从网络中断开,网络将开始查找一个新的对等节点。因此,比特币网络会随节点和网络的变化进行动态有机调整,而不需要进行中心化的控制,这就是去中心化自制。
这一节我们我们主要讲解了P2P演变史,我们理解比特币P2P网络通讯打下基础,在下一节我们将会根据不同节点论述他们不同的通讯方式。
参考文献:
《精通比特币第二版》
P2P网络的拓扑结构
区块链100问