多流(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
Run Code Online (Sandbox Code Playgroud)
哪一个适合这种情况?
小智 5
简短的答案:mplex和yamux都是流多路复用器(又名流多路复用器),它们负责通过单个“原始”连接(例如TCP)交错多个“逻辑流”。多流用于标识通过流发送/接收数据时应使用哪种协议,多流选择使对等方可以协商两端支持的协议,并希望就使用哪种协议达成共识。
长答案:
流混合是具有多种实现的接口。“基准”流复用器称为mplex-一种libp2p特定的协议,具有javascript,go和rust的实现。
流多路复用器是“可插入的”,这意味着您可以通过引入模块并配置libp2p应用程序以使用它们来增加对它们的支持。给定的libp2p应用程序可以同时支持多个多路复用器,因此,例如,您可以使用yamux作为默认值,但也可以支持mplex与不支持yamux的对等体进行通信。
尽管具有这种灵活性非常好,但这也意味着我们需要一种方法来确定对任何特定连接使用哪种流复用器。这是多流和多流选择进入的地方。
多流(尽管有名称)与流多路复用没有直接关系。相反,它充当二进制数据流的“标头”,该二进制数据流使用协议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
Run Code Online (Sandbox Code Playgroud)
这是双方都同意的简单情况-如果例如侦听器不支持/mplex/6.7.0,则他们可以回应na(不可用),并且拨号器可以尝试其他协议,通过发送ls或请求支持的协议列表放弃。
在上面的示例中,双方都同意使用mplex,因此将来通过开放连接进行的通信将遵循mplex的语义。
重要的是要注意,在libp2p中打开单个连接时,上面的大多数细节对于您来说几乎都是“不可见的”,因为很少直接使用多流和流混合库。
取而代之的是,一个称为“ switch”(在某些实现中也称为“ swarm”)的libp2p组件管理应用程序的拨号/监听状态。交换机处理多流协商过程,并从libp2p堆栈的其余部分“隐藏”正在使用哪个特定流多路复用器的详细信息。
作为libp2p开发人员,您通常使用switch接口拨打其他对等设备,这将为您提供读取和写入的流。在后台,交换机将找到合适的传输方式(例如TCP / websockets),并使用multistream-select来协商加密和流多路复用。如果您已经与远程对等方建立了开放连接,则交换机将仅使用现有连接并在其上打开另一个多路复用流,而不是从头开始。
侦听连接也是如此-您为交换机提供协议ID和流处理程序功能,它将为您处理混合和协商过程。
我们的文档尚在开发中,但是https://docs.libp2p.io上有一些信息可能会有助于澄清,尤其是有关Transports的概念文档和词汇表。您还可以找到示例代码的链接。
目前,我的主要任务是为libp2p改进文档,因此,请随时在https://github.com/libp2p/docs上提交问题,以让我知道您最重要的缺失部分。
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |