RTCQuicTransport تأتي في فترة تجريبية للمصدر بالقرب منك (Chrome 73)

العنصر

RTCQuicTransport هي واجهة برمجة تطبيقات جديدة لمنصة الويب تتيح تبادل البيانات العشوائية مع التطبيقات المشابهة البعيدة باستخدام بروتوكول QUIC. وهو مخصّص لحالات الاستخدام من نظير إلى نظير، وبالتالي يتم استخدامه مع واجهة برمجة تطبيقات RTCIceTransport مستقلة لإنشاء اتصال من نظير إلى نظير من خلال ICE. نقل البيانات بطريقة موثوقة وبالترتيب (راجع القسم أدناه لمعرفة تفاصيل عن التسليم غير المرتب وغير الموثوق به). نظرًا لأنه نقل عام ثنائي الاتجاه للبيانات، يمكن استخدامه في الألعاب، ونقل الملفات، ونقل الوسائط، والمراسلة، وما إلى ذلك.

لماذا؟

يمكن لواجهة برمجة التطبيقات الفعّالة والمنخفضة المستوى لنقل البيانات أن تتيح للتطبيقات (مثل الاتصالات في الوقت الفعلي) تنفيذ مهام جديدة على الويب. يمكنك الاعتماد على واجهة برمجة التطبيقات، وإنشاء الحلول الخاصة بك، وتوسيع حدود ما يمكن فعله باستخدام الاتصالات من نظير إلى نظير، على سبيل المثال، فتح قفل مقابض تخصيص معدل نقل البيانات. في المستقبل، قد يتيح المزيد من الدعم للوسائط المشفرة إنشاء تطبيق اتصال فيديو لك باستخدام عناصر تحكم منخفضة المستوى. إنّ الجهود المبذولة في NV في WebRTC تتمثل في التحوّل إلى واجهات برمجة تطبيقات ذات مستوى أدنى، مع العلم أنّ تجربة هذا الأمر في مرحلة مبكرة أمر مهم.

لماذا QUIC؟

يُعد بروتوكول QUIC مرغوبًا فيه لعمليات التواصل في الوقت الفعلي. وتم تصميمه فوق بروتوكول UDP، ومضمّنًا في التشفير والتحكم في الازدحام، ويتم تعدد الإرسال بدون الحاجة إلى حظر البيانات. تقدّم RTCQuicTransport إمكانيات متشابهة جدًا مع واجهة برمجة التطبيقات RTCDataChannel، ولكنّها تستخدم بروتوكول QUIC بدلاً من SCTP كبروتوكول النقل الخاص به. ولأنّ RTCQuicTransport هي واجهة برمجة تطبيقات مستقلة، فهي لا تحتوي على أي عبء إضافي عن واجهة برمجة التطبيقات RTCPeerConnection التي تتضمن حِزم الوسائط في الوقت الفعلي.

الطريقة

نظرة عامة على واجهة برمجة التطبيقات العامة

تتضمّن واجهة برمجة التطبيقات 3 موجزات رئيسية، وهي RTCIceTransport وRTCQuicTransport وRTCQuicStream.

رسم تخطيطي RTCQuicTransport يعرض بنية واجهة برمجة التطبيقات

RTCIceTransport

إنّ ICE بروتوكول لإنشاء اتصالات من نظير إلى نظير على الإنترنت، ويُستخدَم حاليًا في WebRTC. يوفر هذا الكائن واجهة برمجة تطبيقات مستقلة لإنشاء اتصال ICE. ويُستخدم كنقل الحزم لاتصال QUIC، وتأخذه RTCQuicTransport في الدالة الإنشائية.

RTCQuicTransport

يمثل اتصال QUIC. يتم استخدامه لإنشاء اتصال QUIC وإنشاء مجموعات بث QUIC. كما أنه يعرض الإحصائيات ذات الصلة على مستوى الاتصال عبر QUIC.

RTCQuicStream

