"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 헤더 필드를 보내 UDP 443에서 HTTP/3을 사용할 수 있음을 알려줍니다.
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 옵션과 함께 example/wsslclient를 실행하고 매개변수 파일을 전송하여 로컬에 저장합니다.
이러한 파일을 사용할 수 있게 되면 동일한 인수를 사용하여 example/wsslclient를 다시 실행하십시오. 재개에 성공하면 로그에 세션이 재개된 것을 확인할 수 있습니다. 세션을 재개하면 서버의 첫 번째 핸드셰이크 패킷이 매우 작아집니다. 인증서를 보내지 않기 때문입니다.
0-RTT 데이터를 전송하려면 재개가 작동하는지 확인한 후 -d 옵션을 사용하여 전송할 데이터가 포함된 파일을 지정하십시오.
QUIC 서버는 연결이 설정된 후 클라이언트에 토큰을 보낼 수 있습니다. 클라이언트는 서버에 대한 후속 연결에서 이 토큰을 보낼 수 있습니다. 서버는 토큰을 확인하고 성공하면 주소 확인이 완료되고 서버에 대한 일부 제한 사항이 해제되어 전송 속도가 빨라질 수 있습니다. 토큰을 저장 및/또는 로드하려면 example/wsslclient의 --token-file 옵션을 사용하세요. 토큰을 저장할 때 해당 파일이 이미 존재하는 경우 해당 파일을 덮어씁니다.
TLS 스택 통합의 고통을 덜기 위해 우리는 기본 암호화 작업을 제공하는 암호화 도우미 라이브러리를 제공합니다.
헤더 파일은 crypto/includes/ngtcp2 디렉터리에 있습니다.
각 라이브러리 파일은 특정 TLS 백엔드용으로 구축되었습니다. 사용 가능한 암호화 도우미 라이브러리는 다음과 같습니다.
BoringSSL과 Picotls는 버전이 없는 제품이므로 특정 개정판만 테스트했습니다. 위의 요구 사항 섹션을 참조하세요.
우리는 암호화 백엔드로 OpenSSL과 함께 Picotls를 사용합니다.
예제 디렉터리에는 해당 암호화 도우미 라이브러리 및 TLS 백엔드에 연결된 클라이언트와 서버가 포함되어 있습니다. 해당 암호화 도우미 라이브러리가 빌드된 경우에만 빌드됩니다.
라이브러리는 다음과 같은 QUIC 프로토콜 확장을 구현합니다.
다음 단계를 사용하여 QUIC 트래픽을 분석하도록 Wireshark를 구성할 수 있습니다.
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.port == 7777
MIT 라이센스
저작권 (c) 2016 ngtcp2 기여자