"Sebut saja TCP/2. Sekali Lagi."
Proyek ngtcp2 adalah upaya untuk mengimplementasikan protokol QUIC RFC9000.
Dokumentasi online tersedia.
Titik akhir berikut tersedia untuk mencoba implementasi ngtcp2:
https://nghttp2.org:4433
https://nghttp2.org:4434 (memerlukan token validasi alamat)
https://nghttp2.org (didukung oleh nghttpx)
Titik akhir ini mengirimkan bidang header Alt-Svc ke klien jika diakses melalui HTTP/1.1 atau HTTP/2 untuk memberi tahu mereka bahwa HTTP/3 tersedia di UDP 443.
Pustaka libngtcp2 C sendiri tidak bergantung pada pustaka eksternal mana pun. Contoh klien dan server ditulis dalam C++20, dan harus dikompilasi dengan kompiler C++ modern (misalnya, clang >= 11.0, atau gcc >= 11.0).
Paket berikut diperlukan untuk mengonfigurasi sistem build:
Untuk membangun sumber di bawah direktori contoh, diperlukan libev dan nghttp3:
Untuk mengaktifkan Kompresi Sertifikat TLS di bsslclient dan bsslserver (klien dan server contoh BoringSSL (aws-lc)), diperlukan pustaka berikut:
perpustakaan pembantu kripto ngtcp2, dan klien serta server di bawah direktori contoh memerlukan setidaknya satu dari backend TLS berikut:
Saat membangun dari git, jalankan perintah berikut untuk menarik submodul:
$ 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
Setelah build berhasil, klien dan server yang dapat dieksekusi akan ditemukan di direktori contoh. Mereka berbicara HTTP/3.
$ examples/wsslclient [OPTIONS] < HOST > < PORT > [ < URI > ...]
Opsi penting adalah:
-d
, --data=
: Membaca data dari $ examples/wsslserver [OPTIONS] < ADDR > < PORT > < PRIVATE_KEY_FILE > < CERTIFICATE_FILE >
Opsi penting adalah:
-V
, --validate-addr
: Menerapkan validasi alamat tanpa kewarganegaraan. Ada h09wsslclient dan h09wsslserver yang berbicara HTTP/0.9. Mereka ditulis hanya untuk quic-interop-runner. Mereka berbagi fungsi dasar dengan klien dan server HTTP/3 tetapi memiliki lebih sedikit fungsi (misalnya, klien h09wssl tidak memiliki kemampuan untuk mengirim isi permintaan, dan h09wsslserver tidak memahami jalur permintaan numerik, seperti /1000).
Untuk melanjutkan sesi, tiket sesi, dan parameter transportasi harus diambil dari server. Pertama, jalankan contoh/wsslclient dengan opsi --session-file, dan --tp-file yang menentukan jalur ke tiket sesi, dan mengangkut file parameter masing-masing untuk menyimpannya secara lokal.
Setelah file-file ini tersedia, jalankan kembali example/wsslclient dengan argumen yang sama. Anda akan melihat sesi tersebut dilanjutkan di log Anda jika dimulainya kembali berhasil. Melanjutkan sesi membuat paket Handshake pertama di server menjadi cukup kecil karena tidak mengirimkan sertifikatnya.
Untuk mengirim data 0-RTT, setelah memastikan bahwa dimulainya kembali berfungsi, gunakan opsi -d untuk menentukan file yang berisi data yang akan dikirim.
Server QUIC mungkin mengirim token ke klien setelah koneksi dibuat. Klien dapat mengirim token ini pada koneksi berikutnya ke server. Server memverifikasi token dan jika berhasil, validasi alamat selesai dan menghilangkan beberapa batasan pada server yang mungkin mempercepat transfer. Untuk menyimpan dan/atau memuat token, gunakan opsi --token-file dari contoh/wsslclient. File yang diberikan akan ditimpa jika sudah ada saat menyimpan token.
Untuk membuat integrasi tumpukan TLS tidak terlalu merepotkan, kami menyediakan perpustakaan pembantu kripto yang menawarkan operasi kripto dasar.
File header ada di bawah direktori crypto/includes/ngtcp2.
Setiap file perpustakaan dibuat untuk backend TLS tertentu. Pustaka pembantu kripto yang tersedia adalah:
Karena BoringSSL dan Picotls adalah produk yang tidak berversi, kami hanya menguji revisi khusus mereka. Lihat bagian Persyaratan di atas.
Kami menggunakan Picotls dengan OpenSSL sebagai backend kripto.
Direktori contoh berisi klien dan server yang ditautkan ke pustaka pembantu kripto dan backend TLS tersebut. Mereka hanya dibangun jika perpustakaan pembantu kripto yang sesuai dibangun:
Perpustakaan mengimplementasikan ekstensi protokol QUIC berikut:
Wireshark dapat dikonfigurasi untuk menganalisis lalu lintas QUIC menggunakan langkah-langkah berikut:
Setel variabel lingkungan SSLKEYLOGFILE :
$ export SSLKEYLOGFILE=quic_keylog_file
Atur port yang digunakan QUIC
Buka Preferensi->Protokol->QUIC dan atur port yang didengarkan program. Dalam kasus contoh aplikasi ini adalah port yang ditentukan pada baris perintah.
Setel file log Pra-Master-Rahasia
Buka Preferences->Protocols->TLS dan atur file log Pre-Master-Secret ke nilai yang sama yang ditentukan untuk SSLKEYLOGFILE .
Pilih antarmuka jaringan yang benar untuk pengambilan gambar
Pastikan Anda memilih antarmuka jaringan yang benar untuk pengambilan gambar. Misalnya, jika menggunakan localhost pilih antarmuka jaringan loopback di macOS.
Buat penyaring
Buat filter untuk udp.port dan atur port ke port yang didengarkan aplikasi. Misalnya:
udp.port == 7777
Lisensi MIT
Hak Cipta (c) 2016 kontributor ngtcp2