يُستخدم لقراءة البيانات وكتابتها من الجانب البعيد. تعمل التدفقات على نقل البيانات بشكل موثوق وترتيب. يمكن إنشاء عدّة أحداث بث من محتوى RTCQuicTransport نفسه، وبعد كتابة البيانات في مصدر بيانات، يتم تنشيط حدث onquicstream في عملية النقل عن بُعد. تقدم ساحات المشاركات طريقة لتمييز البيانات المختلفة على نفس اتصال QUIC. ومن الأمثلة الشائعة إرسال ملفات منفصلة عبر مجموعات بث منفصلة أو مجموعات صغيرة من البيانات عبر مجموعات بث مختلفة أو أنواع مختلفة من الوسائط عبر مجموعات بث منفصلة. RTCQuicStreams تتميز بخفة وزنها ويتم مضاعفتها عبر اتصال QUIC ولا تتسبب في حظر ظهور رأس الخط إلى RTCQuicStreams الأخرى.

إعداد عملية الربط

فيما يلي مثال لإعداد اتصال QUIC من نظير إلى نظير. مثلما هو الحال مع RTCPeerConnection، تتطلب واجهة برمجة التطبيقات RTCQuicTransport استخدام قناة إشارة آمنة للتفاوض بشأن معلَمات الاتصال، بما في ذلك معلَمات الأمان الخاصة به. تتفاوض دالة RTCIceTransport مع معلَمات ICE الخاصة بها (ufrag وكلمة المرور)، بالإضافة إلى RTCIceCandidates.

رسم تخطيطي RTCQuicTransport يعرض بنية واجهة برمجة التطبيقات

منظور العميل:

const iceTransport = new RTCIceTransport();
const quicTransport = new RTCQuicTransport(iceTransport);
// Signal parameters, key and candidates.
signalingChannel.send({
  iceParams: iceTransport.getLocalParameters(),
  quicKey: quicTransport.getKey(),
});
iceTransport.onicecandidate = e => {
  if (e.candidate) {
    signalingChannel.send({candidate: e.candidate});
  }
};

// When remote parameters are signaled, start connection.
signalingChannel.onMessage = async ({iceParams, candidate}) => {
  if (iceParams) {
    iceTransport.start(iceParams);
    quicTransport.connect();
  } else if (candidate) {
    iceTransport.addRemoteCandidate(candidate);
  }
};

منظور الخادم:

const iceTransport = new RTCIceTransport();
const quicTransport = new RTCQuicTransport(iceTransport);
// Signal parameters, key and candidates.
signalingChannel.send({
  iceParams: iceTransport.getLocalParameters(),
});
iceTransport.onicecandidate = e => {
  if (e.candidate) {
    signalingChannel.send({candidate: e.candidate});
  }
};

// When remote parameters are signaled, start connection.
signalingChannel.onMessage = async ({iceParams, quicKey, candidate}) => {
  if (iceParams && quicKey) {
    iceTransport.start(iceParams);
    quicTransport.listen(quicKey);
  } else if (candidate) {
    iceTransport.addRemoteCandidate(candidate);
  }
};

نقل البيانات

يمكن نقل البيانات باستخدام واجهات برمجة تطبيقات RTCQuicStream للقراءة والكتابة:

RTCQuicStreamReadResult readInto(Uint8Array data);
void write(RTCQuicStreamWriteParameters data);
Promise<void> waitForWriteBufferedAmountBelow(unsigned long amount);
Promise<void> waitForReadable(unsigned long amount);

جارٍ التخزين المؤقت…

تتيح الوعود التي تعرضها طرق waitFor* بتخزين البيانات مؤقتًا عندما يكون JavaScript مشغولاً. يتم تطبيق الضغط الخلفي على جانب الإرسال عندما يصبح المخزن المؤقت للقراءة ممتلئًا على جانب الاستلام. يحتوي جانب الإرسال على مخزن مؤقت للكتابة يمكن أن يملأ عند تطبيق الضغط الخلفي، وبالتالي يحتوي جانب الكتابة على طريقة waitForWriteBufferedAmountBelow أيضًا لإتاحة انتظار مساحة في المخزن المؤقت للكتابة. يمكن العثور على مزيد من المعلومات حول بيانات الكتابة/القراءة في وثائق المطوّرين الإضافية.

تسليم غير مرتَّب/غير موثوق به

يتيح RTCQuicStream إرسال البيانات بشكل موثوق به فقط وبالترتيب، ولكن يمكن إجراء التسليم غير الموثوق به أو غير المرتّب باستخدام وسائل أخرى. بالنسبة إلى التسليم بدون ترتيب، يمكن للمرء إرسال أجزاء صغيرة من البيانات في مجموعات بث منفصلة لأنه لا يتم ترتيب البيانات بين عمليات البث. بالنسبة إلى التسليم غير الموثوق به، يمكن للمرء إرسال أجزاء صغيرة من البيانات مع ضبط القيمة النهائية على "صحيح"، يليها استدعاء reset() في البث بعد انتهاء مهلة. وينبغي أن تعتمد المهلة على عدد عمليات إعادة الإرسال المطلوبة قبل إسقاط البيانات.

