本文发表于链客区块链技术问答社区,分享一些经验给大家,本本文分析比特币网络,了解和传统中心化网络的区别,以及如何发现相邻节点。
比特币采用基于网络的点对点分布式网络框架,可以认为时按照比特币P2P协议运行的节点集合。
中心化网络
这是典型的中心化结构,常见B/S和C/S网络架构就是这种模型,C1、C2、C3等之间无法直接连接,C节点如要连接必须通过中心化S节点作为桥梁,中心化节点起到中介作用。
P2P网络
P2P网络是指位于同一网络中的计算机彼此对等,各个结点共同提供网络服务,不存在任何特殊节点,以扁平的拓扑结构互相连通。
对比中心化网络,在P2P网络中不存在任何服务端(server)、中央化的服务。
P2P网络的节点之间交互连接、协同,每个节点在对外提供服务的同时也使用网络中其他节点所提供的服务,每个节点即是服务端又是客户端。
P2P网络模型除应用于比特币网络,使用广泛的BT下载就是基于P2P网络。
P2P网络不仅仅去除了中心化带来的风险(中心化可能作恶),还可以提高传输的效率。(中心化网络当能也有优点)
在中心化网络中,新加入的节点只要连接“特殊”的中心节点就可以加入网络。
为了能够加入到比特币网络,比特币客户端会做一下几件事情:
1.当建立一个或多个连接后,节点将一条包含自身IP地址消息发送给其相邻节点。相邻节点再将此消息依次转发给它们各自的相邻节点,从而保证节点信息被多个节点所接收、保证连接更稳定。
2.新接入的节点可以向它的相邻节点发送获取地址getaddr消息,要求它们返回其已知对等节点的IP地址列表。节点可以找到需连接到的对等节点。
3.在节点启动时,可以给节点指定一个正活跃节点IP, 如果没有,客户端也维持一个列表,列出了那些长期稳定运行的节点。这样的节点也被称为种子节点(其实和BT下载的种子文件道理是一样的),就可以通过种子节点来快速发现网络中的其他节点。
4.节点会在失去已有连接时尝试发现新节点。
5.节点会记住它最近成功连接的网络节点,当重新启动后它可以迅速与先前的对等节点网络重新建立连接。
节点通信简述
比特币节点通常采用TCP协议、使用8333端口与相邻节点建立连接, 建立连接时也会有认证“握手”的通信过程,用来确定协议版本,软件版本,节点IP,区块高度等。
当节点连接到相邻节点后,接着就开始跟相邻节点同步区块链数据(轻量级钱包应用其实不会同步所有区块数据),节点们会交换一个getblocks消息,它包含本地区块链最顶端的哈希值。如果某个节点识别出它接收到的哈希值并不属于顶端区块,而是属于一个非顶端区块的旧区块,就说其自身的本地区块链比其他节点的区块链更长,并告诉其他节点需要补充区块,其他节点发送getdata消息来请求区块,验证后更新到本地区块链中。