首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多路和多流的区别

多路和多流的区别
EN

Stack Overflow用户
提问于 2019-03-22 04:11:41
回答 1查看 732关注 0票数 3

多流(yamux,multistream-select,.)之间的区别是什么?以及多路复用(复用器)?我想利用一个TCP连接来进行RPC、HTTP等(防火墙后面有一个客户端),如下所示:

代码语言:javascript
复制
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

哪一个适合这个案子?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-22 14:29:36

简单的回答是: mplex和yamux都是流复用器(也称为流复用器),它们负责在单个“原始”连接(例如TCP)上交织多个“逻辑流”。多流用于确定在流上发送/接收数据时应该使用哪种协议,而多流选择允许对等方协商每个端支持哪些协议,并希望就一个协议的使用达成一致意见。

较长的答覆:

流muxing是一个有几个实现的接口。“基线”流muxer称为mplex --一个在javascript生锈中实现的javascript

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

虽然具有这种灵活性是很好的,但这也意味着我们需要一种方法来确定用于任何特定连接的流muxer。这是多流和多流-选择进来的地方。

多流(尽管名称)与流多路复用没有直接关系。相反,它充当二进制数据流的“报头”,该数据流使用协议id将流关联起来。紧密相关的多流选择协议使用多流协议ids来协商用于“下一阶段”通信的协议。

因此,为了就使用什么流muxer达成一致,我们使用多流选择。

下面是一个示例,多流--来回选择:

代码语言:javascript
复制
/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提交问题,让我知道您最重要的缺失部分是什么。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55292794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档