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", 5800)).rustls(config.clone());
let acceptor = QuinnListener::new(config, ("0.0.0.0", 5800))
.join(listener)
.bind()
.await;
// サーバー起動
Server::new(acceptor).serve(router).await;
完全なサンプル
SalvoにおけるWebTransportの使用方法についてさらに詳しく知りたい場合は、GitHub上の完全なサンプルを参照してください:
https://github.com/salvo-rs/salvo/blob/main/examples/webtransport
このサンプルにはサーバーサイドとクライアントサイドの完全な実装が含まれており、様々なタイプのWebTransport通信を処理する方法が示されています。