#firefox #ietf #mozilla

mozilla/neqo-transport

Neqo,使用 Rust 实现的 QUIC

30 个版本

0.8.2 2024 年 8 月 6 日
0.8.1 2024 年 7 月 22 日
0.7.9 2024 年 5 月 30 日
0.7.2 2024 年 3 月 13 日
0.5.4 2021 年 11 月 29 日

#9#ietf

1,806 个星标 & 38 个关注者

MIT/Apache

1MB
27K SLoC

Neqo,使用 Rust 实现的 QUIC

neqo logo

运行测试 HTTP/3 程序(neqo-client 和 neqo-server)

  • cargobuild
  • ./target/debug/neqo-server '[::]:12345' --db./test-fixture/db
  • ./target/debug/neqo-clienthttp://127.0.0.1:12345/

如果运行时出现“无法加载动态库”错误,请执行以下操作

export LD_LIBRARY_PATH="$(dirname "$(find . -name libssl3.so -print | head -1)")"

在 macOS 上,执行以下操作

export DYLD_LIBRARY_PATH="$(dirname "$(find . -name libssl3.dylib -print | head -1)")"

使用独立的 NSS/NSPR 加快构建速度

您可以将 NSS (https://hg.mozilla.org/projects/nss) 和 NSPR (https://hg.mozilla.org/projects/nspr) 克隆到同一目录中,并导出一个名为 NSS_DIR 的环境变量,指向 NSS。这会导致构建使用现有的 NSS 检出。但是,为了运行任何依赖于 NSS 的内容,您需要将 $\[DY]LD\_LIBRARY\_PATH 设置为指向 $NSS_DIR/../dist/Debug/lib

注意:如果您没有单独编译 NSS,则需要安装 mercurial (hg)。NSS 构建需要 gyp 和 ninja(或 ninja-build)。

调试 Neqo

QUIC 日志记录

使用以下命令启用 QLOG

$ mkdir "$logdir"
$ ./target/debug/neqo-server '[::]:12345' --db ./test-fixture/db --qlog-dir "$logdir"
$ ./target/debug/neqo-client 'https://[::]:12345/' --qlog-dir "$logdir"

您可以通过上传 QLOG 文件并使用https://qvis.quictools.info/ 来可视化流量。

使用 SSLKEYLOGFILE 解密 Wireshark 日志

信息在这里

待办:需要最低的 Wireshark 版本是什么?待办:上面的链接可能不正确,现在协议称为 TLS 而不是 SSL?

有效地使用 RUST_LOG

env_logger 文档所述,环境变量 RUST_LOG 可以用来选择性启用 Rust 代码中的日志消息。这适用于 Neqo 的命令行工具,以及 Neqo 集成到 Gecko 的情况,尽管 Gecko 需要在调试模式下编译

一些示例

  1. RUST_LOG=neqo_transport::dump ./mach run 仅列出发送和接收的 QUIC 数据包及其帧内容。
  2. RUST_LOG=neqo_transport=debug,neqo_http3=trace,info ./mach run 将传输的日志级别设置为 'debug',http3 的日志级别设置为 'trace',Gecko 使用的 Neqo 和其他 Rust 包的日志级别设置为 'info'。
  3. RUST_LOG=neqo=trace,error ./mach run 将所有以 "neqo" 开头的模块的日志级别设置为 trace,并将其他无关 Rust 日志消息的最低日志级别设置为 error

在 Gecko 中尝试开发中的 Neqo 代码

在检查出的 Gecko 源代码副本中,将四个 Neqo 包的值在根目录下的 Cargo.toml 中设置为本地版本。例如,如果 Neqo 检出到 /home/alice/git/neqo,则将以下行添加到根目录下的 Cargo.toml

[patch."https://github.com/mozilla/neqo"]
neqo-http3 = { path = "/home/alice/git/neqo/neqo-http3" }
neqo-transport = { path = "/home/alice/git/neqo/neqo-transport" }
neqo-common = { path = "/home/alice/git/neqo/neqo-common" }
neqo-qpack = { path = "/home/alice/git/neqo/neqo-qpack" }
neqo-crypto = { path = "/home/alice/git/neqo/neqo-crypto" }

然后运行以下命令

./mach vendor rust

使用 ./mach build 按常规方式编译 Gecko。

注意:使用较新的 Neqo 代码与 Gecko 一起使用可能还需要更改(可能需要更改 neqo_glue)如果有所改变。

依赖项

~1MB
~20K SLoC