العنصر
RTCQuicTransport هي واجهة برمجة تطبيقات جديدة لمنصة الويب تتيح تبادل البيانات العشوائية مع التطبيقات المشابهة البعيدة باستخدام بروتوكول QUIC. وهو مخصّص لحالات الاستخدام من نظير إلى نظير، وبالتالي يتم استخدامه مع واجهة برمجة تطبيقات RTCIceTransport مستقلة لإنشاء اتصال من نظير إلى نظير من خلال ICE. نقل البيانات بطريقة موثوقة وبالترتيب (راجع القسم أدناه لمعرفة تفاصيل عن التسليم غير المرتب وغير الموثوق به). نظرًا لأنه نقل عام ثنائي الاتجاه للبيانات، يمكن استخدامه في الألعاب، ونقل الملفات، ونقل الوسائط، والمراسلة، وما إلى ذلك.
لماذا؟
يمكن لواجهة برمجة التطبيقات الفعّالة والمنخفضة المستوى لنقل البيانات أن تتيح للتطبيقات (مثل الاتصالات في الوقت الفعلي) تنفيذ مهام جديدة على الويب. يمكنك الاعتماد على واجهة برمجة التطبيقات، وإنشاء الحلول الخاصة بك، وتوسيع حدود ما يمكن فعله باستخدام الاتصالات من نظير إلى نظير، على سبيل المثال، فتح قفل مقابض تخصيص معدل نقل البيانات. في المستقبل، قد يتيح المزيد من الدعم للوسائط المشفرة إنشاء تطبيق اتصال فيديو لك باستخدام عناصر تحكم منخفضة المستوى. إنّ الجهود المبذولة في NV في WebRTC تتمثل في التحوّل إلى واجهات برمجة تطبيقات ذات مستوى أدنى، مع العلم أنّ تجربة هذا الأمر في مرحلة مبكرة أمر مهم.
لماذا QUIC؟
يُعد بروتوكول QUIC مرغوبًا فيه لعمليات التواصل في الوقت الفعلي. وتم تصميمه فوق بروتوكول UDP، ومضمّنًا في التشفير والتحكم في الازدحام، ويتم تعدد الإرسال بدون الحاجة إلى حظر البيانات. تقدّم RTCQuicTransport
إمكانيات متشابهة جدًا مع واجهة برمجة التطبيقات RTCDataChannel
، ولكنّها تستخدم بروتوكول QUIC بدلاً من SCTP كبروتوكول النقل الخاص به. ولأنّ RTCQuicTransport
هي واجهة برمجة تطبيقات مستقلة، فهي لا تحتوي على أي عبء إضافي عن واجهة برمجة التطبيقات RTCPeerConnection
التي تتضمن حِزم الوسائط في الوقت الفعلي.
الطريقة
نظرة عامة على واجهة برمجة التطبيقات العامة
تتضمّن واجهة برمجة التطبيقات 3 موجزات رئيسية، وهي RTCIceTransport
وRTCQuicTransport
وRTCQuicStream
.
RTCIceTransport
إنّ ICE بروتوكول لإنشاء اتصالات من نظير إلى نظير على الإنترنت، ويُستخدَم حاليًا في WebRTC. يوفر هذا الكائن واجهة برمجة تطبيقات
مستقلة لإنشاء اتصال ICE. ويُستخدم كنقل الحزم لاتصال QUIC، وتأخذه RTCQuicTransport
في الدالة الإنشائية.
RTCQuicTransport
يمثل اتصال QUIC. يتم استخدامه لإنشاء اتصال QUIC وإنشاء مجموعات بث QUIC. كما أنه يعرض الإحصائيات ذات الصلة على مستوى الاتصال عبر QUIC.
RTCQuicStream
يُستخدم لقراءة البيانات وكتابتها من الجانب البعيد. تعمل التدفقات على نقل
البيانات بشكل موثوق وترتيب. يمكن إنشاء عدّة أحداث بث من محتوى
RTCQuicTransport
نفسه، وبعد كتابة البيانات في مصدر بيانات، يتم تنشيط
حدث onquicstream في عملية النقل عن بُعد. تقدم ساحات المشاركات طريقة لتمييز البيانات
المختلفة على نفس اتصال QUIC. ومن الأمثلة الشائعة إرسال ملفات منفصلة عبر مجموعات بث منفصلة أو مجموعات صغيرة من البيانات عبر مجموعات بث مختلفة أو أنواع مختلفة من الوسائط عبر مجموعات بث منفصلة.
RTCQuicStream
s تتميز بخفة وزنها ويتم مضاعفتها عبر اتصال QUIC ولا تتسبب في حظر ظهور رأس الخط إلى RTCQuicStream
s الأخرى.
إعداد عملية الربط
فيما يلي مثال لإعداد اتصال QUIC من نظير إلى نظير.
مثلما هو الحال مع RTCPeerConnection
، تتطلب واجهة برمجة التطبيقات RTCQuicTransport
استخدام
قناة إشارة آمنة للتفاوض بشأن معلَمات الاتصال،
بما في ذلك معلَمات الأمان الخاصة به. تتفاوض دالة RTCIceTransport
مع معلَمات ICE الخاصة بها (ufrag وكلمة المرور)، بالإضافة إلى RTCIceCandidate
s.
منظور العميل:
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)؟ كيف يمكن تحسينها؟ - عروض أداء
- هندسة واجهة برمجة التطبيقات
التسجيل في مرحلة التجربة والتقييم
- اطلب رمزًا مميزًا لأصلك.
- لإضافة الرمز المميّز إلى صفحاتك، هناك طريقتان لتقديم هذا الرمز على أي صفحات في الأصل:
- إضافة العلامة
<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 |
وصلات مساعدة
- مستندات إضافية
- شرح علني
- خطأ في التتبُّع
- طلب الرمز المميز لمرحلة التجربة والتقييم
- كيفية استخدام الرمز المميّز لمرحلة التجربة والتقييم
- مناقشة مشاكل في RTCQuicTransport
- مناقشة مشاكل في RTCIceTransport