"أطلق عليه اسم TCP/2. مرة أخرى."
مشروع ngtcp2 هو جهد لتنفيذ بروتوكول RFC9000 QUIC.
الوثائق عبر الإنترنت متاحة.
نقاط النهاية التالية متاحة لتجربة تطبيق ngtcp2:
https://nghttp2.org:4433
https://nghttp2.org:4434 (يتطلب رمزًا مميزًا للتحقق من صحة العنوان)
https://nghttp2.org (مدعوم من nghttpx)
ترسل نقاط النهاية هذه حقل رأس Alt-Svc إلى العملاء إذا تم الوصول إليه عبر HTTP/1.1 أو HTTP/2 لإخبارهم أن HTTP/3 متاح على UDP 443.
لا تعتمد مكتبة libngtcp2 C نفسها على أي مكتبات خارجية. تمت كتابة مثال العميل والخادم بلغة C++20، ويجب أن يتم تجميعهما باستخدام مترجمات C++ الحديثة (على سبيل المثال، clang >= 11.0، أو gcc >= 11.0).
الحزم التالية مطلوبة لتكوين نظام البناء:
لإنشاء مصادر ضمن دليل الأمثلة، يلزم وجود libev وnghttp3:
لتمكين ضغط شهادة TLS في bsslclient وbsslserver (أمثلة عميل وخادم BoringSSL (aws-lc)، فإن المكتبة التالية مطلوبة:
تتطلب مكتبة مساعد التشفير 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
: فرض التحقق من صحة العنوان عديم الجنسية. هناك h09wsslclient وh09wsslserver اللذان يتحدثان HTTP/0.9. لقد تمت كتابتها فقط من أجل التشغيل السريع للتشغيل المتداخل. إنهم يتشاركون الوظائف الأساسية مع عميل وخادم HTTP/3 ولكن لديهم وظائف أقل (على سبيل المثال، ليس لدى h09wsslclient القدرة على إرسال نص الطلب، ولا يفهم h09wsslserver مسار الطلب الرقمي، مثل /1000).
من أجل استئناف الجلسة، يجب جلب تذكرة الجلسة ومعلمات النقل من الخادم. أولاً، قم بتشغيل الأمثلة/wsslclient مع خيارات --session-file و --tp-file التي تحدد مسارًا إلى تذكرة الجلسة وملفات معلمات النقل على التوالي لحفظها محليًا.
بمجرد توفر هذه الملفات، قم بتشغيل الأمثلة/wsslclient بنفس الوسائط مرة أخرى. سترى أن هذه الجلسة قد تم استئنافها في السجل الخاص بك إذا نجح الاستئناف. يؤدي استئناف الجلسة إلى جعل حزمة المصافحة الأولى للخادم صغيرة جدًا لأنها لا ترسل شهاداتها.
لإرسال بيانات 0-RTT، بعد التأكد من عمل الاستئناف، استخدم الخيار -d لتحديد ملف يحتوي على بيانات لإرسالها.
قد يرسل خادم QUIC رمزًا مميزًا إلى العميل بعد إنشاء الاتصال. يمكن للعميل إرسال هذا الرمز المميز في الاتصال اللاحق بالخادم. يتحقق الخادم من الرمز المميز، وإذا نجح، تكتمل عملية التحقق من صحة العنوان وترفع بعض القيود عن الخادم مما قد يؤدي إلى تسريع عملية النقل. لحفظ و/أو تحميل رمز مميز، استخدم خيار --token-file الموجود في الأمثلة/wsslclient. تتم الكتابة فوق الملف المحدد إذا كان موجودًا بالفعل عند تخزين الرمز المميز.
من أجل جعل تكامل مكدس TLS أقل إيلامًا، فإننا نوفر مكتبة مساعدة للعملات المشفرة توفر عمليات التشفير الأساسية.
يوجد ملف الرأس ضمن دليل crypto/includes/ngtcp2.
تم تصميم كل ملف مكتبة لواجهة خلفية TLS معينة. المكتبات المساعدة للتشفير المتوفرة هي:
نظرًا لأن BoringSSL وPicotls منتجان لم يتم إصدار إصدار لهما، فقد اختبرنا فقط نسختهما الخاصة. راجع قسم المتطلبات أعلاه.
نحن نستخدم Picotls مع OpenSSL كواجهة خلفية للعملات المشفرة.
يحتوي دليل الأمثلة على العميل والخادم المرتبطين بمكتبات مساعد التشفير وواجهات TLS الخلفية. يتم إنشاؤها فقط إذا تم إنشاء مكتبة مساعد التشفير المقابلة لها:
تنفذ المكتبة امتدادات بروتوكول QUIC التالية:
يمكن تكوين Wireshark لتحليل حركة مرور QUIC باستخدام الخطوات التالية:
قم بتعيين متغير البيئة SSLKEYLOGFILE :
$ export SSLKEYLOGFILE=quic_keylog_file
قم بتعيين المنفذ الذي يستخدمه QUIC
انتقل إلى التفضيلات->البروتوكولات->QUIC وقم بتعيين المنفذ الذي يستمع إليه البرنامج. في حالة تطبيق المثال، سيكون هذا هو المنفذ المحدد في سطر الأوامر.
قم بتعيين ملف السجل السري المسبق
انتقل إلى Preferences->Protocols->TLS وقم بتعيين ملف سجل Pre-Master-Secret على نفس القيمة التي تم تحديدها لـ SSLKEYLOGFILE .
اختر واجهة الشبكة الصحيحة للالتقاط
تأكد من اختيار واجهة الشبكة الصحيحة للالتقاط. على سبيل المثال، إذا كنت تستخدم مضيفًا محليًا، فاختر واجهة شبكة الاسترجاع على نظام التشغيل macos.
قم بإنشاء مرشح
قم بإنشاء عامل تصفية لـ udp.port وقم بتعيين المنفذ على المنفذ الذي يستمع إليه التطبيق. على سبيل المثال:
udp.port == 7777
رخصة معهد ماساتشوستس للتكنولوجيا
حقوق الطبع والنشر (ج) لعام 2016 لمساهمي ngtcp2