显示包…
1 个不稳定版本
0.10.0 | 2021年3月15日 |
---|
73 在 #tetcore
166 每月下载量
在 19 个包中使用(通过 tet-libp2p-core)
100KB
1.5K SLoC
Tet-tet-multistream-select 协议协商
此包实现了 tet-multistream-select
协议,这是libp2p在连接或子流上与远程节点协商使用哪个应用层协议所使用的协议。
注意:此包主要用于libp2p的核心组件,通常不会单独使用。
角色
在I/O流上使用tet-multistream-select协商协议的两个对等方根据其作为拨号器(或发起者)或作为监听器(或响应者)的角色进行区分。因此,拨号器扮演主动角色,推动协议,而监听器则对收到的消息做出反应。
拨号器有两个选择:它可以从监听器支持的完整协议列表中选择一个协议,或者它可以直接建议一个协议。无论哪种方式,选择的协议都会发送给监听器,监听器可以接受(通过回显相同的协议)或拒绝(通过发送一条表示“不可用”的消息)。如果建议的协议不可用,拨号器可以建议另一个协议。这个过程会一直持续到双方就协议达成一致,从而产生一个Negotiated
流,或者拨号器已经用尽所有备选方案。
请参阅 dialer_select_proto
和 listener_select_proto
。
协商
一个 Negotiated
代表了一个已确定使用特定协议的 I/O 流。默认情况下,使用 Version::V1
时,协议协商至少需要一轮往返消息交换,然后拨号器才能发送协商协议的应用数据。存在一个变体 Version::V1Lazy
,允许拨号器只支持单一协议时进行 0-RTT 协商。在这种情况下,当拨号器确定要使用的协议时,DialerSelectFuture
会在协商数据被刷新之前产生一个 Negotiated
I/O 流。此时它期待从流中读取的第一个消息对该协议进行确认。这种行为允许拨号器立即发送与协商协议相关的数据以及剩余的协商消息。注意,然而,如果一个拨号器在一系列不同协议上连续进行多次 0-RTT 协商,可能会触发不支持其中任意一个中间协议的监听器的不希望的行为。有关详细信息,请参阅 dialer_select_proto
以及 Version::V1Lazy
的文档。
示例
对于拨号器
use async_std::net::TcpStream;
use tet_multistream_select::{dialer_select_proto, Version};
use futures::prelude::*;
async_std::task::block_on(async move {
let socket = TcpStream::connect("127.0.0.1:10333").await.unwrap();
let protos = vec![b"/echo/1.0.0", b"/echo/2.5.0"];
let (protocol, _io) = dialer_select_proto(socket, protos, Version::V1).await.unwrap();
println!("Negotiated protocol: {:?}", protocol);
// You can now use `_io` to communicate with the remote.
});
依赖项
~1.2–2MB
~40K SLoC