复用流与多流之间的区别

时间:2019-03-22 04:11:42

标签: libp2p

多流(yamux,多流选择,..)和多路复用(mplex)之间有什么区别? 我想将一个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

哪个人适合这种情况?

1 个答案:

答案 0 :(得分:2)

简短的答案:mplex和yamux都是流多路复用器(又名流多路复用器),它们负责通过单个“原始”连接(例如TCP)交错多个“逻辑流”。多流用于识别通过流发送/接收数据时应使用哪种协议,多流选择使对等端协商各个端和终端支持哪些协议。希望能达成共识。

长答案:

流混合是interface,具有多种实现。 “基准”流复用器称为多路复用器-一种libp2p-specific protocol,其实现方式为javascriptgorust

流多路复用器是“可插入的”,这意味着您可以通过引入模块并配置libp2p应用程序以使用它们来增加对它们的支持。一个给定的libp2p应用程序可以同时支持多个多路复用器,因此,例如,您可以使用yamux作为默认值,但也可以支持mplex与不支持yamux的对等体进行通信。

尽管这种灵活性非常好,但这也意味着我们需要一种方法来确定用于任何特定连接的流多路复用器。这是多流和多流选择的地方。

Multistream(尽管有名称)与流多路复用没有直接关系。相反,它充当二进制数据流的“标头”,该二进制数据流使用协议ID将流上下文化。密切相关的多流选择协议使用多流协议ID来协商将哪些协议用于通信的“下一阶段”。

因此,要同意使用哪种流混合器,我们使用multistream-select。

这是来回选择多流的示例:

/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中打开单个连接时,上面的大多数细节对于您来说几乎都是“不可见的”,因为很少使用直接使用多流和流混合库。

相反,称为“ switch”(在某些实现中也称为“ swarm”)的libp2p组件管理应用程序的拨号/监听状态。该开关处理多流协商过程,并从libp2p堆栈的其余部分“隐藏”正在使用哪个特定流多路复用器的详细信息。

作为libp2p开发人员,您通常使用switch接口拨打其他对等设备,这将为您提供要读取和写入的流。在后台,交换机将找到适当的传输方式(例如TCP / websockets),并使用multistream-select来协商加密和流多路复用。如果您已经与远程对等方建立了开放连接,则交换机将仅使用现有连接并在其上打开另一个多路复用流,而不是从头开始。

监听连接也是如此-您为交换机提供协议ID和流处理程序功能,它将为您处理多路复用和协商过程。

我们的文档尚在开发中,但是https://docs.libp2p.io上有一些信息可能会有助于阐明,尤其是concept doc on Transportsglossary。您还可以找到links to example code

目前,我的主要任务是为libp2p改进文档,因此,请随时向https://github.com/libp2p/docs提出问题,以使您知道最重要的缺失部分。