WebTransport

WebTransport — это сетевой протокол передачи данных на основе HTTP/3, который обеспечивает двустороннюю связь между клиентом и сервером, сочетая в себе низкую задержку, высокую пропускную способность и безопасность.

Применение

WebTransport особенно подходит для следующих сценариев:

  • Приложения реального времени: онлайн-игры, инструменты для совместной работы, видеоконференции и другие приложения, требующие низкой задержки связи
  • Передача больших файлов: поддержка высокоскоростной передачи данных, идеально подходит для потоковой передачи медиа и загрузки/выгрузки больших файлов
  • Мультиплексированная связь: возможность одновременного установления нескольких двунаправленных и однонаправленных потоков данных
  • Передача датаграмм: поддержка передачи данных без гарантии порядка и надежности, что идеально для сценариев с критически важной задержкой

По сравнению с WebSocket, WebTransport обеспечивает меньшую задержку и более гибкие режимы связи, особенно хорошо проявляя себя в нестабильных сетевых условиях.

Реализация в Salvo

Фреймворк Salvo предоставляет встроенную поддержку WebTransport, позволяя разработчикам легко создавать приложения на его основе. Основные возможности включают:

  • Поддержку установления сессий WebTransport
  • Поддержку двунаправленных потоков (Bidirectional Streams)
  • Поддержку однонаправленных потоков (Unidirectional Streams)
  • Поддержку передачи датаграмм (Datagrams)
  • Возможность инициации потоков связи сервером

Простой пример

Ниже приведен упрощенный пример реализации сервера WebTransport с использованием Salvo:

#[handler]
async fn connect(req: &mut Request) -> Result<(), salvo::Error> {
    let session = req.web_transport_mut().await.unwrap();
    
    // Обработка датаграмм
    if let Ok(Some((_, datagram))) = session.accept_datagram().await {
        // Обработка полученных датаграмм
        let mut resp = BytesMut::from(&b"Response: "[..]);
        resp.put(datagram);
        session.send_datagram(resp.freeze())?;
    }
    
    // Обработка двунаправленных потоков
    if let Ok(Some(webtransport::server::AcceptedBi::BidiStream(_, stream))) = session.accept_bi().await {
        let (send, recv) = salvo::proto::quic::BidiStream::split(stream);
        // Обработка данных двунаправленного потока
    }
    
    Ok(())
}

Настройка и запуск

Для запуска приложения Salvo с поддержкой WebTransport необходимо настроить TLS-сертификат и QUIC-листенер:

let cert = include_bytes!("../certs/cert.pem").to_vec();
let key = include_bytes!("../certs/key.pem").to_vec();

// Настройка маршрутизации
let router = Router::new().push(Router::with_path("counter").goal(connect));

// Настройка TLS
let config = RustlsConfig::new(Keycert::new().cert(cert.as_slice()).key(key.as_slice()));

// Настройка листенера
let listener = TcpListener::new(("0.0.0.0", 5800)).rustls(config.clone());
let acceptor = QuinnListener::new(config, ("0.0.0.0", 5800))
    .join(listener)
    .bind()
    .await;

// Запуск сервера
Server::new(acceptor).serve(router).await;

Полный пример

Чтобы узнать больше об использовании WebTransport в Salvo, ознакомьтесь с полным примером на GitHub: https://github.com/salvo-rs/salvo/blob/main/examples/webtransport

Этот пример включает полную реализацию как серверной, так и клиентской части, демонстрируя обработку различных типов связи через WebTransport.