本文是《循序渐进比特币》第五篇-比特币网络原理分析。我们知道区块链底层就是一个P2P网络。本文我们只会简单讲一下比特币P2P网络的原理,不会涉及代码层面的知识。接下来的两节,会进行代码分析。
1 P2P基础知识
之前讲过P2P知识-拓扑结构与内容路由简析,我们在这儿简单回顾下:
1.1 P2P是什么
对等网络,即对等计算机网络,是一种在对等者(Peer)之间分配任务和工作负载的分布式应用架构,是对等计算模型在应用层形成的一种组网或网络形式。
1.2 P2P的拓扑结构
P2P拓扑结构经历了集中式、纯分布式、混合式、结构式四个阶段。
- 集中式具有单点的风险
- 纯分布式则会出现flood性能问题 以及响应风暴的问题
- 混合式则选用了几个Super node, 其他作为ordinary node , 这种结构则结合了集中式跟分布式的优点
- 结构化目前看来也比较理想。目前比较典型的算法是Kad算法,以太坊就采用了这种算法,后面我们会有文章专门讲解以太坊的网络。
2 比特币网络P2P
比特币采用了上述那种P2P拓扑结构呢? 个人认为应该是处于纯分布式跟混合式之间,更偏向于混合式。
3 节点发现
比特币中的节点发现有两种方式:
(1)利用种子节点: 比特币网络中会有几个种子节点,硬编码在比特币的代码中。这几个种子节点为其他新进入网络中的节点提供路由功能。
当普通节点(比如节点A)跟种子节点连接之后,会获取种子节点上其他节点的信息(比如节点B、C),有了众多节点信息之后,节点A会记录下来,等下次再启动时,可以从DB中读取自己记录的节点信息。如果自己记录的节点都离线了,则会继续去读取种子的信息。
(2)引导节点: 如果已经知道某些节点信息,在启动时可以直接指定这些节点。
4 地址广播与发现
新节点加入网络之后,自身存储的其他peer信息不充足,此时可以向已经连接的节点,比如种子节点发送getAddr消息,收到getAddr消息的节点,会查询自身缓存的peer信息,发送给请求peer.
新节点加入之后,发送addr消息,收到addr消息的节点,会广播这个新节点的地址,这样很快新节点的信息就会遍布全网。
5 握手协议
节点发现之后,要进行连接,连接的第一步就是握手。握手的主要内容是看对方是不是对的节点,比如是不是同一个网络(具有相同的networkId)、版本号是不是太老等。
握手的步骤就是一方(A)发送version消息,另一方(B)收到之后发送verAck消息进行确认。然后另一方(B)再发送version消息,等待本方(A)的verAck, 经过这个交互过程,双方就可以建立连接,互相通信了。
另外,btcd版本的getAddr 消息就是在发送version 消息时,检查peer数量是否满足某个阈值,如果不满足就顺带发送getAddr消息。
6 连接管理
btcd版本的连接管理主要是由connManager来处理。里面定义了inbound(进入的请求)管理、outbound(请求别人)管理、连接建立管理、连接消息管理等几部分组成。
7 消息互通
比特币的消息通信主要分peer、block、message、inv等几种。定义了一个staleHandler 协程来监控消息处理的进展; 还定义了一个queueHandler协程, 所有的任务通过它来调度; 针对每种消息,都定义了一种特殊的处理handler方法。
8 参考文献
9 其他
本文是《循序渐进比特币》的第五篇-比特币网络原理分析。
如果有疑问,可以直接留言,也可以关注公众号 “链人成长chainerup” 提问留言,或者加入知识星球“链人成长”~
网友评论