#firefox #mozilla #ietf #client #quic #process

app mozilla/neqo-client

Neqo,使用 Rust 编写的 QUIC 实现

30 个版本

0.8.1 2024 年 7 月 22 日
0.7.9 2024 年 5 月 30 日
0.7.2 2024 年 3 月 13 日
0.6.8 2023 年 11 月 22 日
0.5.4 2021 年 11 月 29 日

#238 in Web 编程

1,801 stars & 38 watchers

MIT/Apache

49KB
1.5K 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日志

信息在此

TODO:需要什么最低版本的Wireshark?TODO:上面的链接可能不正确,协议现在称为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为传输设置“调试”日志级别,为http3设置“跟踪”级别,为所有其他Rust包设置“信息”日志级别,包括Neqo和其他Gecko使用的包。
  3. RUST_LOG=neqo=trace,error ./mach run为以“neqo”开头的所有模块设置trace级别,并将error设置为其他不相关Rust日志消息的最小日志级别。

在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)。

依赖项

~5MB
~112K SLoC