"Llámalo TCP/2. Una vez más".
El proyecto ngtcp2 es un esfuerzo para implementar el protocolo QUIC RFC9000.
La documentación en línea está disponible.
Los siguientes puntos finales están disponibles para probar la implementación de ngtcp2:
https://nghttp2.org:4433
https://nghttp2.org:4434 (requiere token de validación de dirección)
https://nghttp2.org (con tecnología de nghttpx)
Este punto final envía el campo de encabezado Alt-Svc a los clientes si se accede a través de HTTP/1.1 o HTTP/2 para informarles que HTTP/3 está disponible en UDP 443.
La biblioteca C libngtcp2 en sí no depende de ninguna biblioteca externa. El cliente y el servidor de ejemplo están escritos en C++ 20 y deben compilarse con los compiladores modernos de C++ (por ejemplo, clang >= 11.0 o gcc >= 11.0).
Se requieren los siguientes paquetes para configurar el sistema de compilación:
Para crear fuentes en el directorio de ejemplos, se requieren libev y nghttp3:
Para habilitar la compresión de certificados TLS en bsslclient y bsslserver (ejemplos de cliente y servidor de BoringSSL (aws-lc)), se requiere la siguiente biblioteca:
La biblioteca de ayuda criptográfica ngtcp2 y el cliente y el servidor en el directorio de ejemplos requieren al menos uno de los siguientes backends TLS:
Cuando construya desde git, ejecute el siguiente comando para extraer submódulos:
$ 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
Después de una compilación exitosa, el ejecutable del cliente y del servidor debería encontrarse en el directorio de ejemplos. Hablan HTTP/3.
$ examples/wsslclient [OPTIONS] < HOST > < PORT > [ < URI > ...]
Las opciones notables son:
-d
, --data=
: lee datos de $ examples/wsslserver [OPTIONS] < ADDR > < PORT > < PRIVATE_KEY_FILE > < CERTIFICATE_FILE >
Las opciones notables son:
-V
, --validate-addr
: aplica la validación de direcciones sin estado. Hay h09wsslclient y h09wsslserver que hablan HTTP/0.9. Están escritos sólo para quic-interop-runner. Comparten las funcionalidades básicas con el cliente y servidor HTTP/3, pero tienen menos funciones (por ejemplo, h09wsslclient no tiene la capacidad de enviar el cuerpo de la solicitud y h09wsslserver no comprende la ruta de solicitud numérica, como /1000).
Para reanudar una sesión, se deben obtener del servidor un ticket de sesión y parámetros de transporte. Primero, ejecute ejemplos/wsslclient con las opciones --session-file y --tp-file que especifican una ruta al ticket de sesión y transportan archivos de parámetros respectivamente para guardarlos localmente.
Una vez que estos archivos estén disponibles, ejecute ejemplos/wsslclient nuevamente con los mismos argumentos. Verá que la sesión se reanuda en su registro si la reanudación se realiza correctamente. La reanudación de la sesión hace que el primer paquete de protocolo de enlace del servidor sea bastante pequeño porque no envía sus certificados.
Para enviar datos 0-RTT, después de asegurarse de que la reanudación funcione, use la opción -d para especificar un archivo que contenga datos para enviar.
El servidor QUIC puede enviar un token al cliente una vez establecida la conexión. El cliente puede enviar este token en una conexión posterior al servidor. El servidor verifica el token y, si tiene éxito, se completa la validación de la dirección y elimina algunas restricciones en el servidor que podrían acelerar la transferencia. Para guardar y/o cargar un token, use la opción --token-file de ejemplos/wsslclient. El archivo proporcionado se sobrescribe si ya existe al almacenar un token.
Para que la integración de la pila TLS sea menos complicada, proporcionamos una biblioteca de ayuda criptográfica que ofrece las operaciones criptográficas básicas.
El archivo de encabezado existe en el directorio crypto/includes/ngtcp2.
Cada archivo de biblioteca está creado para un backend TLS particular. Las bibliotecas de ayuda criptográfica disponibles son:
Debido a que BoringSSL y Picotls son un producto sin versión, solo probamos su revisión particular. Consulte la sección Requisitos más arriba.
Usamos Picotls con OpenSSL como backend criptográfico.
El directorio de ejemplos contiene clientes y servidores que están vinculados a esas bibliotecas de ayuda criptográfica y backends TLS. Solo se crean si se crea su biblioteca de ayuda criptográfica correspondiente:
La biblioteca implementa las siguientes extensiones del protocolo QUIC:
Wireshark se puede configurar para analizar el tráfico QUIC siguiendo los siguientes pasos:
Establezca la variable de entorno SSLKEYLOGFILE :
$ export SSLKEYLOGFILE=quic_keylog_file
Establecer el puerto que utiliza QUIC
Vaya a Preferencias->Protocolos->QUIC y configure el puerto que escucha el programa. En el caso de la aplicación de ejemplo, este sería el puerto especificado en la línea de comando.
Establecer el archivo de registro Pre-Master-Secret
Vaya a Preferencias->Protocolos->TLS y establezca el archivo de registro Pre-Master-Secret en el mismo valor que se especificó para SSLKEYLOGFILE .
Elija la interfaz de red correcta para capturar
Asegúrese de elegir la interfaz de red correcta para la captura. Por ejemplo, si usa localhost, elija la interfaz de red loopback en macos.
Crear un filtro
Cree un filtro para udp.port y configure el puerto en el puerto que la aplicación está escuchando. Por ejemplo:
udp.puerto == 7777
La licencia MIT
Copyright (c) 2016 contribuyentes de ngtcp2