#服务器 #firefox #mozilla #ietf #quic #env-var

程序 mozilla/neqo-server

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日

HTTP服务器 中排名 192

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

MIT/Apache

37KB
919

Neqo,一个用Rust编写的QUIC实现

neqo logo

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

  • cargobuild
  • ./target/debug/neqo-server '[::]:12345' --数据库./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"

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

使用 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 为传输设置 'debug' 日志级别,为 http3 设置 'trace' 日志级别,并为 Neqo 和 Gecko 使用的其他所有 Rust 包设置 'info' 日志级别。
  3. RUST_LOG=neqo=trace,error ./mach run 为以 "neqo" 开头的所有模块设置 trace 级别,并将 error 设置为其他不相关 Rust 日志消息的最小日志级别。

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

在已检出的 Gecko 源代码副本中,将四个 Neqo 包的 [patches.*] 值设置为根 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 代码有变化,使用较新的 Neqo 代码与 Gecko 一起使用可能也需要更改(可能是对 neqo_glue 的更改)。

依赖关系

~8–17MB
~210K SLoC