WebTransport

WebTransport est un protocole de transport réseau basé sur HTTP/3 qui offre des capacités de communication bidirectionnelle entre client et serveur, tout en combinant faible latence, haut débit et sécurité.

Cas d'utilisation

WebTransport est particulièrement adapté aux scénarios suivants :

  • Applications temps réel : jeux en ligne, outils de collaboration en temps réel, visioconférence nécessitant une faible latence
  • Transfert de fichiers volumineux : prise en charge du transfert haute performance pour flux multimédias et fichiers lourds
  • Communication multiplexée : permet d'établir simultanément plusieurs flux de données unidirectionnels et bidirectionnels
  • Communication par datagrammes : supporte les datagrammes sans garantie d'ordre ni de fiabilité, idéal pour les applications ultra-sensibles à la latence

Comparé à WebSocket, WebTransport offre une latence réduite et des modes de communication plus flexibles, particulièrement performants dans des environnements réseau instables.

Implémentation Salvo

Le framework Salvo fournit un support natif pour WebTransport, permettant aux développeurs de construire facilement des applications basées sur ce protocole. Principales fonctionnalités :

  • Prise en charge des sessions WebTransport
  • Communication par flux bidirectionnels (Bidirectional Streams)
  • Communication par flux unidirectionnels (Unidirectional Streams)
  • Transfert de datagrammes
  • Capacité pour le serveur d'initier des flux de communication

Exemple simple

Voici un exemple simplifié de serveur WebTransport avec Salvo :

#[handler]
async fn connect(req: &mut Request) -> Result<(), salvo::Error> {
    let session = req.web_transport_mut().await.unwrap();
    
    // Traitement des datagrammes
    if let Ok(Some((_, datagram))) = session.accept_datagram().await {
        // Traiter le datagramme reçu
        let mut resp = BytesMut::from(&b"Response: "[..]);
        resp.put(datagram);
        session.send_datagram(resp.freeze())?;
    }
    
    // Traitement des flux bidirectionnels
    if let Ok(Some(webtransport::server::AcceptedBi::BidiStream(_, stream))) = session.accept_bi().await {
        let (send, recv) = salvo::proto::quic::BidiStream::split(stream);
        // Traiter les données du flux bidirectionnel
    }
    
    Ok(())
}

Configuration et démarrage

Pour démarrer une application Salvo avec WebTransport, configurer un certificat TLS et un écouteur QUIC :

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

// Configuration du routeur
let router = Router::new().push(Router::with_path("counter").goal(connect));

// Configuration TLS
let config = RustlsConfig::new(Keycert::new().cert(cert.as_slice()).key(key.as_slice()));

// Configuration de l'écouteur
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;

// Démarrage du serveur
Server::new(acceptor).serve(router).await;

Exemple complet

Pour approfondir l'utilisation de WebTransport avec Salvo, consultez l'exemple complet sur GitHub : https://github.com/salvo-rs/salvo/blob/main/examples/webtransport

Cet exemple inclut des implémentations complètes côté serveur et client, illustrant les différents types de communication WebTransport.