WebTransport
WebTransport es un protocolo de transmisión basado en HTTP/3 que proporciona capacidades de comunicación bidireccional entre cliente y servidor, combinando baja latencia, alto rendimiento y seguridad.
Casos de uso
WebTransport es especialmente adecuado para:
- Aplicaciones en tiempo real: Juegos en línea, herramientas de colaboración, videoconferencias y otras aplicaciones que requieren comunicación con baja latencia
- Transferencia de archivos grandes: Soporta transmisión de datos de alto rendimiento, ideal para streaming de medios y transferencia de archivos grandes
- Comunicación multiplexada: Permite establecer múltiples flujos de datos bidireccionales y unidireccionales simultáneamente
- Comunicación mediante datagramas: Soporta datagramas sin garantía de orden ni fiabilidad, perfecto para escenarios con requisitos extremos de tiempo real
Comparado con WebSocket, WebTransport ofrece menor latencia y modos de comunicación más flexibles, especialmente en entornos de red inestables.
Implementación en Salvo
El framework Salvo proporciona soporte nativo para WebTransport, permitiendo a los desarrolladores construir aplicaciones fácilmente. Sus características principales incluyen:
- Soporte para establecer sesiones WebTransport
- Comunicación mediante flujos bidireccionales (Bidirectional Streams)
- Comunicación mediante flujos unidireccionales (Unidirectional Streams)
- Transmisión de datagramas
- El servidor puede iniciar flujos de comunicación activamente
Ejemplo básico
Aquí un ejemplo simplificado de servidor WebTransport usando Salvo:
#[handler]
async fn connect(req: &mut Request) -> Result<(), salvo::Error> {
let session = req.web_transport_mut().await.unwrap();
// Procesar datagramas
if let Ok(Some((_, datagram))) = session.accept_datagram().await {
// Procesar datagrama recibido
let mut resp = BytesMut::from(&b"Response: "[..]);
resp.put(datagram);
session.send_datagram(resp.freeze())?;
}
// Procesar flujo bidireccional
if let Ok(Some(webtransport::server::AcceptedBi::BidiStream(_, stream))) = session.accept_bi().await {
let (send, recv) = salvo::proto::quic::BidiStream::split(stream);
// Procesar datos del flujo bidireccional
}
Ok(())
}
Configuración e inicio
Para iniciar una aplicación Salvo con soporte WebTransport se requiere configurar certificados TLS y un listener QUIC:
let cert = include_bytes!("../certs/cert.pem").to_vec();
let key = include_bytes!("../certs/key.pem").to_vec();
// Configurar rutas
let router = Router::new().push(Router::with_path("counter").goal(connect));
// Configurar TLS
let config = RustlsConfig::new(Keycert::new().cert(cert.as_slice()).key(key.as_slice()));
// Configurar 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;
// Iniciar servidor
Server::new(acceptor).serve(router).await;
Ejemplo completo
Para aprender más sobre el uso de WebTransport en Salvo, consulta el ejemplo completo en GitHub:
https://github.com/salvo-rs/salvo/blob/main/examples/webtransport
Este ejemplo incluye implementaciones completas tanto del lado del servidor como del cliente, mostrando cómo manejar diferentes tipos de comunicación WebTransport.