الموعد؟

ستبدأ مرحلة التجربة والتقييم في الإصدار 73 من Chrome، وستكون متوفّرة مع الإصدار M75 كحدّ أقصى. بعد ذلك ستنتهي مرحلة تجربة الأصل. بناءً على الملاحظات والآراء والاهتمام، سنجري التغييرات المناسبة، أو سنشحن واجهة برمجة التطبيقات، أو نتابع تجربة مصدر جديدة لواجهة برمجة التطبيقات هذه، أو نوقفها نهائيًا.

أين؟

متصفّح Chrome على جميع الأنظمة الأساسية ما عدا iOS.

وماذا أيضًا؟

إضافة ملاحظات

إنّ أحد الأهداف الرئيسية لمرحلة التجربة والتقييم هو الحصول على ملاحظات المستخدمين والمطوّرين. ونهتم بما يلي:

  • ما الذي تتيحه لك واجهة برمجة التطبيقات هذه؟
  • كيف يمكن تحسين واجهة برمجة التطبيقات هذه على واجهات برمجة التطبيقات الأخرى لنقل البيانات (WebSocket أو RTCDataChannel من WebRTC)؟ كيف يمكن تحسينها؟
  • عروض أداء
  • هندسة واجهة برمجة التطبيقات

التسجيل في مرحلة التجربة والتقييم

  1. اطلب رمزًا مميزًا لأصلك.
  2. لإضافة الرمز المميّز إلى صفحاتك، هناك طريقتان لتقديم هذا الرمز على أي صفحات في الأصل:
    • إضافة العلامة <meta> لبرامج origin-trial إلى عنوان أي صفحة على سبيل المثال، قد يظهر هذا الخيار على النحو التالي: <meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
    • إذا كان بإمكانك إعداد الخادم، يمكنك أيضًا توفير الرمز المميّز على الصفحات باستخدام عنوان HTTP Origin-Trial. يجب أن يبدو عنوان الاستجابة الناتج على النحو التالي: Origin-Trial: TOKEN_GOES_HERE

مواصفات الويب

تم تطوير مواصفات المسودة قبل واجهة برمجة التطبيقات في مرحلة التجربة والتقييم، بما في ذلك:

  • أحداث البث الأحادية الاتجاه التي تكون أكثر توافقًا مع مجموعات البث whatWG
  • إيقاف عمليات إعادة الإرسال
  • (قريبًا) مخططات البيانات

يهمنا تطبيق المواصفات الكاملة وغيرها (بما في ذلك دعم البث الخاص بـ WhatWG)، ولكن نريد معرفة ملاحظاتك أولاً.

الأمان

يتم فرض الأمان في تأكيد اتصال QUIC من خلال استخدام مفتاح تمت مشاركته مسبقًا لإنشاء اتصال QUIC مشفّر من P2P. يجب الإشارة إلى هذا المفتاح عبر قناة آمنة خارج النطاق مع ضمانات السرية والنزاهة. تجدر الإشارة إلى أنّ المفتاح سيواجه JavaScript.

هجوم نشط

وعلى عكس بروتوكول DTLS-SRTP الذي لا يتطلب سوى سلامة من أجل الإشارة إلى بصمة الشهادة، فإن الإشارة إلى المفتاح الذي تمت مشاركته مسبقًا تتطلب السلامة والسرية. إذا تعرض PSK للاختراق (على سبيل المثال من خلال الخادم في قناة الإشارة)، فقد يتمكن مهاجم نشط من شن هجوم وسيط على المصافحة عبر تقنية QUIC.

الوضع الحالي

الخطوة الحالة
1- إنشاء شرح مكتمل
**2a. مواصفات RTCQuicTransport ** **قيد التقدّم**
**2b. مواصفات RTCIceTransport ** **قيد التقدّم**
**3. جمع الملاحظات والتكرار التحسيني للتصميم** **قيد التقدّم**
4. مرحلة التجربة والتقييم يبدأ في Chrome 73
5. إطلاق Not started

وصلات مساعدة