#async-std #transport #protocols #networking #async-networking #utp

async-std-utp

使用 async-std 编写的 µTP (Micro/uTorrent Transport Library) 库

2 个版本

0.1.1 2021 年 5 月 30 日
0.1.0 2021 年 5 月 29 日

#2#utp

MIT/Apache

150KB
3K SLoC

async-std-utp

一个用 Rust 编写的 Micro 传输协议 库 - 与 async-std 集成。

概览

Micro 传输协议是一种在 UDP 上构建的可靠传输协议。其拥塞控制算法是 LEDBAT,它试图使用尽可能多的未使用带宽,但会迅速让位于竞争的流,这使得它在大量传输中非常有用,同时不会在网络中引入拥塞。

当前实现尚不完整,缺少完整的拥塞控制实现。然而,它支持数据包丢失检测(除超时外)、选择性确认扩展、处理无序和重复的数据包,并提供了流接口 (UtpStream)。

用法

要使用 async-std-utp,请将以下内容添加到您的 Cargo.toml

[dependencies]
async-std-utp = "*"

示例

最简单的示例程序将是


use async_std_utp::UtpStream;
use async_std::prelude::*;

#[async_std::main]
async fn main() {
    // Connect to an hypothetical local server running on port 8080
    let addr = "127.0.0.1:8080";
    let mut stream = UtpStream::connect(addr).await.expect("Error connecting to remote peer");

    // Send a string
    stream.write("Hi there!".as_bytes()).await.expect("Write failed");

    // Close the stream
    stream.close().await.expect("Error closing connection");
}

查看 "examples" 目录下的更多示例程序,或使用 cargo run --example <example_name> 运行它们。

路线图

  • 拥塞控制
  • 正确关闭连接
    • 处理 RST 和 FIN
    • 关闭时发送 FIN
    • 如果尚未关闭,则自动在 drop 时发送 FIN
  • 在数据不匹配时发送 RST
  • 设置器和获取器,隐藏头字段端序转换
  • SACK 扩展
  • 处理数据包丢失
    • 发送三重 ACK 重新请求丢失的数据包(快速重传请求)
    • 在收到三重 ACK 时重置发送窗口并重传(快速重传)
    • 在 ACK 超时时重传数据包
  • 流接口
  • 处理无序数据包
  • 处理重复数据包
  • 监听器抽象
  • 传入连接迭代器
  • 过多重传后超时连接
  • 路径 MTU 发现

许可协议

本库的授权条款类似于Rust:双授权,MIT许可证和Apache许可证(版本2.0)。

有关详细信息,请参阅LICENSE-APACHE、LICENSE-MIT和COPYRIGHT。

注意事项

基于rust-utp的工作。感谢。

依赖项

约7–20MB
约241K SLoC