#tetcoin #tetsy-libp2p #networking #crypto

tetsy-multistream-select

tetsy-libp2p的多流选择协商协议

显示包…

3 个版本

0.10.2 2021 年 3 月 12 日
0.10.1 2021 年 4 月 3 日
0.10.0 2021 年 4 月 2 日
0.0.0 2021 年 3 月 11 日

#2 in #tetsy-libp2p

Download history 192/week @ 2024-04-01 130/week @ 2024-04-08 150/week @ 2024-04-15 138/week @ 2024-04-22 146/week @ 2024-04-29 147/week @ 2024-05-06 168/week @ 2024-05-13 106/week @ 2024-05-20 145/week @ 2024-05-27 116/week @ 2024-06-03 126/week @ 2024-06-10 118/week @ 2024-06-17 186/week @ 2024-06-24 69/week @ 2024-07-08 181/week @ 2024-07-15

444 每月下载次数
91 个包中使用(通过 tetsy-libp2p-core

MIT 许可证

105KB
1.5K SLoC

Tetsy 多流选择协议协商

本包实现了 tetsy-multistream-select 协议,该协议是 tetsy-libp2p 在连接或子流上与远程端协商使用哪个应用层协议时使用的协议。

注意:本包主要供 tetsy-libp2p 的核心组件使用,通常不会单独直接使用。

角色

使用 tetsy-multistream-select 协商协议在 I/O 流上进行通信的两个对等体根据其作为 拨号器(或 发起者)或作为 监听器(或 响应者)的角色来区分。因此,拨号器扮演主动角色,推动协议,而监听器则对收到的消息做出反应。

拨号器有两个选项:它可以从监听器支持的所有协议列表中选取一个协议,或者直接建议一个协议。无论哪种方式,所选协议都会发送给监听器,监听器可以接受(通过回显相同协议)或拒绝(通过发送表示“不可用”的消息)。如果建议的协议不可用,拨号器可以建议另一个协议。这个过程会一直持续到协商一致协议,从而产生一个 Negotiated 流,或者拨号器用尽所有替代方案。

参见 dialer_select_protolistener_select_proto

协商

一个 Negotiated 表示已确定使用某种协议的 I/O 流。默认情况下,使用 Version::V1,协议协商至少需要一个往返的消息交换,然后拨号器才能发送协商协议的应用数据。存在一个变体 Version::V1Lazy,如果拨号器只支持一个协议,则允许 0-RTT 协商。在这种情况下,当拨号器确定要使用的协议时,在协商数据被刷新之前,DialerSelectFuture 会生成一个 Negotiated I/O 流。然后它期望从流中读取的第一个消息对该协议进行确认。这种行为允许拨号器立即发送与协商协议相关的数据,以及剩余的协商消息。注意,然而,如果一个拨号器连续对多个叠加在彼此之上的协议执行 0-RTT 协商,可能会触发不支持其中一种中间协议的监听器的不希望的行为。有关详细信息,请参阅 dialer_select_protoVersion::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