p2p网络通信协议 比特币平台(比特币的网络发现)

2023-05-12 富美财经 浏览量:

比特币的网络发现

当新的网络节点启动后,为了能够参与协同运作,它必须发现网络中的其他比特币节点。新的网络节点必须发现至少一个网络中存在的节点并建立连接。由于比特币网络的拓扑结构并不基于节点间的地理位置,因此各个节点之间的地理信息完全无关。在新节点连接时,可以随机选择网络中存在的比特币节点与之相连。

节点通常采用TCP协议、使用8333端口(该端口号通常是比特币所使用的,除8333端口外也可以指定使用其他端口)与已知的对等节点建立连接。在建立连接时,该节点会通过发送一条包含基本认证内容的version消息开始“握手”通信过程(见图6-4)。这一过程包括如下内容:

PROTOCOL_VERSION
常量,定义了客户端所“说出”的比特币P2P协议所采用的版本(例如:70002)。

nLocalServices
一组该节点支持的本地服务列表,当前仅支持NODE_NETWORK

nTime
当前时间

addrYou
当前节点可见的远程节点的IP地址

addrMe
本地节点所发现的本机IP地址

subver
指示当前节点运行的软件类型的子版本号(例如:”/Satoshi:0.9.2.1/”)

BaseHeight
当前节点区块链的区块高度
(version网络消息的具体用例请参见GitHub)

网络中的对等节点通过对verack消息的响应进行确认并建立连接;有时候,如果接收节点需要互换连接并连回起始节点,也会传回该对等节点的version消息。

新节点是如何发现网络中的对等节点的呢?虽然比特币网络中没有特殊节点,但是客户端会维持一个列表,那里列出了那些长期稳定运行的节点。这样的节点被称为“种子节点(seed nodes)”。新节点并不一定需要与种子节点建立连接,但连接到种子节点的好处是可以通过种子节点来快速发现网络中的其他节点。在比特币核心客户端中,是否使用种子节点是通过“-dnsseed”控制的。默认情况下,该选项设为1,即意味着使用种子节点。另一种方式是,起始时将至少一个比特币节点的IP地址提供给正在启动的节点(该节点不包含任何比特币网络的组成信息)。在这之后,启动节点可以通过后续指令建立新的连接。用户可以使用命令行参数“-seednode”把启动节点“引荐”并连接到一个节点,并将该节点用作DNS种子。在初始种子节点被用于形成“引荐”信息之后,客户端会断开与它的连接、并与新发现的对等节点进行通信。



比特币的网络发现

当建立一个或多个连接后,新节点将一条包含自身IP地址的addr消息发送给其相邻节点。相邻节点再将此条addr消息依次转发给它们各自的相邻节点,从而保证新节点信息被多个节点所接收、保证连接更稳定。另外,新接入的节点可以向它的相邻节点发送getaddr消息,要求它们返回其已知对等节点的IP地址列表。通过这种方式,节点可以找到需连接到的对等节点,并向网络发布它的消息以便其他节点查找。图6-5描述了这种地址发现协议。



比特币的网络发现


节点必须连接到若干不同的对等节点才能在比特币网络中建立通向比特币网络的种类各异的路径(path)。由于节点可以随时加入和离开,通讯路径是不可靠的。因此,节点必须持续进行两项工作:在失去已有连接时发现新节点,并在其他节点启动时为其提供帮助。节点启动时只需要一个连接,因为第一个节点可以将它引荐给它的对等节点,而这些节点又会进一步提供引荐。一个节点,如果连接到大量的其他对等节点,这既没必要,也是对网络资源的浪费。在启动完成后,节点会记住它最近成功连接的对等节点;因此,当重新启动后它可以迅速与先前的对等节点网络重新建立连接。如果先前的网络的对等节点对连接请求无应答,该节点可以使用种子节点进行重启动。

在运行比特币核心客户端的节点上,您可以使用getpeerinfo命令列出对等节点连接信息:

$ bitcoin-cli getpeerinfo[    {        "addr" : "85.213.199.39:8333",        "services" : "00000001",        "lastsend" : 1405634126,        "lastrecv" : 1405634127,        "bytessent" : 23487651,        "bytesrecv" : 138679099,        "conntime" : 1405021768,        "pingtime" : 0.00000000,        "version" : 70002,        "subver" : "/Satoshi:0.9.2.1/",        "inbound" : false,        "startingheight" : 310131,        "banscore" : 0,        "syncnode" : true    },    {        "addr" : "58.23.244.20:8333",        "services" : "00000001",        "lastsend" : 1405634127,        "lastrecv" : 1405634124,        "bytessent" : 4460918,        "bytesrecv" : 8903575,        "conntime" : 1405559628,        "pingtime" : 0.00000000,        "version" : 70001,        "subver" : "/Satoshi:0.8.6/",        "inbound" : false,        "startingheight" : 311074,        "banscore" : 0,        "syncnode" : false    }]

用户可以通过提供-connect=选项来指定一个或多个IP地址,从而达到复写自动节点管理功能并指定IP地址列表的目的。如果采用此选项,节点只连接到这些选定的节点IP地址,而不会自动发现并维护对等节点之间的连接。

如果已建立的连接没有数据通信,所在的节点会定期发送信息以维持连接。如果节点持续某个连接长达90分钟没有任何通信,它会被认为已经从网络中断开,网络将开始查找一个新的对等节点。因此,比特币网络会随时根据变化的节点及网络问题进行动态调整,不需经过中心化的控制即可进行规模增、减的有机调整。

比特币的网络发现

比特币当日价格

#比特币[超话]##欧易OKEx##数字货币#

为你推荐