3 个不稳定版本
新 0.7.0-alpha.2 | 2024 年 8 月 16 日 |
---|---|
0.7.0-alpha.1 | 2024 年 7 月 30 日 |
0.6.0 | 2024 年 7 月 30 日 |
#549 in 网络编程
263 个月下载量
320KB
5.5K SLoC
aeronet_webtransport
aeronet 的 WebTransport 传输实现,底层使用 QUIC 协议提供可靠流和不可靠数据报。
这是一个通用的传输库的良好选择。
特性
- 客户端 WASM 支持
- 使用
aeronet_proto
进行可靠性和排序 - 基于 QUIC 构建
- 通过 SSL 证书进行加密
- 加密且具有弹性的数据报
- 通过单个 UDP 套接字复用到多个 QUIC 流
- 服务器可以在建立连接之前允许或拒绝客户端
- 读取客户端头部、权限、源、路径等
入门
清单
将 Crates 添加到您的 Cargo.toml
aeronet = "version"
aeronet_webtransport = "version"
对于原生客户端:为了避免手动生成和管理证书,您可以通过 dangerous-configuration
功能禁用证书身份验证(**仅限测试目的**)。
请参阅 证书 部分,了解如何正确管理证书。
运行时
WebTransport 客户端和服务器使用特定的运行时,即 WebTransportRuntime
,来运行异步任务,该任务管理实际的连接和端点。要连接或打开任何客户端或服务器,您首先需要一个这样的运行时。
您可以使用 Default
实现来创建这些运行时之一,或者在 Bevy 中,使用 App::init_resource::<WebTransportRuntime>()
将运行时作为资源插入。
客户端
使用 WebTransportClient
创建一个断开连接的实例,使用 WebTransportClient::new
,并使用 WebTransportClient::connect
开始建立与服务器的连接,传入您的连接配置(即连接到的 URL、超时时间、通道)。
在 Bevy 中,您可以使用 App::init_resource::<WebTransportClient>()
自动将断开连接的客户端插入到您的应用程序中。
use bevy::prelude::*;
use aeronet_webtransport::{
client::{WebTransportClient, ClientConfig},
runtime::WebTransportRuntime,
};
use aeronet_webtransport::proto::session::SessionConfig;
App::new()
.init_resource::<WebTransportRuntime>()
.init_resource::<WebTransportClient>()
.add_systems(Startup, connect);
fn connect(mut client: ResMut<WebTransportClient>, runtime: Res<WebTransportRuntime>) {
let net_config = create_net_config();
let session_config = create_session_config();
client.connect(
runtime.as_ref(),
net_config,
session_config,
"https://[::1]:1234",
)
.expect("failed to connect client");
}
// this will change depending on whether you target native or WASM
fn create_net_config() -> ClientConfig { unimplemented!() }
fn create_session_config() -> SessionConfig { unimplemented!() }
服务器
使用 WebTransportServer::new
创建一个关闭的 WebTransportServer
,并使用 WebTransportServer::open
开始打开此服务器并监听客户端连接,传入您的服务器配置(即绑定到的端口)。
在 Bevy 中,您可以使用 App::init_resource::<WebTransportServer>()
自动将关闭的服务器插入到您的应用程序中。
重要:在收到 ServerEvent::Connecting
事件后,您必须手动决定是否接受或拒绝客户端。
- 使用
server::Connecting
根据客户端的路径、授权、HTTP 头等信息来决定是否接受此客户端。 - 使用
WebTransportServer::respond_to_request
来决定是否允许此客户端连接。
use bevy::prelude::*;
use aeronet_webtransport::{
server::{WebTransportServer, ServerConfig},
runtime::WebTransportRuntime,
};
use aeronet_webtransport::proto::session::SessionConfig;
App::new()
.init_resource::<WebTransportRuntime>()
.init_resource::<WebTransportServer>()
.add_systems(Startup, open);
fn open(mut server: ResMut<WebTransportServer>, runtime: Res<WebTransportRuntime>) {
let net_config = create_net_config();
let session_config = create_session_config();
server.open(
runtime.as_ref(),
net_config,
session_config,
)
.expect("failed to open server");
}
fn create_net_config() -> ServerConfig { unimplemented!() }
fn create_session_config() -> SessionConfig { unimplemented!() }
证书
由于 WebTransport 使用 TLS,因此也使用 SSL 证书来加密连接,您必须管理这些证书以确保客户端可以连接到您的服务器。
由证书颁发机构签名
如果您已经有一个由证书颁发机构签名的 SSL 证书,您可以配置您的服务器使用该证书。信任该 CA(无论是本地还是 WASM)的客户端将能够连接到您的服务器而无需任何额外配置。
自签名
模块: cert
如果您希望生成自己的自签名证书,未配置的客户端默认情况下无法连接到您的服务器,因为这些证书不是由客户端信任的 CA 签名的(由于您是自签名的,客户端不会信任您的服务器)。
一旦生成证书,您可以从它们获取
- 证书哈希 - 证书 DER 的 SHA-256 消息摘要
- SPKI 指纹 - 证书公钥的 SHA-256 消息摘要
WebTransport 提供了一种专门用于连接到临时服务器或难以路由的服务器的机制(例如,可以根据需要启动/关闭的虚拟机或虚拟服务器)。您可以指定客户端将隐式信任的一组 证书哈希(这些证书有一些限制 - 请参阅 WebTransport 文档)。
在服务器端,使用您的服务器证书上的 cert::hash_to_b64
生成证书哈希的 base 64 编码版本。在客户端,使用 cert::hash_from_b64
将 base 64 字符串解码为证书哈希的字节。您可以使用此证书哈希值在 ClientConfigBuilder
(在本地)或 WebTransportOptions
(在 WASM)中使客户端信任此证书。
或者,您可以配置您的浏览器以信任使用给定公钥签名的所有证书。这就是 SPKI 指纹 的用途。
在 Chromium 上,使用以下标志
chromium \
--webtransport-developer-mode \
--ignore-certificate-errors-spki-list=[SPKI fingerprint]
在 Firefox 上,我不知道等效的标志是什么。请提交 PR!
依赖关系
~4–20MB
~282K SLoC