P2P网络 - libp2p
Libp2p是什么?
一个模块化网络堆栈,汇集了各种传输和点对点协议,使开发人员可轻松构建大型、强壮的p2p网络。源自IPFS,目前Ethereum2.0、Pokdot都选用libp2p库搭建系统网络层。
Libp2p解决什么问题?
主要解决两个问题:
- 节点发现:发现P2P网络其他节点以及维护节点在线状态,并根据节点状态调整网络连接,构建稳定的网络拓扑。
- 数据传输:为支持各种异构的网络设备节点互联,要求传输层不可知。libp2p支持各种传输层协议,如TCP、UDP、QUIC等。传输层建立连接后通过对传输通道加密保证网络数据的隐私安全。对连接多路复用来支持并发流通信。
Libp2p如何解决数据传输问题?
(以go-libp2p为例)
- 传输层不可知:应用开发者无需知道数据传输该使用什么传输层协议,libp2p根据远程节点地址类型自动完成协议选择
- 地址定义:multiaddr编码方案统一不同协议的地址格式,如/ip4/127.0.0.1/tcp/9999、/ip4/127.0.0.1/udp/9998,即使用IP4地址127.0.0.1,TCP/UDP协议端口9999/9998。multiaddr描述了节点监听地址,在拨号节点时还要加上远程节点ID,如/ip4/192.168.100.100/tcp/9999/p2p/QmcEPrat8ShnCph8WjkREzt5CPXF2RwhYxYBALDcLC1iV6
- 节点ID定义:节点ID有节点公钥哈希生成,并base58编码。节点ID全网唯一,拨号时使用节点ID可以解决中间人攻击问题
- 支持多种传输协议:libp2p的Swarm模块中多种传输层协议都遵循同一个接口规则,在应用程序拨号节点时不用指定传输层。同时还支持协议协商、多路流复用、建立安全通信等接口升级操作。
数据安全传输
以TCP为例,TcpTransport是TCP的传输层实现模块,其中组合了Upgrader模块,能够将原始TCP连接升级为支持加密、支持多路流复用的连接。secio和tls是两个实现SecureTransport接口的库,libp2p默认用secio加密库。secio库使用了Diffie-Hellman密钥协商算法。
多路流复用
多路流复用允许与远程节点建立一次连接即可完成整个生命周期的数据收发,同样只需要处理一次NAT操作,因为和同一个远程节点所有的流都共享相同的底层传输连接。
upgrader的muxer模块负责将加密后的连接升级为支持多路流复用的连接。MuxedConn为多路流复用操作接口,multiplex为多路流复用操作具体实现,负责具体的流创建及管理。除了默认的multiplex,Libp2p还支持yamux、spdy、muxado等不同的多路复用器实现。
总结
从Libp2p解决数据传输问题能够看到Libp2p有很多小组件组成,解决相同问题小组件遵循相同接口,可以根据使用场景进行替换,各组件库可以单独开发升级,而不会对其它部分产生影响。“multiaddr”的地址编码方案使基于Libp2p的应用层开发不需要关注底层使用的传输层协议。节点间可以通过协议协商选择共同支持的加密模块对数据传输通道进行加密,从而保证数据隐私性。