然而,在分布式网络结构中,每个节点同时兼具服务器和客户端的身份(或者可以说,不再有服务器-客户端的界限),加之各种异构的网络环境和通讯协议,开发者往往需要投入大量资源来解决这些底层的网络通讯问题,如NAT穿透和加密传输等。
如果这些问题不断困扰着众多开发者,那么是否有可能将解决这些问题的方案集成在一起,以便大家重复使用和改进呢?libp2p的出现正是对这一问题的回应。凭借其高度模块化的设计,开发者可以方便地选取所需的模块,并在现有模块之上添加自己的应用逻辑,以适应各种不同的应用场景。
libp2p因其高度模块化的特性,受到了许多知名项目的青睐,这些项目纷纷采用libp2p作为其底层网络框架,例如Ethereum 2.0、Polkadot、Filecoin、0X等。
libp2p最初是IPFS项目中的网络框架,后来独立成为一个项目。
libp2p的特色 以下提到的libp2p特色,大多以模块的形式实现,开发者可以根据自己的需求选择合适的模块,进而开发出符合应用场景的服务。 具有兼容性的定址方式 libp2p采用了类似于文件路径的概念(PLAN9 Ubiquitous Filesystem),为每个进程定义了专属的地址。这种定址方式提高了进程地址的兼容性,如果某个进程改用了新的网络传输协议(例如从IPv4改为蓝牙),可以很方便地使用相同的定址结构来表达新的地址。 以目前常见的IPv4地址为例,假设某个节点以IP 1.2.3.4和端口号80提供服务,在libp2p中其地址可以表示为/ip4/1.2.3.4/tcp/80。 支持多种传输协议 针对目前常见的传输协议,libp2p也实现了相应的模块,例如:TCP、QUIC、WebSockets、WebRTC。在未来,libp2p还预计支持Bluetooth、uTP、UDP,或者尚未发明的新协议(归功于其兼容性的定址方式)。 可升级的传输协议 在libp2p的设计中,当两个进程建立连接时,首先会以某个底层协议作为原始连接(例如TCP协议)。一旦原始连接建立完成,两个进程可以进一步协商,根据需求决定是否将原始协议升级为另一个协议连接(例如将简单的TCP协议升级为具有加密性质的连接)。 多路复用 有时候,在两个节点之间建立一个连接需要付出不小的代价(例如需要穿透NAT、经过多次握手确认后才能建立连接)。如果能够重复使用已经成功建立的连接,两个节点之间就能以更高效的方式实现异构的数据传输。例如,两个节点可以在同一个TCP连接上产生不同的流。 协议协商 由于libp2p支持多种传输协议,并且能够实现多路复用,两个节点在相互传输数据之前,需要有一套机制进行协商,确定两者将使用哪种协议进行数据传输,这就是协议协商。 目前的协议协商机制是multiselect 1.0,libp2p接下来将升级协议协商机制为更高效的multiselect 2.0。 节点发现与消息传播 在构建分布式应用时,如何高效地寻找节点(节点发现)是构建一切服务的起点。只有找到节点,才能进一步与节点建立连接,然后才能构建其上的应用。libp2p提供了多种节点发现实现(如DHT、Rendezvous、mDNS等)。 除了节点发现,如何进行消息传播也是构建分布式应用必须考虑的问题。在这里要特别提及PubSub这种消息传播模式。这是一种类似于MQTT的发布-订阅(Publish-Subscribe)模式,允许消息以M-to-N的方式在网络中传递,这种传播模式是非同步的。与MQTT不同的是,libp2p是分散式的,并不需要一个中心化的代理来负责消息的路由。 目前PubSub提供了多种消息路由算法,包括floodsub、gossipsub等。在Ethereum 2.0也将采用PubSub作为其消息传播模式。 NAT穿透及中继 在当今的网络架构中,NAT无处不在,这也是点对点连接时最大的困扰。libp2p实现了NAT穿透,对于无法进行NAT穿透的节点,libp2p还提供了中继技术(relay)作为补充方案。 结语及后记 以上所描述的libp2p特色,是在参加CrossLink Taipei 2019研讨会时,印象较为深刻的几点。此外,还有一些特色没有在本文中记录。除此之外,各项特色的描述大多以要点形式记录,很多细节仍有待深入挖掘。标签: 数字货币
文章来源: 酷玩网
版权声明: 本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任