显示包…
3 个版本
0.10.2 | 2021 年 3 月 12 日 |
---|---|
0.10.1 | 2021 年 4 月 3 日 |
0.10.0 | 2021 年 4 月 2 日 |
0.0.0 |
|
#2 in #tetsy-libp2p
444 每月下载次数
在 91 个包中使用(通过 tetsy-libp2p-core)
105KB
1.5K SLoC
Tetsy 多流选择协议协商
本包实现了 tetsy-multistream-select
协议,该协议是 tetsy-libp2p 在连接或子流上与远程端协商使用哪个应用层协议时使用的协议。
注意:本包主要供 tetsy-libp2p 的核心组件使用,通常不会单独直接使用。
角色
使用 tetsy-multistream-select 协商协议在 I/O 流上进行通信的两个对等体根据其作为 拨号器(或 发起者)或作为 监听器(或 响应者)的角色来区分。因此,拨号器扮演主动角色,推动协议,而监听器则对收到的消息做出反应。
拨号器有两个选项:它可以从监听器支持的所有协议列表中选取一个协议,或者直接建议一个协议。无论哪种方式,所选协议都会发送给监听器,监听器可以接受(通过回显相同协议)或拒绝(通过发送表示“不可用”的消息)。如果建议的协议不可用,拨号器可以建议另一个协议。这个过程会一直持续到协商一致协议,从而产生一个 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 tetsy_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