GitXplorerGitXplorer
b

async-std-utp

public
6 stars
1 forks
1 issues

Commits

List of commits on branch master.
Unverified
f5bf0188ed08592029ff48ad504abfdf70fb8a82

Document known issues with async drop

bbltavares committed 4 years ago
Unverified
cbfde5ad0526905c3e62103c07969cf1c95aaaf8

(cargo-release) version 0.1.1

bbltavares committed 4 years ago
Verified
f1ed7b92a8164d8c3a4027987adcc51188e6b78a

Merge pull request #4 from bltavares/clone

bbltavares committed 4 years ago
Unverified
5ddafe431d346f23af217e0e7bc06d78e1a7b143

Expose more traits to work with hyperswarm-rs

bbltavares committed 4 years ago
Unverified
eaec2868c7da0937c0d7994138a2a3df74647787

Fix clone - Sockets cannot be clone, only streams

bbltavares committed 4 years ago
Verified
96a1dc599b63742fed9f6c51439d19f5109e099c

Merge pull request #3 from bltavares/clone

bbltavares committed 4 years ago

README

The README file for this repository.

async-std-utp

A Micro Transport Protocol library implemented in Rust - integrated with async-std.

Overview

The Micro Transport Protocol is a reliable transport protocol built over UDP. Its congestion control algorithm is LEDBAT, which tries to use as much unused bandwidth as it can but readily yields to competing flows, making it useful for bulk transfers without introducing congestion in the network.

The current implementation is somewhat incomplete, lacking a complete implementation of congestion control. However, it does support packet loss detection (except by timeout) the Selective Acknowledgment extension, handles unordered and duplicate packets and presents a stream interface (UtpStream).

Usage

To use async-std-utp, add this to your Cargo.toml:

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

Examples

The simplest example program would be:

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");
}

Check out the files under the "examples" directory for more example programs, or run them with cargo run --example <example_name>.

Roadmap

  • [x] congestion control
  • [x] proper connection closing
    • [x] handle both RST and FIN
    • [x] send FIN on close
    • [x] automatically send FIN on drop if not already closed
  • [x] sending RST on mismatch
  • [x] setters and getters that hide header field endianness conversion
  • [x] SACK extension
  • [x] handle packet loss
    • [x] send triple-ACK to re-request lost packet (fast resend request)
    • [x] rewind send window and resend in reply to triple-ACK (fast resend)
    • [x] resend packet on ACK timeout
  • [x] stream interface
  • [x] handle unordered packets
  • [x] duplicate packet handling
  • [x] listener abstraction
  • [x] incoming connections iterator
  • [x] time out connection after too many retransmissions
  • [ ] path MTU discovery

License

This library is distributed under similar terms to Rust: dual licensed under the MIT license and the Apache license (version 2.0).

See LICENSE-APACHE, LICENSE-MIT, and COPYRIGHT for details.

Considerations

Based on the work of rust-utp. Thank you.