Neqo is the QUIC implementation used by Mozilla in Firefox and other products. It is written in Rust and provides a library for QUIC transport, HTTP/3, and QPACK. The TLS security backend is the Mozilla NSS library, which is also used by Firefox.
Neqo is designed to be used in Firefox, but it can also be used
standalone. We include command line tools for testing and debugging, such as
neqo-client and neqo-server, which can be used to test HTTP/3 servers
and clients.
Note: The neqo server functionality is experimental, since it is not in production use at Mozilla, and it is not as mature as the client functionality. It is intended to be standards-compliant when interoperating with a compliant client, but it may not implement all optional protocol features, and it may not handle all edge cases. It is also not optimized for performance or resource usage, and while it implements many of the necessary features for a server, it does not include configuration of a number of options that is suited to a live deployment. Do not use the neqo server code in production.
To build Neqo:
cargo buildThis will use a system-installed NSS library if it is new enough. (See "Build with Separate NSS/NSPR" below if NSS is not installed or it is deemed too old.)
To run test HTTP/3 programs (neqo-client and neqo-server):
./target/debug/neqo-server '[::]:12345'
./target/debug/neqo-client 'https://[::]:12345/'-
Clone NSS and NSPR into the same directory and export an environment variable called
NSS_DIRpointing to NSS. For example if you have a folder$HOME/neqo-dependenciesand cloned NSS and NSPR into it you'd setNSS_DIR=$HOME/neqo-dependencies/nss. -
If you did not already compile NSS separately, you need to have Mercurial (hg) installed. NSS builds require GYP and Ninja to be installed.
-
Run
cargo buildin yourneqocheckout. The prior steps enablecargo buildto use the existing NSS build or build it from the existing checkout if it hasn't been built yet. -
Now that NSS has been built you need to set another environment variable to be able to actually do anything that depends on NSS.
-
For Linux:
export LD_LIBRARY_PATH="$(find $NSS_DIR/.. -name libssl3.so -print | head -1 | xargs dirname | xargs realpath)"
-
For MacOS:
export DYLD_LIBRARY_PATH="$(find $NSS_DIR/.. -name libssl3.dylib -print | head -1 | xargs dirname | xargs realpath)"
-
-
(optional) After having an NSS build you can set the
NSS_PREBUILT=1environment variable to skip building NSS again on futurecargo buildinvocations.
To confirm the NSS setup works you can run cargo test -p neqo-crypto --lib.
Enable generation of QLOG logs with:
target/debug/neqo-server '[::]:12345' --qlog-dir .
target/debug/neqo-client 'https://[::]:12345/' --qlog-dir .You can of course specify a different directory for the QLOG files. You can upload QLOG files to qvis to visualize the flows.
To export QLOG files for Neqo Simulator runs, set the
environment variable QLOGDIR. For example:
QLOGDIR=/tmp/qlog cargo bench --bench min_bandwidth --features benchYou can export TLS keys by setting the SSLKEYLOGFILE environment variable
to a filename to instruct NSS to dump keys in the
standard format
to enable decryption by Wireshark and other tools.
As documented in the env_logger documentation,
the RUST_LOG environment variable can be used to selectively enable log messages
from Rust code. This works for Neqo's command line tools, as well as for when Neqo is
incorporated into Gecko, although Gecko needs to be built in debug mode.
Some examples:
-
RUST_LOG=neqo_transport::dump ./mach run
lists sent and received QUIC packets and their frames' contents only.
-
RUST_LOG=neqo_transport=debug,neqo_http3=trace,info ./mach run
sets a
debuglog level fortransport,tracelevel forhttp3, andinfolog level for all other Rust crates, both Neqo and others used by Gecko. -
RUST_LOG=neqo=trace,error ./mach run
sets
tracelevel for all modules starting withneqo, and setserroras minimum log level for other unrelated Rust log messages.
In a checked-out copy of Gecko source, set [patches.*] values for the four
Neqo crates to local versions in the root Cargo.toml. For example, if Neqo
was checked out to /home/alice/git/neqo, add the following lines to the root
Cargo.toml.
[patch."https://github.com/mozilla/neqo"]
neqo-bin = { path = "/home/alice/git/neqo/neqo-bin" }
neqo-common = { path = "/home/alice/git/neqo/neqo-common" }
neqo-crypto = { path = "/home/alice/git/neqo/neqo-crypto" }
neqo-http3 = { path = "/home/alice/git/neqo/neqo-http3" }
neqo-qpack = { path = "/home/alice/git/neqo/neqo-qpack" }
neqo-transport = { path = "/home/alice/git/neqo/neqo-transport" }
neqo-udp = { path = "/home/alice/git/neqo/neqo-udp" }Then run the following:
./mach vendor rustCompile Gecko as usual with
./mach buildNote: Using newer Neqo code with Gecko may also require changes (likely to neqo_glue) if
something has changed.
- Run
neqo-serverviacargo run --bin neqo-server -- 'localhost:12345' --db ./test-fixture/db. - On Firefox, set
about:configpreferences:network.http.http3.alt-svc-mapping-for-testingtolocalhost;h3=":12345"network.http.http3.disable_when_third_party_roots_foundtofalse
- Optionally enable logging via
about:loggingor profiling via https://profiler.firefox.com/. - Navigate to https://localhost:12345 and accept self-signed certificate.
