Git Product home page Git Product logo

ngtcp2's Introduction

ngtcp2

"Call it TCP/2. One More Time."

ngtcp2 project is an effort to implement RFC9000 QUIC protocol.

Documentation

Online documentation is available.

Public test server

The following endpoints are available to try out ngtcp2 implementation:

Requirements

The libngtcp2 C library itself does not depend on any external libraries. The example client, and server are written in C++17, and should compile with the modern C++ compilers (e.g., clang >= 8.0, or gcc >= 8.0).

The following packages are required to configure the build system:

  • pkg-config >= 0.20
  • autoconf
  • automake
  • autotools-dev
  • libtool

libngtcp2 uses cunit for its unit test frame work:

  • cunit >= 2.1

To build sources under the examples directory, libev and nghttp3 are required:

ngtcp2 crypto helper library, and client and server under examples directory require at least one of the following TLS backends:

  • OpenSSL with QUIC support
  • GnuTLS >= 3.7.2
  • BoringSSL (commit 27ffcc6e19bbafddf1b59ec0bc6df2904de7eb2c)
  • Picotls (commit 821997cb35ecf02d4518a1b5749a3cd6200b5b87)

Build from git

$ git clone --depth 1 -b OpenSSL_1_1_1o+quic https://github.com/quictls/openssl
$ cd openssl
$ # For Linux
$ ./config enable-tls1_3 --prefix=$PWD/build
$ make -j$(nproc)
$ make install_sw
$ cd ..
$ git clone 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 https://github.com/ngtcp2/ngtcp2
$ cd ngtcp2
$ autoreconf -i
$ # For Mac users who have installed libev with MacPorts, append
$ # ',-L/opt/local/lib' to LDFLAGS, and also pass
$ # CPPFLAGS="-I/opt/local/include" to ./configure.
$ # For OpenSSL >= v3.0.0, replace "openssl/build/lib" with
$ # "openssl/build/lib64".
$ ./configure PKG_CONFIG_PATH=$PWD/../openssl/build/lib/pkgconfig:$PWD/../nghttp3/build/lib/pkgconfig LDFLAGS="-Wl,-rpath,$PWD/../openssl/build/lib"
$ make -j$(nproc) check

Client/Server

After successful build, the client and server executable should be found under examples directory. They talk HTTP/3.

Client

$ examples/client [OPTIONS] <HOST> <PORT> [<URI>...]

The notable options are:

  • -d, --data=<PATH>: Read data from <PATH> and send it to a peer.

Server

$ examples/server [OPTIONS] <ADDR> <PORT> <PRIVATE_KEY_FILE> <CERTIFICATE_FILE>

The notable options are:

  • -V, --validate-addr: Enforce stateless address validation.

H09client/H09server

There are h09client and h09server which speak HTTP/0.9. They are written just for quic-interop-runner. They share the basic functionalities with HTTP/3 client and server but have less functions (e.g., h09client does not have a capability to send request body, and h09server does not understand numeric request path, like /1000).

Resumption and 0-RTT

In order to resume a session, a session ticket, and a transport parameters must be fetched from server. First, run examples/client with --session-file, and --tp-file options which specify a path to session ticket, and transport parameter files respectively to save them locally.

Once these files are available, run examples/client with the same arguments again. You will see that session is resumed in your log if resumption succeeds. Resuming session makes server's first Handshake packet pretty small because it does not send its certificates.

To send 0-RTT data, after making sure that resumption works, use -d option to specify a file which contains data to send.

Token (Not something included in Retry packet)

QUIC server might send a token to client after connection has been established. Client can send this token in subsequent connection to the server. Server verifies the token and if it succeeds, the address validation completes and lifts some restrictions on server which might speed up transfer. In order to save and/or load a token, use --token-file option of examples/client. The given file is overwritten if it already exists when storing a token.

Crypto helper library

In order to make TLS stack integration less painful, we provide a crypto helper library which offers the basic crypto operations.

The header file exists under crypto/includes/ngtcp2 directory.

Each library file is built for a particular TLS backend. The available crypto helper libraries are:

  • libngtcp2_crypto_openssl: Use OpenSSL as TLS backend
  • libngtcp2_crypto_gnutls: Use GnuTLS as TLS backend
  • libngtcp2_crypto_boringssl: Use BoringSSL as TLS backend
  • libngtcp2_crypto_picotls: Use Picotls as TLS backend

Because BoringSSL and Picotls are an unversioned product, we only tested their particular revision. See Requirements section above.

We use Picotls with OpenSSL as crypto backend. It does not work with OpenSSL >= 3.0.0.

The examples directory contains client and server that are linked to those crypto helper libraries and TLS backends. They are only built if their corresponding crypto helper library is built:

  • client: OpenSSL client
  • server: OpenSSL server
  • gtlsclient: GnuTLS client
  • gtlsserver: GnuTLS server
  • bsslclient: BoringSSL client
  • bsslserver: BoringSSL server
  • ptlsclient: Picotls client
  • ptlsserver: Picotls server

QUIC protocol extensions

The library implements the following QUIC protocol extensions:

Configuring Wireshark for QUIC

Wireshark can be configured to analyze QUIC traffic using the following steps:

  1. Set SSLKEYLOGFILE environment variable:

    $ export SSLKEYLOGFILE=quic_keylog_file
  2. Set the port that QUIC uses

    Go to Preferences->Protocols->QUIC and set the port the program listens to. In the case of the example application this would be the port specified on the command line.

  3. Set Pre-Master-Secret logfile

    Go to Preferences->Protocols->TLS add set the Pre-Master-Secret log file to the same value that was specified for SSLKEYLOGFILE.

  4. Choose the correct network interface for capturing

    Make sure you choose the correct network interface for capturing. For example, if using localhost choose the loopback network interface on macos.

  5. Create a filter

    Create A filter for the udp.port and set the port to the port the application is listening to. For example:

    udp.port == 7777

License

The MIT License

Copyright (c) 2016 ngtcp2 contributors

ngtcp2's People

Contributors

addaleax avatar alagoutte avatar amirlivneh avatar daandemeyer avatar danbev avatar donny-dont avatar flx413 avatar gengjiawen avatar jasnell avatar jblazquez avatar jpboivin avatar junqiwang avatar ken1no avatar lekensteyn avatar natris avatar nickfajones avatar nktelnet avatar rhoxn avatar roticv avatar scw00 avatar t8m avatar tatsuhiro-t avatar timgates42 avatar tingping avatar ueno avatar utoni avatar valere91 avatar woshimaliang avatar xiaozhihong avatar zizhong avatar

Forkers

lhuang04

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.