Quiche هو تطبيق لبروتوكول نقل QUIC و HTTP/3 كما هو محدد من قبل IETF. يوفر واجهة برمجة تطبيقات منخفضة المستوى لمعالجة حزم QUIC وحالة الاتصال. التطبيق مسؤول عن توفير الإدخال/الإخراج (EG Sockets معالجة) بالإضافة إلى حلقة حدث مع دعم أجهزة ضبط الوقت.
لمزيد من المعلومات حول كيفية ظهور Quiche وبعض الأفكار في تصميمه ، يمكنك قراءة منشور على مدونة CloudFlare التي تدخل في مزيد من التفاصيل.
Quiche Powers Cloudflare Edge Network HTTP/3. يمكن استخدام موقع CloudFlare-Quic.com للاختبار والتجريب.
يستخدم DNS Resolver من Android Quiche لتنفيذ DNS عبر HTTP/3.
يمكن دمج Quiche في Curl لتوفير الدعم لـ HTTP/3.
يمكن دمج Quiche في Nginx باستخدام رقعة غير رسمية لتوفير الدعم لـ HTTP/3.
قبل الغوص في API QuiChe ، إليك بعض الأمثلة حول كيفية استخدام أدوات QuiChe المقدمة كجزء من قفص Quiche-Apps.
بعد استنساخ المشروع وفقًا للأمر المذكور في قسم البناء ، يمكن تشغيل العميل على النحو التالي:
$ Cargo Run-bin Quiche-Client-https://cloudflare-quic.com/
بينما يمكن تشغيل الخادم على النحو التالي:
$ Cargo Run-bin Quiche-Server--Apps/SRC/Bin/cert.crt-key/src/bin/cert.key
(لاحظ أن الشهادة المقدمة موقعة ذاتيا ويجب عدم استخدامها في الإنتاج)
استخدم علامة سطر أوامر --help
للحصول على وصف أكثر تفصيلاً لخيارات كل أداة.
الخطوة الأولى في إنشاء اتصال QUIC باستخدام QuiChe هي إنشاء كائن Config
:
دع mut config = quiche :: config :: new (QuiChe :: protocol_version) ؟؛ config.set_application_protos (& [b "example-proto"]) ؛ // تكوين إضافي محدد للتطبيق واستخدام الحالة ...
يتحكم كائن Config
في الجوانب المهمة لاتصال QUIC مثل إصدار QUIC ، ومعرفات ALPN ، والتحكم في التدفق ، والتحكم في الازدحام ، ومهلة الخمول وغيرها من الخصائص أو الميزات.
QUIC هو بروتوكول نقل للأغراض العامة وهناك العديد من خصائص التكوين حيث لا توجد قيمة افتراضية معقولة. على سبيل المثال ، يعتمد العدد المسموح به من التدفقات المتزامنة لأي نوع معين على التطبيق الذي يعمل فوق QUIC ، وغيرها من المخاوف المتعلقة بحالة الاستخدام.
Quiche تتخلف عن العديد من الخصائص إلى الصفر ، على الأرجح تحتاج التطبيقات إلى تعيينها على شيء آخر لتلبية احتياجاتهم باستخدام ما يلي:
set_initial_max_streams_bidi()
set_initial_max_streams_uni()
set_initial_max_data()
set_initial_max_stream_data_bidi_local()
set_initial_max_stream_data_bidi_remote()
set_initial_max_stream_data_uni()
Config
أيضًا يحمل تكوين TLS. يمكن تغيير ذلك عن طريق المسخات على كائن موجود ، أو عن طريق إنشاء سياق TLS يدويًا وإنشاء تكوين باستخدام with_boring_ssl_ctx_builder()
.
يمكن مشاركة كائن التكوين بين اتصالات متعددة.
على جانب العميل ، يمكن استخدام وظيفة الأداة المساعدة connect()
لإنشاء اتصال جديد ، في حين أن accept()
مخصص للخوادم:
// client connection.let conn = quiche :: connect (بعض (& server_name) ، & scid ، محلي ، نظير ، وموت config)؟ ؛ // connect & mut config)؟ ؛
باستخدام طريقة recv()
للاتصال ، يمكن للتطبيق معالجة الحزم الواردة التي تنتمي إلى هذا الاتصال من الشبكة:
let to to = socket.local_addr (). تطابق conn.recv (& mut buf [.. read] ، recv_info) {ok (v) => v ، err (e) => {// حدث خطأ ، تعامله مع ذلك. break ؛} ،} ؛}
يتم إنشاء الحزمة الصادرة باستخدام طريقة send()
للاتصال بدلاً من ذلك:
loop {Let (الكتابة ، send_info) = match conn.send (& mut out) {ok (v) => v ، err (quiche :: error :: int) => {// done writing.break ؛} ، err ( e) => {// حدث خطأ ، تعامله مع ذلك. & send_info.to) .unwrap () ؛}
عند إرسال الحزم ، يكون التطبيق مسؤولاً عن الحفاظ على مؤقت للرد على أحداث الاتصال القائمة على الوقت. يمكن الحصول على انتهاء الموقت باستخدام طريقة timeout()
للاتصال.
دع المهلة = conn.TimeOut () ؛
التطبيق مسؤول عن توفير تطبيق مؤقت ، والذي يمكن أن يكون خاصًا بنظام التشغيل أو إطار عمل الشبكات المستخدم. عندما تنتهي صلاحية مؤقت ، يجب استدعاء طريقة اتصال on_timeout()
، وبعد ذلك قد تحتاج إلى إرسال حزم إضافية على الشبكة:
// انتهت صلاحية المهلة ، تعامل معها. err (quiche :: error :: done) => {// done writing.break ؛} ، err (e) => {// حدث خطأ ، تعامل it.break ؛} ،} ؛ socket.send_to (& out [.. write] ، & send_info.to) .unwrap () ؛}
من المستحسن أن ترسل تطبيقات التطبيقات من الحزم الصادرة لتجنب إنشاء رشقات حزمة يمكن أن تسبب الازدحام والخسائر على المدى القصير في الشبكة.
يعرض Quiche تلميحات السرعة للحزم الصادرة من خلال حقل [ at
] لهيكل [ SendInfo
] الذي يتم إرجاعه بواسطة طريقة send()
. يمثل هذا الحقل الوقت الذي يجب فيه إرسال حزمة معينة إلى الشبكة.
يمكن للتطبيقات استخدام هذه التلميحات عن طريق التأخير بشكل مصطنع لإرسال الحزم من خلال آليات خاصة بالنظام الأساسي (مثل خيار SO_TXTIME
Socket على Linux) ، أو الطرق المخصصة (على سبيل المثال باستخدام أجهزة ضبط الوقت للمستخدم).
بعد بعضها ذهابًا وإيابًا ، سيكمل الاتصال المصافحة وسيكون جاهزًا لإرسال أو استلام بيانات التطبيق.
يمكن إرسال البيانات على دفق باستخدام طريقة stream_send()
:
إذا تم الانتهاء من conn.is_establed () {// المصافحة ، أرسل بعض البيانات على الدفق 0.conn.stream_send (0 ، B "Hello" ، True)؟ ؛}
يمكن للتطبيق التحقق مما إذا كان هناك أي تدفقات قابلة للقراءة باستخدام طريقة readable()
، والتي تُرجع جهاز التكرار عبر جميع التدفقات التي تحتوي على بيانات مستحقة للقراءة.
يمكن بعد ذلك استخدام طريقة stream_recv()
لاسترداد بيانات التطبيق من الدفق القابل للقراءة:
إذا كان conn.is_estableished () {// التكرار عبر التدفقات القابلة للقراءة. (Stream_id ، & mut buf) {println! ("got {} bytes on tream {}" ، read ، stream_id) ؛}}}
توفر وحدة Quiche HTTP/3 واجهة برمجة تطبيقات عالية المستوى لإرسال واستلام طلبات HTTP والاستجابات أعلى بروتوكول نقل QUIC.
ألقِ نظرة على دليل [Quiche/Ampressampes/] للحصول على أمثلة أكثر اكتمالًا حول كيفية استخدام API QuiChe ، بما في ذلك أمثلة حول كيفية استخدام Quiche في تطبيقات C/C ++ (انظر أدناه للحصول على مزيد من المعلومات).
يعرض Quiche API رقيقة C على رأس واجهة برمجة تطبيقات Rust التي يمكن استخدامها لدمج QuiChe بسهولة أكبر في تطبيقات C/C ++ (وكذلك في اللغات الأخرى التي تسمح باستدعاء واجهات برمجة التطبيقات (C) عبر شكل من أشكال FFI). يتبع C API نفس تصميم الصدأ ، Modulo القيود التي تفرضها لغة C نفسها.
عند تشغيل cargo build
مكتبة ثابتة تسمى libquiche.a
تلقائيًا إلى جانب الصدأ. هذا مستقل بالكامل ويمكن ربطه مباشرة بتطبيقات C/C ++.
لاحظ أنه من أجل تمكين واجهة برمجة تطبيقات FFI ، يجب تمكين ميزة ffi
(يتم تعطيلها بشكل افتراضي) ، عن طريق المرور --features ffi
إلى cargo
.
يتطلب Quiche Rust 1.67 أو في وقت لاحق للبناء. يمكن تثبيت أحدث إصدار مستقر للصدأ باستخدام Rustup.
بمجرد إعداد بيئة بناء الصدأ ، يمكن جلب رمز مصدر Quiche باستخدام GIT:
$ git clone -recursive https://github.com/cloudflare/quiche
ثم بنيت باستخدام البضائع:
بناء البضائع $ -أمثلة
يمكن أيضًا استخدام البضائع لتشغيل testsuite:
اختبار الشحن $
لاحظ أن Boringssl ، الذي يستخدم لتنفيذ مصافحة تشفير QUIC بناءً على TLS ، يجب أن يتم بناؤه وربطه بـ QuiChe. يتم ذلك تلقائيًا عند إنشاء Quiche باستخدام Cargo ، ولكن يتطلب أن يكون الأمر cmake
متاحًا أثناء عملية الإنشاء. على Windows تحتاج أيضًا إلى NASM. وثائق BoringsSL الرسمية لديها المزيد من التفاصيل.
في البديل ، يمكنك استخدام بنية Boringssl المخصصة الخاصة بك عن طريق تكوين دليل BoringsSL مع متغير بيئة QUICHE_BSSL_PATH
:
$ quiche_bssl_path = "/path/to/boringssl" بناء شحن -أمثلة على سبيل المثال
بدلاً من ذلك ، يمكنك استخدام OpenSSL/QuictLs. لتمكين Quiche من استخدام هذا البائع ، يمكن إضافة ميزة openssl
إلى قائمة --feature
. كن على علم بأن 0-RTT
غير مدعوم إذا تم استخدام هذا البائع.
يمكن إجراء بناء Quiche لنظام Android (الإصدار 19 أو أعلى ، 21 موصى به) ، باستخدام Cargo-NDK (v2.0 أو أحدث).
أولاً ، يجب تثبيت Android NDK ، إما باستخدام Android Studio أو مباشرة ، ويجب ضبط متغير البيئة ANDROID_NDK_HOME
على مسار تثبيت NDK ، على سبيل المثال:
$ export Android_ndk_home =/usr/local/share/Android-NDK
ثم يمكن تثبيت مجموعة أدوات الصدأ لبنية Android المطلوبة على النحو التالي:
$ Rustup Target Add AARCH64-Linux-Android ARMV7-Linux-Androideabi I686-Linux-Android X86_64-Linux-Android
لاحظ أن الحد الأدنى لمستوى API هو 21 لجميع البنى المستهدفة.
يجب أيضًا تثبيت Cargo-NDK (v2.0 أو أحدث):
$ CARGO تثبيت البضائع ndk
أخيرًا ، يمكن بناء مكتبة Quiche باستخدام الإجراء التالي. لاحظ أن خيارات -t <architecture>
و -p <NDK version>
إلزامية.
$ cargo ndk -t arm64 -v8a -p 21 -build -ffi ffi
انظر Build_android_ndk19.sh لمزيد من المعلومات.
لبناء Quiche لنظام التشغيل iOS ، تحتاج إلى ما يلي:
تثبيت أدوات سطر أوامر XCode. يمكنك تثبيتها باستخدام Xcode أو مع الأمر التالي:
$ xcode-select-التثبيت
قم بتثبيت أدوات الصدأ لبنية iOS:
$ rustup Target Add AARCH64-Apple-IOS X86_64-Apple-ios
تثبيت cargo-lipo
:
$ شحن تثبيت البضائع lipo
لبناء libquiche ، قم بتشغيل الأمر التالي:
$ cargo lipo -ffi ffi
أو
$ cargo lipo -ffi ffi -release
يتم اختبار بناء iOS في Xcode 10.1 و Xcode 11.2.
من أجل إنشاء صور Docker ، ما عليك سوى تشغيل الأمر التالي:
$ جعل Docker-Build
يمكنك العثور على صور Quiche Docker على مستودعات Docker Hub التالية:
CloudFlare/Quiche
CloudFlare/Quiche-QNS
سيتم تحديث العلامة latest
كلما تحديثات Quiche Master Branch.
CloudFlare/Quiche
يوفر خادمًا وعميلًا مثبتًا في/usr/local/bin.
CloudFlare/Quiche-QNS
يوفر البرنامج النصي لاختبار QuiChe داخل Runner Quic-Interop.
حقوق الطبع والنشر (C) 2018-2019 ، CloudFlare ، Inc.
انظر النسخ للترخيص.