以太坊p2p的Server对象中使用的conn定义了一个transport接口,目前该接口的实现只看到了rlpx,可以推测以太坊p2p网络中的节点通信都采用了该协议.
RLPx协议属于会话层的协议,主要功能是在节点之间建立并维持通信,节点的发现和节点之间数据流的传输主要是由传输层的UDP和TCP协议完成.
RLPx协议实现了完备的前向安全性(Perfect Forward Secrecy),即现有的密钥泄漏不会导致之前信道上的信息被破解,因为RLPx协议每次建立的连接都使用了不同的密钥.
ReadMsg() // 返回Msg对象,调用读写器的ReadMsg,连接持续30秒
WriteMsg(msg) // 调用读写器的Wri
RLPx协议属于会话层的协议,主要功能是在节点之间建立并维持通信,节点的发现和节点之间数据流的传输主要是由传输层的UDP和TCP协议完成.
RLPx协议实现了完备的前向安全性(Perfect Forward Secrecy),即现有的密钥泄漏不会导致之前信道上的信息被破解,因为RLPx协议每次建立的连接都使用了不同的密钥.
实现过程是通过了一次Diffie–Hellman密钥交换,连接的双方各随机生成一个私钥,然后将算出的公钥发送给对方,最后双方通过手中的密钥和对方的公钥生成了一个共享密钥,此次连接的信道上将会使用此共享密钥加密传输信息.
type rlpx struct { // RLPx协议对象
fd net.Conn // 传输层连接
rmu, wmu sync.Mutex // 读写锁
rw *rlpxFrameRW // RLPx分帧,所有的读写都通过一个一个的帧(rlpxFrame)来传递和处理
}
newRLPX(fd) // 返回一个transport对象,连接持续5秒
ReadMsg() // 返回Msg对象,调用读写器的ReadMsg,连接持续30秒
WriteMsg(msg) // 调用读写器的Wri