العنصر
RTCQuicTransport هي واجهة برمجة تطبيقات جديدة لنظام التشغيل Web Platform تسمح بتبادل بيانات عشوائية مع الأجهزة المشابهة عن بُعد باستخدام بروتوكول QUIC. وهو مخصّص لحالات الاستخدام بين الأجهزة المتكافئة، وبالتالي يتم استخدامه مع واجهة برمجة التطبيقات RTCIceTransport المستقلة لإنشاء اتصال بين الأجهزة المتكافئة من خلال ICE. يتم نقل البيانات بشكل موثوق وبترتيب (اطّلِع على القسم أدناه للحصول على تفاصيل عن التسليم غير المُرتَّب وغير الموثوق). وبما أنّه ينقل البيانات بشكل عام وباتجاهين، يمكن استخدامه للألعاب ونقل الملفات ونقْل الوسائط والمراسلة وما إلى ذلك.
لماذا؟
يمكن لواجهة برمجة تطبيقات فعّالة من المستوى الأدنى لنقل البيانات أن تتيح للتطبيقات (مثل تطبيقات التواصل في الوقت الفعلي) تنفيذ إجراءات جديدة على الويب. يمكنك الاستفادة من واجهة برمجة التطبيقات لإنشاء حلولك الخاصة، وتجاوز الحدود القصوى لما يمكن تنفيذه من خلال اتصالات peer إلى peer، على سبيل المثال، تفعيل عناصر التحكّم في تخصيص معدل نقل البيانات المخصّص. في المستقبل، يمكن أن يؤدي إتاحة المزيد من الوسائط المشفّرة إلى السماح بإنشاء تطبيقك الخاص للتواصل عبر الفيديو باستخدام عناصر تحكّم من المستوى الأدنى. يهدف جهد WebRTC في مجال الفيديو المباشر إلى الانتقال إلى واجهات برمجة تطبيقات من المستوى الأدنى، وتعد التجربة المبكرة لهذا الإجراء قيّمة.
لماذا QUIC؟
بروتوكول QUIC مطلوب للاتصالات في الوقت الفعلي. وهو مبني على بروتوكول UDP، ويحتوي على تشفير مدمج وإمكانية التحكّم في الازدحام ويتم تعدد إرسال البيانات بدون
حظر أولوية الإرسال. توفّر RTCQuicTransport
إمكانات مشابهة جدًا لتلك التي يوفّرها RTCDataChannel
API، ولكنها تستخدِم بروتوكول QUIC بدلاً من بروتوكول SCTP كبروتوكول نقل. وبما أنّ RTCQuicTransport
هي واجهة برمجة تطبيقات مستقلة، فهي لا تتطلّب
الكثير من الموارد مثل واجهة برمجة التطبيقات RTCPeerConnection
التي تتضمّن حِزمة الوسائط في الوقت الفعلي.
الطريقة
نظرة عامة على واجهة برمجة التطبيقات
تحتوي واجهة برمجة التطبيقات على 3 عناصر مجردة رئيسية، وهي RTCIceTransport
وRTCQuicTransport
وRTCQuicStream
.
RTCIceTransport
ICE هو بروتوكول لإنشاء اتصالات بين الأجهزة المتكافئة عبر الإنترنت ويُستخدم في WebRTC اليوم. يقدّم هذا العنصر واجهة برمجة تطبيقات مستقلة لإنشاء
اتصال ICE. ويتم استخدامه لنقل الحِزم في اتصال QUIC،
ويأخذه RTCQuicTransport
في وظيفته المُنشئة.
RTCQuicTransport
يمثّل اتصال QUIC. ويُستخدَم لإنشاء اتصال QUIC و إنشاء أحداث QUIC. ويعرض أيضًا إحصاءات ذات صلة لمستوى اتصال QUIC.
RTCQuicStream
تُستخدَم لقراءة البيانات وكتابتها من/إلى الجانب البعيد. تنقل أحداث البث
البيانات بشكل موثوق وبترتيب معيّن. يمكن إنشاء مصادر بيانات متعددة من
RTCQuicTransport
نفسه، وبعد كتابة البيانات في مصدر بيانات، يتم تنشيط حدث
"onquicstream" في النقل عن بُعد. توفّر أحداث البث طريقة لتمييز البيانات المختلفة في اتصال QUIC نفسه. تشمل الأمثلة الشائعة
إرسال ملفات منفصلة عبر أحداث بث منفصلة، أو أجزاء صغيرة من البيانات عبر
أحداث بث مختلفة، أو أنواع مختلفة من الوسائط عبر أحداث بث منفصلة.
إنّ أحداث RTCQuicStream
خفيفة الوزن ويتم تعدد إرسالها عبر اتصال QUIC، ولا تؤدي إلى حظر RTCQuicStream
الأخرى.
إعداد عملية الربط
في ما يلي مثال على إعداد اتصال QUIC بين نظيرَين.
مثل RTCPeerConnection
، تتطلّب واجهة برمجة التطبيقات RTCQuicTransport
استخدام
قناة إرسال إشارات آمنة للتفاوض على مَعلمات الاتصال،
بما في ذلك مَعلمات الأمان. يتفاوض RTCIceTransport
على مَعلمات ICE (ufrag وكلمة المرور)، بالإضافة إلى RTCIceCandidate
.
وجهة نظر العميل:
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
لا يتيح سوى إرسال البيانات بشكل موثوق وبترتيب،
يمكن إجراء التسليم غير الموثوق به أو غير المُرتَّب من خلال وسائل أخرى. بالنسبة إلى
التسليم غير المُرتَّب، يمكن إرسال أجزاء صغيرة من البيانات في مصادر بيانات منفصلة
لأنّه لا يتم ترتيب البيانات بين مصادر البيانات. في حال عدم موثوقية عملية الإرسال، يمكن
إرسال أجزاء صغيرة من البيانات مع ضبط القيمة "true" على العنصر finish، ثم استدعاء
reset()
في البث بعد مهلة. يجب أن تعتمد المهلة على
عدد عمليات إعادة الإرسال المطلوبة قبل إسقاط البيانات.
الموعد؟
ستبدأ مرحلة التجربة والتقييم في الإصدار 73 من Chrome، وستكون متاحة حتى الإصدار M75. بعد ذلك، ستنتهي مرحلة التجربة والتقييم. استنادًا إلى الملاحظات والآراء والاهتمام، سنُجري التغييرات المناسبة، وإما سنطرح واجهة برمجة التطبيقات أو سنواصل تجربة استخدام جديدة لهذه الواجهة أو سنوقفها نهائيًا.
أين؟
متصفّح Chrome على جميع المنصات باستثناء iOS
وماذا أيضًا؟
الملاحظات
إنّ أحد الأهداف الرئيسية لإصدار الإصدار التجريبي من التطبيق الأصلي هو الحصول على ملاحظات منك، أي المطوّرين. يهمّنا معرفة ما يلي:
- ما هي الميزات التي تتيحها لك واجهة برمجة التطبيقات هذه؟
- كيف تُحسِّن واجهة برمجة التطبيقات هذه واجهات برمجة التطبيقات الأخرى لنقل البيانات
(
WebSocket
أوRTCDataChannel
في WebRTC)؟ كيف يمكن تحسينها؟ - الأداء
- سهولة استخدام واجهة برمجة التطبيقات
التسجيل في مرحلة التجربة والتقييم
- اطلب رمزًا مميّزًا لمصدرك.
- أضِف الرمز المميّز إلى صفحاتك، وهناك طريقتان لتقديم هذا الرمز المميّز على
أي صفحات في مصدرك:
- أضِف علامة
origin-trial
<meta>
إلى رأس أي صفحة. على سبيل المثال، قد يبدو هذا على النحو التالي:<meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
- إذا كان بإمكانك ضبط الخادم، يمكنك أيضًا تقديم الرمز المميّز على الصفحات
باستخدام عنوان HTTP
Origin-Trial
. يجب أن يشبه عنوان الاستجابة الناتج العنوان التالي:Origin-Trial: TOKEN_GOES_HERE
- أضِف علامة
مواصفات الويب
تم الانتهاء من مسودة المواصفات قبل واجهة برمجة التطبيقات في التجربة التجريبية لميزة "الإعلانات على شبكة البحث"، بما في ذلك:
- أحداث البث أحادية الاتجاه التي تتوافق بشكلٍ أكبر مع أحداث البث في WHATWG
- إيقاف عمليات إعادة الإرسال
- مخططات البيانات (قريبًا)
نحن مهتمون بتنفيذ المواصفة الكاملة وغير ذلك (بما في ذلك إتاحة بث WHATWG)، ولكن نريد معرفة ملاحظاتك أولاً.
الأمان
يتم فرض الأمان في تبادل تأكيد الاتصال عبر بروتوكول QUIC من خلال استخدام مفتاح مشترَك مسبقًا لمحاولة إنشاء اتصال مشفَّر عبر بروتوكول QUIC للند للند. يجب إرسال إشارات هذا المفتاح عبر قناة آمنة خارج النطاق مع ضمانات السرية والنزاهة. يُرجى العِلم أنّ المفتاح سيتم عرضه على JavaScript.
هجوم نشط
على عكس DTLS-SRTP الذي يتطلّب فقط السلامة للإشارة إلى بصمة الشهادة، تتطلّب الإشارة إلى المفتاح المشترَك مسبقًا السلامة والسرية. في حال اختراق مفتاح PSK (على سبيل المثال من خلال الخادم في قناة إشعال الاشتعال)، يمكن لمهاجم نشط شن هجوم وسيط ضد تأكيد اتصال QUIC.
الوضع الحالي
الخطوة | الحالة |
---|---|
1. إنشاء فيديو توضيحي | مكتمل |
**2(أ). مواصفات RTCQuicTransport ** | **قيد التقدّم** |
**2(ب). مواصفات RTCIceTransport ** | **قيد التقدّم** |
**3. جمع الملاحظات وتحسين التصميم** | **قيد التقدّم** |
4. مرحلة التجربة والتقييم | بدءًا من الإصدار 73 من Chrome |
5- إطلاق | لم تبدأ عملية المراجعة |
وصلات مساعدة
- مستندات إضافية
- شرح موجز للجمهور العام
- خطأ في التتبّع
- طلب رمز مميّز لإصدار تجريبي من المصدر
- كيفية استخدام رمز بدء الفترة التجريبية
- مناقشة حول مشاكل RTCQuicTransport
- مناقشة حول مشاكل RTCIceTransport