3 个不稳定版本

0.7.0-alpha.2 2024 年 8 月 16 日
0.7.0-alpha.12024 年 7 月 30 日
0.6.0 2024 年 7 月 30 日

#549 in 网络编程

Download history 213/week @ 2024-07-27 13/week @ 2024-08-03 37/week @ 2024-08-10

263 个月下载量

MIT/Apache

320KB
5.5K SLoC

aeronet_webtransport

crates.io docs.rs

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