About Ethereum p2p
p2p通信协议族的结构设计
分为三层结构:
- 1.第一层,pkg eth中:eth.peer代表了远端通信对象和其所有的通信操作,它封装了更底层的p2p.Peer对象以及读写通道。eth.peerSet:是peer的集合类型。被eth.Ethereum,eth.ProtocolManager等顶层管理模块使用。
- 2.第二层,pkg p2p中,可认为是泛化的p2p通信结构。p2p.Peer{}代表远端通信对象,封装自更底层的连接对象的conn{},通信用通信用的通道对象protoRW{},以及启动监听、处理新加入连接或断开连接的p2p.Server{}。p2p.Protocol{},针对上层应用特意开辟的类型,主要作用是包括容纳上层应用程序所要求的回调函数等,并通过p2p.Server{}在新连接建立后,将其产地给通信对象peer。
- 第三层,是golang自带的网络代码包,分为两部分:1.pkg net,包括代表网络连接的接口,代表网络地址的以及他们的实现类,2.pkg syscall,包括更底层的网络相关系统调用类等,可视为封装了网络层(IP)和传输层(TCP)协议的系统实现。
从逻辑应用分类的角度也可以分成三层:
1.基于udp的邻居发现层;
基于udp的邻居发现层使用Kad (Kademlia p2p网络协议)节点发现机制,与网络中的其他节点进行ping pong握手、交换邻居的方式发现邻居,计算节点之间的距离,动态维护邻居表。
2.基于tcp的加密通信层;
基于tcp的加密通信层与节点发现层发现的节点进行握手建立安全加密连接,负责对核心层协议提供的数据进行编解码与加解密、安全传输,rlpx为该层实际使用的协议。
3.核心协议层。
核心协议层负责将需要发送的业务数据传入加密通信层,并处理从加密通信层收到的业务数据。
理论上,无论是tcp还是udp通信,只要知道了ip地址和端口号就可以进行通行了。为了找到通信对方的地址,可以从两种方式入手:1.初始连接(种子节点)2.地址传播发现(泛洪、分布式哈希表)。
c/s模式
c/s模式上