- 浏览: 768080 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
1.启动的时间先与程序硬编码的DNS种子节点进行TCP连接
2.连接的握手流程是先发一个版本消息(VERSION),包括:P2P协议版本,本节点支持的服务,当前时间,对方节点IP地址,本节点IP地址,比特币软件版本,以及本节点当前区块链的长度
3.对方节点收到握手信息后会回复一个收到确认的信息(VERACK)
3.1.若对方已经发送过一次,则回复一个REJECT消息,消息体为REJECT_DUPLICATE
3.2.若对方的协议version<MIN_PEER_PROTO_VERSION,则回复一个REJECT消息,消息体为REJECT_OBSOLETE.然后连续回复VERSION消息,VERACK消息.
3.3.若自己是监听节点,则回复ADDR消息发送自己的地址和端口;若对方为fOneShot,大于CADDR_TIME_VERSION或本地地址库不足1000个,则回复GETADDR消息
3.4.若本地接收过告警消息,则转发ALERT消息
3.5.最后记录下对方时间戳和本地时间戳之差,至此,网络的通道层正式建立连接
3.6.若节点不发送VERSION消息就发送其他消息,但只要超过DEFAULT_BANSCORE_THRESHOLD=100次会被禁止掉
4.同时节点也会发送getaddr给邻节点,邻节点收到后将把所有的已知的地址信息发送给新节点
4.1.当收到VERACK消息时,设置对方节点状态为"连接成功",若对方节点协议版本大于SENDHEADERS_VERSION=70012,则发送SENDHEADERS消息
4.2.ADDR消息用于转发网络上的节点地址列表
4.3.GETADDR消息会主动请求节点回复一个addr消息,以便快速更新本地地址库.它没有消息体payload.
5.一个节点一般会维护8个邻节点的连接,同时最多允许125个其它节点的连接,当发现新节点,一般将断开和种子节点的连接
//static const unsigned int DEFAULT_MAX_PEER_CONNECTIONS = 125;
6.建立连接后,两个节点会互相发送同步请求getblocks,节点比较对方的BestHeight后,区块较多的一方向区块较少的一方发送inv响应,让落后的节点追上.收到inv响应后,落后的节点开始发送getdata请求数据
6.1.GETBLOCKS消息:是以期返回一个包含编号从hash_start到hash_stop至多500个区块的区块列表的inv消息.如果想获取后面的区块Hash,则需要重新发送getblocks
6.2.GETHEADERS消息:是用于获取编号hash_start到hash_stop至多2000个区块的header包,要获取之后的区块Hash,需要重新发送getheaders消息.这个消息用于快速下载不包含相关交易的区块链
6.3.INV消息:用于发送本节点的交易和区块列表(MSG_TX,MSG_BLOCK,MSG_FILTERED_BLOCK)
6.4.HEADERS消息:用于返回区块的头部以应答getheaders
6.5.GETDATA消息:该消息的内容同INV消息,待收到对方节点的INV消息后,返回GETDATA消息到对方节点去获取节点自己不存在的block或tx
6.6.SENDHEADERS消息:指示节点优先用headers消息代替inv消息接收新块通知,它没有 消息体payload
6.7.BLOCK消息:用于响应请求交易信息的getdata消息
6.8.TX消息:针对一笔比特币交易进行描述,用于应答getdata消息
7.启动结束后,会记住最近连接上的邻节点的地址,会保存到文件方便下次连接
8.如果以前的邻节点连不上了,它会重新开始初始启动流程
9.如果节点连接上一段时间后没有信息交互,节点会定期发一些信息去维护连接
9.1.PING消息:用于检测连接是否在线
9.2.PONG消息:消息内容同PING消息,待收到对方节点的PING消息后回复PONG消息,表明连接还在线
10.如果一个节点和邻节点的连接在超过90分钟里没有联系,该节点会被认为下线,节点会一个新的邻节点来进行连接
10.1.ALERT消息:用于在节点间发送通知使其传遍整个网络.如果签名验证这个alert来自Bitcoin的核心开发组,建议将这条消息显示给终端用户.交易尝试,尤其是客户端间的自动交易则建议停止.消息文字应当记入记录文件并传到每个用户
11.因此,无需要中心控制,网络节点可以自由加入或离开网络,即比特币网络能动态地调节节点的连接,以保证比特币网络的正常运行
2.连接的握手流程是先发一个版本消息(VERSION),包括:P2P协议版本,本节点支持的服务,当前时间,对方节点IP地址,本节点IP地址,比特币软件版本,以及本节点当前区块链的长度
3.对方节点收到握手信息后会回复一个收到确认的信息(VERACK)
3.1.若对方已经发送过一次,则回复一个REJECT消息,消息体为REJECT_DUPLICATE
3.2.若对方的协议version<MIN_PEER_PROTO_VERSION,则回复一个REJECT消息,消息体为REJECT_OBSOLETE.然后连续回复VERSION消息,VERACK消息.
3.3.若自己是监听节点,则回复ADDR消息发送自己的地址和端口;若对方为fOneShot,大于CADDR_TIME_VERSION或本地地址库不足1000个,则回复GETADDR消息
3.4.若本地接收过告警消息,则转发ALERT消息
3.5.最后记录下对方时间戳和本地时间戳之差,至此,网络的通道层正式建立连接
3.6.若节点不发送VERSION消息就发送其他消息,但只要超过DEFAULT_BANSCORE_THRESHOLD=100次会被禁止掉
4.同时节点也会发送getaddr给邻节点,邻节点收到后将把所有的已知的地址信息发送给新节点
4.1.当收到VERACK消息时,设置对方节点状态为"连接成功",若对方节点协议版本大于SENDHEADERS_VERSION=70012,则发送SENDHEADERS消息
4.2.ADDR消息用于转发网络上的节点地址列表
4.3.GETADDR消息会主动请求节点回复一个addr消息,以便快速更新本地地址库.它没有消息体payload.
5.一个节点一般会维护8个邻节点的连接,同时最多允许125个其它节点的连接,当发现新节点,一般将断开和种子节点的连接
//static const unsigned int DEFAULT_MAX_PEER_CONNECTIONS = 125;
6.建立连接后,两个节点会互相发送同步请求getblocks,节点比较对方的BestHeight后,区块较多的一方向区块较少的一方发送inv响应,让落后的节点追上.收到inv响应后,落后的节点开始发送getdata请求数据
6.1.GETBLOCKS消息:是以期返回一个包含编号从hash_start到hash_stop至多500个区块的区块列表的inv消息.如果想获取后面的区块Hash,则需要重新发送getblocks
6.2.GETHEADERS消息:是用于获取编号hash_start到hash_stop至多2000个区块的header包,要获取之后的区块Hash,需要重新发送getheaders消息.这个消息用于快速下载不包含相关交易的区块链
6.3.INV消息:用于发送本节点的交易和区块列表(MSG_TX,MSG_BLOCK,MSG_FILTERED_BLOCK)
6.4.HEADERS消息:用于返回区块的头部以应答getheaders
6.5.GETDATA消息:该消息的内容同INV消息,待收到对方节点的INV消息后,返回GETDATA消息到对方节点去获取节点自己不存在的block或tx
6.6.SENDHEADERS消息:指示节点优先用headers消息代替inv消息接收新块通知,它没有 消息体payload
6.7.BLOCK消息:用于响应请求交易信息的getdata消息
6.8.TX消息:针对一笔比特币交易进行描述,用于应答getdata消息
7.启动结束后,会记住最近连接上的邻节点的地址,会保存到文件方便下次连接
8.如果以前的邻节点连不上了,它会重新开始初始启动流程
9.如果节点连接上一段时间后没有信息交互,节点会定期发一些信息去维护连接
9.1.PING消息:用于检测连接是否在线
9.2.PONG消息:消息内容同PING消息,待收到对方节点的PING消息后回复PONG消息,表明连接还在线
10.如果一个节点和邻节点的连接在超过90分钟里没有联系,该节点会被认为下线,节点会一个新的邻节点来进行连接
10.1.ALERT消息:用于在节点间发送通知使其传遍整个网络.如果签名验证这个alert来自Bitcoin的核心开发组,建议将这条消息显示给终端用户.交易尝试,尤其是客户端间的自动交易则建议停止.消息文字应当记入记录文件并传到每个用户
11.因此,无需要中心控制,网络节点可以自由加入或离开网络,即比特币网络能动态地调节节点的连接,以保证比特币网络的正常运行
发表评论
-
chaintips
2019-07-02 09:07 3121.invalid 该分支包含至少一块无效区块。 2.head ... -
比特币RPC
2019-02-13 08:10 401代码详解:https://mistydew.github.io ... -
比特币命令行参数
2019-02-03 09:04 429-?:提示常用的命令行参数并退出 -version:打印版本然 ... -
比特币消息类型
2019-01-27 09:28 6311.VERSION:当主动连接上对方时,发送version消息 ... -
外带数据
2019-01-07 08:08 405外带数据:保存在区块链但不进行货币交易的信息,比如需要永久保存 ... -
watch-only 地址
2019-01-06 16:34 476watch-only 地址:监控某一个地址,只能看不能花,相当 ... -
签名模式
2019-01-05 09:24 737交易的签名方式可以通过SIGHASH符号来控制,该符号附加在签 ... -
Script(脚本)字段
2018-12-28 07:57 4621.常见关键字段 OP_0/OP_FA ... -
coinbase交易
2018-12-26 22:14 528coinbase交易:用于凭空产生比特币 1.只有一个输入,该 ... -
根据地址查询私钥
2018-12-26 09:44 695字符串转私钥 1.先将字符串decode base58,获取C ... -
难度值
2018-12-26 07:45 501难度值:它决定了节点需要经过多少次哈希运算才能产生一个合法的区 ... -
即时支付
2018-12-23 16:52 669即时支付:直接发给主节点让主节点快速确认的交易 1.手续费最 ... -
椭圆曲线密码算法
2018-12-21 08:06 691椭圆曲线密码(Elliptic Curve Cryptogra ... -
Merkle树
2018-12-19 21:17 380Merkle哈希数是一类基于 ... -
SHA256
2018-12-19 21:07 535SHA256是构造区块链所用的主要密码哈希函数.无论是区块的头 ... -
比特币交易
2018-12-16 14:16 445交易类型 TX_NONSTANDARD 非标准的交易 TX_P ... -
Bloom过滤器
2018-12-16 09:47 340Bloom filter:是一种节省空间,高效率的数据表示和查 ... -
BerkeleyDB和LevelDB
2018-12-15 08:40 10Berkeley DB:作为比特币的钱包数据库(存储walle ... -
BerkeleyDB和LevelDB
2018-12-15 08:40 1971Berkeley DB:作为比特币的钱包数据库(存储walle ... -
内存池
2018-12-12 08:10 433入块优先级:按交易中的输入对应的UTXO的"链龄&q ...
相关推荐
《实现P2P网络通信——基于Java的深度解析》 P2P(Peer-to-Peer)网络通信是一种去中心化的网络架构,其中每个节点既是服务的提供者也是服务的消费者。这种模式在分布式系统、文件共享、流媒体传输等领域有着广泛...
在P2P通信软件中,每个参与者既是服务的提供者,也是服务的消费者。每个节点都可以发送和接收数据,因此网络中的流量是分散的,这有助于降低单个服务器的负载,提高整体系统的稳定性和效率。此外,由于P2P网络的去...
2. **多线程**:由于P2P通信通常涉及到并发处理多个连接,因此需要掌握C#的多线程技术。`Thread`类和`ThreadPool`类可以帮助你创建和管理线程,以处理不同的网络活动,如接收、发送数据或处理视频流。 3. **数据...
1. **网络协议**:P2P通信通常基于UDP(User Datagram Protocol)协议,因为它比TCP(Transmission Control Protocol)更快,更适合实时语音通信。UDP是无连接的,不保证数据包的顺序和完整性,但可以减少延迟,这...
回到我们的主题,"P2P即时通信系统源代码",这是一份宝贵的开发资源,开发者可以通过阅读和理解源代码,掌握P2P通信的关键技术和实现细节。源代码涵盖了网络连接、数据传输、节点发现、流媒体处理等多个方面,对于...
二、P2P通信的关键技术分析 (一)信息的传递 在P2P网络中,任意两个端点之间可实现直接通信。在基于C/S的网络中,客户端可以通过向服务器注册来实现彼此之间的定位(获得IP和端口)。对于P2P网络中,是如何实现...
【标题】:“P2P通信过程自编程序” 在计算机网络领域,P2P(Peer-to-Peer)通信是一种去中心化的通信模式,其中每个参与者既是客户端又是服务器,可以直接与其他参与者交换数据。在这个项目中,我们关注的是用VC...
- **构建高效的P2P通信机制**:为了确保平台的稳定性和高效性,系统采用了先进的P2P通信技术,使得终端之间能够直接进行数据交换,从而减少了对中央服务器的依赖。 - **提升服务端数据吞吐性能**:通过对服务器端...
### Java实现P2P通信的关键知识点 #### 一、P2P通信模型及关键技术分析 ##### (一)信息的传递 **1. P2P通信模型** P2P(Peer-to-Peer)通信模型是一种分布式网络架构,其中的每一个节点既是服务的提供者也是...
标题中的“p2p通信 利用IP识别进行通信”是指使用点对点(Peer-to-Peer,简称P2P)技术,通过网络中各节点的IP地址进行直接通信的技术。这种通信方式允许两个或多个计算机节点之间直接交换数据,而无需通过中心...
设计并实现一个基于p2p的通信程序。实现用户登录、选择在线用户建立tcp连接从而达到互发消息等功能。
STM32控制NFC(PN532)模块进行P2P通信是嵌入式系统中一项关键的技术,尤其在物联网(IoT)应用中,它允许设备间直接交换数据,无需中间媒介。PN532是NXP公司生产的一款高性能、低功耗的NFC/RFID控制器,广泛用于各种...
在局域网内进行P2P通信,首先需要确保设备都连接在同一WiFi网络下。Android系统提供了`WifiManager`类,可以用来获取连接信息,检查设备是否已连接到特定的WiFi网络。 3. **设备发现**: 在P2P环境中,设备需要...
在C#中实现P2P通信,通常会用到套接字(Socket)编程,它是TCP/IP协议族的一部分,允许应用程序通过网络发送和接收数据。 1. **套接字编程基础**: - 套接字是网络通信的基本单元,提供了低级别的接口来实现进程间...
简单的p2p通信例子,非常的简单,希望能帮到有需要的人!
### 基于UDP协议P2P通信技术的分析及实现 #### 1. 引言 P2P(Peer-to-Peer,点对点)技术作为一种新兴的通信模式,其核心理念在于让网络中的每一台设备都能作为平等的节点进行信息交换。这种技术的应用极大地拓宽...
在局域网P2P通信中,TCP提供了一种稳定且高效的通信基础。 首先,我们需要了解TCP通信的基本流程。TCP连接的建立始于客户端发起一个SYN(同步序列编号)请求,服务器回应一个SYN+ACK(确认),最后客户端再发送一个...
本项目聚焦于使用C#编程语言构建基于P2P(Peer-to-Peer)架构的内网即时通信软件,旨在提供一个基础框架,允许开发者进行进一步的扩展和定制。 首先,我们要理解P2P网络的概念。P2P网络是互联网的一种分布式架构,...
【标题】中的“一个p2p通信库源码”指的是这个压缩包中包含了一个用于实现点对点(P2P)通信的软件开发库的源代码。P2P通信是一种网络架构,其中每个节点(或用户)既是客户端也是服务器,可以直接与其他节点交换...
TCP 实现 P2P 通信 TCP 实现 P2P 通信是指在私网环境中,使用 TCP 协议实现直接的 Peer-to-Peer 通信,绕过 NAT 设备的限制。这种技术解决了私网内主机之间的互联问题,适用于 P2P 软件、网络会议、视频传输等应用...