多流(yamux,multistream-select,.)之间的区别是什么?以及多路复用(复用器)?我想利用一个TCP连接来进行RPC、HTTP等(防火墙后面有一个客户端),如下所示:
conn = tcp.connect("server.com:1111")
conn1, conn2 = conn.split()
stream1 = RPC(conn1)
stream2 = WebSocket(conn2)
..
// received packets tagged for conn1 is forwarded to stream1
// received packets tagged for conn2 is forwarded to stream2
// writing to stream1 tags the packets for conn1
// writing to stream2 tags the packets for conn2哪一个适合这个案子?
发布于 2019-03-22 14:29:36
简单的回答是: mplex和yamux都是流复用器(也称为流复用器),它们负责在单个“原始”连接(例如TCP)上交织多个“逻辑流”。多流用于确定在流上发送/接收数据时应该使用哪种协议,而多流选择允许对等方协商每个端支持哪些协议,并希望就一个协议的使用达成一致意见。
较长的答覆:
流muxing是一个有几个实现的接口。“基线”流muxer称为mplex --一个在javascript、去和生锈中实现的javascript。
流多路复用器是“可插拔的”,这意味着您可以通过引入一个模块并配置您的libp2p应用程序来添加对它们的支持。给定的libp2p应用程序可以同时支持多个多路复用器,因此,例如,您可以使用yamux作为默认值,但也可以支持mplex与不支持yamux的对等端进行通信。
虽然具有这种灵活性是很好的,但这也意味着我们需要一种方法来确定用于任何特定连接的流muxer。这是多流和多流-选择进来的地方。
多流(尽管名称)与流多路复用没有直接关系。相反,它充当二进制数据流的“报头”,该数据流使用协议id将流关联起来。紧密相关的多流选择协议使用多流协议ids来协商用于“下一阶段”通信的协议。
因此,为了就使用什么流muxer达成一致,我们使用多流选择。
下面是一个示例,多流--来回选择:
/multistream/1.0.0 <- dialer says they'd like to use multistream 1.0.0
/multistream/1.0.0 -> listener echoes back to indicate agreement
/secio/1.0.0 <- dialer wants to use secio 1.0.0 for encryption
/secio/1.0.0 -> listener agrees
* secio handshake omitted. what follows is encrypted via secio: *
/mplex/6.7.0 <- dialer would like to use mplex 6.7.0 for stream multiplexing
/mplex/6.7.0 -> listener agrees这是一个简单的情况,双方在所有问题上都达成了一致--例如,如果侦听器不支持/mplex/6.7.0,他们可以使用na (不可用)进行响应,拨号程序可以尝试另一种协议,通过发送ls来请求支持的协议列表,或者放弃。
在上面的例子中,双方都同意使用mplex,因此将来通过开放连接进行的通信将以mplex的语义为主题。
需要注意的是,在libp2p中打开单个连接时,上面的大部分细节对您来说大多是“不可见的”,因为很少直接使用多流和流muxing库。
相反,名为"switch“的libp2p组件(在某些实现中也称为”群“)管理应用程序的拨号/侦听状态。该开关处理多流协商过程,并“隐藏”正在使用的特定流muxer的详细信息,使其不受libp2p堆栈其余部分的影响。
作为一名libp2p开发人员,您通常使用交换机接口拨号给其他对等方,这将为您提供一个可以读取和写入的流。在此框架下,交换机将找到适当的传输(例如TCP / websockets),并使用multistream-select来协商加密和流多路复用。如果您已经打开了到远程对等端的连接,则开关将只使用现有的连接并在其上打开另一个屏蔽流,而不是从头开始。
侦听连接也是如此--您为交换机提供一个协议id和一个流处理函数,它将为您处理muxing和协商过程。
我们的文档是一个正在进行的工作,但是在https://docs.libp2p.io中有一些信息可能有助于澄清,特别是关于运输的概念文件和术语表。您还可以找到指向示例代码的链接。
改进libp2p文档是我目前的主要任务,所以请随时向https://github.com/libp2p/docs提交问题,让我知道您最重要的缺失部分是什么。
https://stackoverflow.com/questions/55292794
复制相似问题