WebTransport

WebTransportはHTTP/3を基盤とするネットワーク転送プロトコルで、クライアントとサーバー間の双方向通信機能を提供し、低遅延、高スループット、セキュリティを兼ね備えています。

適用シナリオ

WebTransportは特に以下のようなシナリオに適しています:

  • リアルタイムアプリケーション:オンラインゲーム、リアルタイムコラボレーションツール、ビデオ会議など、低遅延通信を必要とするアプリケーション
  • 大容量ファイル転送:高スループットのデータ転送をサポートし、メディアストリーミングや大容量ファイルのアップロード・ダウンロードに適しています
  • 多重化通信:複数の双方向および単方向データストリームを同時に確立できます
  • データグラム通信:順序保証や信頼性を保証しないデータグラム通信をサポートし、リアルタイム性が極めて高いシナリオに適しています

WebSocketと比較して、WebTransportはより低い遅延とより柔軟な通信モードを提供し、特に不安定なネットワーク環境で優れたパフォーマンスを発揮します。

Salvoの実装

SalvoフレームワークはWebTransportの組み込みサポートを提供し、開発者がWebTransportベースのアプリケーションを簡単に構築できるようにします。主な機能は以下の通りです:

  • WebTransportセッションの確立をサポート
  • 双方向ストリーム(Bidirectional Streams)通信をサポート
  • 単方向ストリーム(Unidirectional Streams)通信をサポート
  • データグラム(Datagrams)転送をサポート
  • サーバーが能動的に通信ストリームを開始可能

簡単な例

以下はSalvoを使用したWebTransportサーバーの簡略化された例です:

#[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(())
}

設定と起動

WebTransportをサポートするSalvoアプリケーションを起動するには、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", 8698)).rustls(config.clone());
let acceptor = QuinnListener::new(config, ("0.0.0.0", 8698))
    .join(listener)
    .bind()
    .await;

// サーバーの起動
Server::new(acceptor).serve(router).await;

完全な例

SalvoにおけるWebTransportの使用方法について詳しく知りたい場合は、GitHub上の完全な例を参照してください: https://github.com/salvo-rs/salvo/blob/main/examples/webtransport

この例にはサーバーサイドとクライアントサイドの完全な実装が含まれており、様々なタイプのWebTransport通信の処理方法を示しています。