“称之为 TCP/2。再来一次。”
ngtcp2 项目是实现 RFC9000 QUIC 协议的努力。
提供在线文档。
以下端点可用于尝试 ngtcp2 实现:
https://nghttp2.org:4433
https://nghttp2.org:4434(需要地址验证令牌)
https://nghttp2.org(由 nghttpx 提供支持)
如果通过 HTTP/1.1 或 HTTP/2 访问客户端,此端点会向客户端发送 Alt-Svc 标头字段,以告诉客户端 HTTP/3 在 UDP 443 上可用。
libngtcp2 C 库本身不依赖于任何外部库。示例客户端和服务器是用 C++20 编写的,并且应该使用现代 C++ 编译器进行编译(例如,clang >= 11.0 或 gcc >= 11.0)。
配置构建系统需要以下软件包:
要在示例目录下构建源代码,需要 libev 和 nghttp3:
要在 bsslclient 和 bsslserver(BoringSSL (aws-lc) 示例客户端和服务器)中启用 TLS 证书压缩,需要以下库:
ngtcp2 加密帮助程序库以及示例目录下的客户端和服务器至少需要以下 TLS 后端之一:
从 git 构建时,运行以下命令来拉取子模块:
$ git submodule update --init
$ git clone --depth 1 -b v5.7.4-stable https://github.com/wolfSSL/wolfssl
$ cd wolfssl
$ autoreconf -i
$ # For wolfSSL < v5.6.6, append --enable-quic.
$ ./configure --prefix= $PWD /build
--enable-all --enable-aesni --enable-harden --enable-keylog-export
--disable-ech
$ make -j $( nproc )
$ make install
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/nghttp3
$ cd nghttp3
$ autoreconf -i
$ ./configure --prefix= $PWD /build --enable-lib-only
$ make -j $( nproc ) check
$ make install
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/ngtcp2
$ cd ngtcp2
$ autoreconf -i
$ # For Mac users who have installed libev with MacPorts, append
$ # LIBEV_CFLAGS="-I/opt/local/include" LIBEV_LIBS="-L/opt/local/lib -lev"
$ ./configure PKG_CONFIG_PATH= $PWD /../wolfssl/build/lib/pkgconfig: $PWD /../nghttp3/build/lib/pkgconfig
--with-wolfssl
$ make -j $( nproc ) check
$ git clone https://boringssl.googlesource.com/boringssl
$ cd boringssl
$ git checkout 83fc0d94d7040544480d42db01554f2421cfc081
$ cmake -B build -DCMAKE_POSITION_INDEPENDENT_CODE=ON
$ make -j $( nproc ) -C build
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/nghttp3
$ cd nghttp3
$ autoreconf -i
$ ./configure --prefix= $PWD /build --enable-lib-only
$ make -j $( nproc ) check
$ make install
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/ngtcp2
$ cd ngtcp2
$ autoreconf -i
$ # For Mac users who have installed libev with MacPorts, append
$ # LIBEV_CFLAGS="-I/opt/local/include" LIBEV_LIBS="-L/opt/local/lib -lev"
$ ./configure PKG_CONFIG_PATH= $PWD /../nghttp3/build/lib/pkgconfig
BORINGSSL_LIBS= " -L $PWD /../boringssl/build/ssl -lssl -L $PWD /../boringssl/build/crypto -lcrypto "
BORINGSSL_CFLAGS= " -I $PWD /../boringssl/include "
--with-boringssl
$ make -j $( nproc ) check
$ git clone --depth 1 -b v1.39.0 https://github.com/aws/aws-lc
$ cd aws-lc
$ cmake -B build -DDISABLE_GO=ON
$ make -j $( nproc ) -C build
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/nghttp3
$ cd nghttp3
$ autoreconf -i
$ ./configure --prefix= $PWD /build --enable-lib-only
$ make -j $( nproc ) check
$ make install
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/ngtcp2
$ cd ngtcp2
$ autoreconf -i
$ # For Mac users who have installed libev with MacPorts, append
$ # LIBEV_CFLAGS="-I/opt/local/include" LIBEV_LIBS="-L/opt/local/lib -lev"
$ ./configure PKG_CONFIG_PATH= $PWD /../nghttp3/build/lib/pkgconfig
BORINGSSL_CFLAGS= " -I $PWD /../aws-lc/include "
BORINGSSL_LIBS= " -L $PWD /../aws-lc/build/ssl -lssl -L $PWD /../aws-lc/build/crypto -lcrypto "
--with-boringssl
$ make -j $( nproc ) check
$ git clone --depth 1 -b v4.0.0 https://github.com/libressl/portable.git libressl
$ cd libressl
$ # Workaround autogen.sh failure
$ export LIBRESSL_GIT_OPTIONS= " -b libressl-v4.0.0 "
$ ./autogen.sh
$ ./configure --prefix= $PWD /build
$ make -j $( nproc ) install
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/nghttp3
$ cd nghttp3
$ autoreconf -i
$ ./configure --prefix= $PWD /build --enable-lib-only
$ make -j $( nproc ) check
$ make install
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/ngtcp2
$ cd ngtcp2
$ autoreconf -i
$ # For Mac users who have installed libev with MacPorts, append
$ # LIBEV_CFLAGS="-I/opt/homebrew/Cellar/libev/4.33/include" LIBEV_LIBS="-L/opt/homebrew/Cellar/libev/4.33/lib -lev"
$ ./configure PKG_CONFIG_PATH= $PWD /../nghttp3/build/lib/pkgconfig: $PWD /../libressl/build/lib/pkgconfig
$ make -j $( nproc ) check
成功构建后,应在示例目录下找到客户端和服务器可执行文件。他们谈论 HTTP/3。
$ examples/wsslclient [OPTIONS] < HOST > < PORT > [ < URI > ...]
值得注意的选项是:
-d
, --data=
:从 $ examples/wsslserver [OPTIONS] < ADDR > < PORT > < PRIVATE_KEY_FILE > < CERTIFICATE_FILE >
值得注意的选项是:
-V
, --validate-addr
:强制执行无状态地址验证。 有使用 HTTP/0.9 的 h09wsslclient 和 h09wsslserver。它们是专为 quic-interop-runner 编写的。它们与 HTTP/3 客户端和服务器共享基本功能,但功能较少(例如,h09wsslclient 没有发送请求正文的功能,h09wsslserver 不理解数字请求路径,如 /1000)。
为了恢复会话,必须从服务器获取会话票证和传输参数。首先,使用 --session-file 和 --tp-file 选项运行 Examples/wsslclient,它们分别指定会话票证的路径和传输参数文件以将它们保存在本地。
一旦这些文件可用,请使用相同的参数再次运行示例/wsslclient。如果恢复成功,您将在日志中看到会话已恢复。恢复会话使服务器的第一个握手数据包非常小,因为它不发送其证书。
要发送 0-RTT 数据,请在确保恢复工作正常后,使用 -d 选项指定包含要发送的数据的文件。
建立连接后,QUIC 服务器可能会向客户端发送令牌。客户端可以在后续连接中发送此令牌到服务器。服务器验证令牌,如果成功,则地址验证完成并解除对服务器的一些限制,这可能会加快传输速度。为了保存和/或加载令牌,请使用 Examples/wsslclient 的 --token-file 选项。如果在存储令牌时给定文件已存在,则将覆盖给定文件。
为了减轻 TLS 堆栈集成的痛苦,我们提供了一个加密帮助程序库,它提供基本的加密操作。
头文件位于 crypto/includes/ngtcp2 目录下。
每个库文件都是为特定的 TLS 后端构建的。可用的加密帮助程序库有:
由于 BoringSSL 和 Picotls 是无版本的产品,因此我们仅测试了它们的特定版本。请参阅上面的要求部分。
我们使用 Picotls 和 OpenSSL 作为加密后端。
示例目录包含链接到这些加密帮助程序库和 TLS 后端的客户端和服务器。仅当构建了相应的加密帮助器库时,才会构建它们:
该库实现了以下 QUIC 协议扩展:
可以使用以下步骤将 Wireshark 配置为分析 QUIC 流量:
设置SSLKEYLOGFILE环境变量:
$ export SSLKEYLOGFILE=quic_keylog_file
设置 QUIC 使用的端口
进入Preferences->Protocols->QUIC并设置程序监听的端口。对于示例应用程序,这将是在命令行上指定的端口。
设置 Pre-Master-Secret 日志文件
转到Preferences->Protocols->TLS并将Pre-Master-Secret 日志文件设置为为SSLKEYLOGFILE指定的相同值。
选择正确的网络接口进行捕获
确保选择正确的网络接口进行捕获。例如,如果使用 localhost,请选择 macos 上的环回网络接口。
创建过滤器
为 udp.port 创建过滤器并将端口设置为应用程序正在侦听的端口。例如:
udp.端口==7777
麻省理工学院许可证
版权所有 (c) 2016 ngtcp2 贡献者