“稱之為 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 貢獻者