「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 バックエンドの少なくとも 1 つが必要です。
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
ビルドが成功すると、クライアントとサーバーの実行可能ファイルがexamplesディレクトリの下に見つかるはずです。彼らは 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を実行します。これらのオプションはそれぞれセッションチケットへのパスを指定し、トランスポートパラメータファイルをローカルに保存します。
これらのファイルが利用可能になったら、同じ引数を指定して example/wsslclient を再度実行します。再開が成功すると、セッションが再開されたことがログに表示されます。セッションを再開すると、サーバーは証明書を送信しないため、最初のハンドシェイク パケットがかなり小さくなります。
0-RTT データを送信するには、レジュームが機能することを確認した後、-d オプションを使用して送信するデータを含むファイルを指定します。
QUIC サーバーは、接続の確立後にクライアントにトークンを送信する場合があります。クライアントは、その後のサーバーへの接続でこのトークンを送信できます。サーバーはトークンを検証し、成功するとアドレス検証が完了し、サーバー上のいくつかの制限が解除され、転送速度が向上する可能性があります。トークンを保存および/またはロードするには、examples/wsslclient の --token-file オプションを使用します。トークンを保存するときに指定されたファイルがすでに存在する場合、そのファイルは上書きされます。
TLS スタック統合の負担を軽減するために、基本的な暗号化操作を提供する暗号化ヘルパー ライブラリを提供します。
ヘッダー ファイルは crypto/includes/ngtcp2 ディレクトリに存在します。
各ライブラリ ファイルは、特定の TLS バックエンド用に構築されます。利用可能な暗号ヘルパー ライブラリは次のとおりです。
BoringSSL と Picotls はバージョン管理されていない製品であるため、特定のリビジョンのみをテストしました。上記の「要件」セクションを参照してください。
暗号化バックエンドとして OpenSSL を備えた Picotls を使用します。
サンプル ディレクトリには、暗号化ヘルパー ライブラリと TLS バックエンドにリンクされたクライアントとサーバーが含まれています。これらは、対応する暗号ヘルパー ライブラリが構築されている場合にのみ構築されます。
このライブラリは、次の QUIC プロトコル拡張機能を実装します。
Wireshark は、次の手順を使用して QUIC トラフィックを分析するように構成できます。
SSLKEYLOGFILE環境変数を設定します。
$ export SSLKEYLOGFILE=quic_keylog_file
QUICが使用するポートを設定します
「設定」->「プロトコル」->「QUIC」に移動し、プログラムがリッスンするポートを設定します。サンプル アプリケーションの場合、これはコマンド ラインで指定されたポートになります。
Pre-Master-Secret ログファイルを設定する
[設定] -> [プロトコル] -> [TLS]に移動し、 Pre-Master-Secret ログ ファイルをSSLKEYLOGFILEに指定したのと同じ値に設定します。
キャプチャ用の正しいネットワーク インターフェイスを選択してください
キャプチャ用に正しいネットワーク インターフェイスを選択していることを確認してください。たとえば、localhost を使用する場合は、MacOS 上のループバックネットワーク インターフェイスを選択します。
フィルターを作成する
udp.port のフィルターを作成し、そのポートをアプリケーションがリッスンしているポートに設定します。例えば:
udp.ポート == 7777
MITライセンス
著作権 (c) 2016 ngtcp2 貢献者