Libp2p是什么?
Libp2p是用于构建P2P网络的模块化网络堆栈和库,源自开源项目IPFS,模块化设计使它能够用来构建各种去中心化应用的P2P网络层。目前,知名区块链项目Ethereum 2.0、Pokdot、BitXHub都选择基于Libp2p库搭建系统网络层。Libp2p作为P2P网络协议栈,它是通过解决实际问题不断成长的,可以认为是构建P2P网络经验的积累。
Libp2p解决了哪些问题?
Libp2p作为网络协议栈,主要解决两个问题:
节点发现
节点发现用来发现P2P网络中的其它节点及维护节点在线状态,并且根据节点状态调整网络连接,构建稳定的网络拓扑。
数据传输
数据传输负责节点间数据的流转。为了支持各种异构的网络设备互连,Libp2p核心要求之一就是传输层不可知,Libp2p支持不同的传输层协议,例如TCP、UDP、QUIC等。在传输层建立连接后还需要考虑网络数据的隐私安全,Libp2p对传输通道加密,节点间通过加密通道进行通信。为了高效传输数据,Libp2p支持对连接进行多路流复用从而支持节点间多个并发流通信。
本文主要讨论Libp2p解决数据传输问题方案,代码基于go-libp2p v0.9.2。
Libp2p是如何解决数据传输问题的?
传输层不可知
传输层不可知是指Libp2p支持多种传输层协议,例如TCP、UDP、QUIC等,应用程序开发者在使用Libp2p库时不需要知道完成数据传输使用的传输层协议,Libp2p会根据远程节点地址信息自动完成协议选择。
地址定义
数据传输建立在节点连接的基础上,在可以拨号远程节点并建立连接之前,需要知道远程节点的监听地址。因为每种传输协议都有自己的地址格式,所以Libp2p