WebTransport
WebTransport è un protocollo di trasmissione basato su HTTP/3 che fornisce capacità di comunicazione bidirezionale tra client e server, combinando bassa latenza, alta velocità di trasferimento e sicurezza.
Casi d'uso
WebTransport è particolarmente adatto per:
- Applicazioni in tempo reale: giochi online, strumenti di collaborazione in tempo reale, videoconferenze e altre applicazioni che richiedono comunicazioni a bassa latenza
- Trasferimento di file di grandi dimensioni: supporta trasmissioni dati ad alta velocità, ideale per streaming multimediali e upload/download di file voluminosi
- Comunicazione multiplex: permette di stabilire simultaneamente multipli flussi di dati bidirezionali e unidirezionali
- Comunicazione tramite datagrammi: supporta la trasmissione di datagrammi senza garanzia di ordinamento e affidabilità, perfetta per scenari con requisiti estremi di real-time
Rispetto a WebSocket, WebTransport offre latenza inferiore e modalità di comunicazione più flessibili, con prestazioni migliori soprattutto in condizioni di rete instabili.
Implementazione in Salvo
Il framework Salvo fornisce supporto nativo per WebTransport, consentendo agli sviluppatori di costruire facilmente applicazioni basate su questa tecnologia. Le caratteristiche principali includono:
- Supporto per l'instaurazione di sessioni WebTransport
- Supporto per flussi bidirezionali (Bidirectional Streams)
- Supporto per flussi unidirezionali (Unidirectional Streams)
- Supporto per la trasmissione di datagrammi
- Possibilità per il server di avviare flussi di comunicazione
Esempio semplice
Ecco un esempio semplificato di server WebTransport implementato con Salvo:
#[handler]
async fn connect(req: &mut Request) -> Result<(), salvo::Error> {
let session = req.web_transport_mut().await.unwrap();
// Gestione datagrammi
if let Ok(Some((_, datagram))) = session.accept_datagram().await {
// Elabora il datagramma ricevuto
let mut resp = BytesMut::from(&b"Response: "[..]);
resp.put(datagram);
session.send_datagram(resp.freeze())?;
}
// Gestione flussi bidirezionali
if let Ok(Some(webtransport::server::AcceptedBi::BidiStream(_, stream))) = session.accept_bi().await {
let (send, recv) = salvo::proto::quic::BidiStream::split(stream);
// Elabora i dati del flusso bidirezionale
}
Ok(())
}
Configurazione e avvio
Per avviare un'applicazione Salvo con supporto WebTransport è necessario configurare certificati TLS e listener QUIC:
let cert = include_bytes!("../certs/cert.pem").to_vec();
let key = include_bytes!("../certs/key.pem").to_vec();
// Configurazione routing
let router = Router::new().push(Router::with_path("counter").goal(connect));
// Configurazione TLS
let config = RustlsConfig::new(Keycert::new().cert(cert.as_slice()).key(key.as_slice()));
// Configurazione listener
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;
// Avvio server
Server::new(acceptor).serve(router).await;
Esempio completo
Per approfondire l'utilizzo di WebTransport in Salvo, consulta l'esempio completo su GitHub:
https://github.com/salvo-rs/salvo/blob/main/examples/webtransport
L'esempio include implementazioni complete sia lato server che client, dimostrando come gestire diversi tipi di comunicazione WebTransport.