چی؟
RTCQuicTransport یک API پلتفرم وب جدید است که امکان تبادل داده های دلخواه با همتایان راه دور را با استفاده از پروتکل QUIC فراهم می کند. این برای موارد استفاده همتا به همتا در نظر گرفته شده است، و بنابراین با یک API RTCIceTransport مستقل برای ایجاد یک اتصال همتا به همتا از طریق ICE استفاده می شود. داده ها به طور قابل اعتماد و به ترتیب حمل می شوند (برای جزئیات در مورد تحویل بدون سفارش و غیرقابل اعتماد به بخش زیر مراجعه کنید). از آنجایی که این یک انتقال داده عمومی و دو طرفه است، می توان از آن برای بازی، انتقال فایل، انتقال رسانه، پیام رسانی و غیره استفاده کرد.
چرا؟
یک API انتقال داده در سطح پایین قدرتمند می تواند برنامه ها (مانند ارتباطات بلادرنگ) را قادر به انجام کارهای جدید در وب کند. میتوانید در بالای API ایجاد کنید، راهحلهای خود را ایجاد کنید، محدودیتهای کاری را که میتوان با اتصالات همتا به همتا انجام داد فشار دهید، برای مثال، باز کردن دکمههای تخصیص نرخ بیت سفارشی. در آینده، پشتیبانی بیشتر از رسانههای رمزگذاریشده حتی میتواند امکان ساخت اپلیکیشن ارتباط ویدیویی خود را با کنترلهای سطح پایین فراهم کند. تلاش NV WebRTC حرکت به سمت API های سطح پایین تر است و آزمایش اولیه با این امر ارزشمند است.
چرا QUIC؟
پروتکل QUIC برای ارتباطات بلادرنگ مطلوب است. این بر روی UDP ساخته شده است، دارای رمزگذاری، کنترل تراکم داخلی است و بدون مسدود کردن سر خط مالتی پلکس است. RTCQuicTransport
توانایی های بسیار مشابهی با API RTCDataChannel
ارائه می دهد، اما از QUIC به جای SCTP به عنوان پروتکل انتقال خود استفاده می کند. از آنجایی که RTCQuicTransport
یک API مستقل است، سربار RTCPeerConnection
API را ندارد، که شامل پشته رسانه واقعی است.
چگونه؟
نمای کلی API عمومی
API دارای 3 انتزاع اصلی است، RTCIceTransport
، RTCQuicTransport
و RTCQuicStream
.
RTCIceTransport
ICE پروتکلی برای ایجاد اتصالات همتا به همتا از طریق اینترنت است و امروزه در WebRTC استفاده می شود. این شی یک API مستقل برای ایجاد یک اتصال ICE فراهم می کند. به عنوان انتقال بسته برای اتصال QUIC استفاده می شود و RTCQuicTransport
آن را در سازنده خود می گیرد.
RTCQuicTransport
یک اتصال QUIC را نشان می دهد. برای ایجاد یک اتصال QUIC و ایجاد جریان های QUIC استفاده می شود. همچنین آمارهای مربوط به سطح اتصال QUIC را نشان می دهد.
RTCQuicStream
برای خواندن و نوشتن داده ها به/از سمت راه دور استفاده می شود. جریان داده ها را به طور قابل اعتماد و به ترتیب انتقال می دهد. جریان های متعددی را می توان از یک RTCQuicTransport
ایجاد کرد و هنگامی که داده ها در یک جریان نوشته می شوند، یک رویداد "onquicstream" در حمل و نقل از راه دور اجرا می شود. Stream ها راهی برای تشخیص داده های مختلف در یک اتصال QUIC ارائه می دهند. مثالهای رایج میتواند ارسال فایلهای جداگانه در جریانهای جداگانه، تکههای کوچک داده در جریانهای مختلف، یا انواع مختلف رسانه در جریانهای جداگانه باشد. RTCQuicStream
سبک وزن هستند، روی یک اتصال QUIC مالتی پلکس می شوند و باعث مسدود شدن سر خط برای سایر RTCQuicStream
نمی شوند.
راه اندازی اتصال
در زیر مثالی برای راه اندازی یک اتصال QUIC نظیر به نظیر ارائه شده است. مانند RTCPeerConnection
، RTCQuicTransport
API به استفاده از یک کانال سیگنالینگ امن برای مذاکره در مورد پارامترهای اتصال، از جمله پارامترهای امنیتی آن نیاز دارد. 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);
}
};
انتقال داده
انتقال داده را می توان با استفاده از API های RTCQuicStream برای خواندن و نوشتن به دست آورد:
RTCQuicStreamReadResult readInto(Uint8Array data);
void write(RTCQuicStreamWriteParameters data);
Promise<void> waitForWriteBufferedAmountBelow(unsigned long amount);
Promise<void> waitForReadable(unsigned long amount);
بافر کردن
وعده های بازگردانده شده توسط متدهای waitFor*
اجازه می دهد تا داده ها را در زمانی که جاوا اسکریپت مشغول است، بافر کند. هنگامی که بافر خواندن در سمت دریافت پر می شود، فشار برگشتی به سمت ارسال اعمال می شود. سمت ارسال دارای یک بافر نوشتن است که می تواند در صورت اعمال فشار برگشتی پر شود، و بنابراین سمت نوشتن دارای یک متد waitForWriteBufferedAmountBelow
نیز می باشد تا امکان انتظار برای فضایی در بافر برای نوشتن فراهم شود. اطلاعات بیشتر در مورد نوشتن/خواندن داده ها را می توان در اسناد توسعه دهنده بیشتر یافت.
تحویل بدون سفارش / غیر قابل اطمینان
در حالی که یک RTCQuicStream
فقط از ارسال دادهها بهطور قابل اعتماد و منظم پشتیبانی میکند، تحویل غیرقابل اعتماد/نامرتب را میتوان از طریق روشهای دیگر به دست آورد. برای تحویل بدون سفارش، میتوان تکههای کوچکی از دادهها را در جریانهای جداگانه ارسال کرد، زیرا دادهها بین جریانها مرتب نمیشوند. برای تحویل نامطمئن، میتوان تکههای کوچکی از دادهها را با فینیش روی true ارسال کرد و پس از یک بازه زمانی reset()
در جریان فراخوانی کرد. مهلت زمانی باید به تعداد ارسال مجدد مورد نظر قبل از حذف داده بستگی داشته باشد.
چه زمانی؟
نسخه آزمایشی اصلی در نسخه کروم 73 آغاز می شود و تا نسخه M75 در دسترس خواهد بود. پس از این کار آزمایشی منشاء پایان خواهد یافت. بر اساس بازخورد و علاقه، تغییرات مناسبی ایجاد میکنیم و یا API را ارسال میکنیم، با نسخه آزمایشی مبدا جدید این API ادامه میدهیم، یا API را متوقف میکنیم.
کجا؟
مرورگر کروم در همه پلتفرم ها به جز iOS.
دیگه چی؟
بازخورد
یکی از اهداف اصلی آزمایش اولیه، دریافت بازخورد از شما، توسعه دهندگان است. ما علاقه مندیم به:
- این API چه چیزی را برای شما فعال می کند؟
- چگونه این API بر دیگر APIهای انتقال داده (
WebSocket
یاRTCDataChannel
WebRTC) بهبود می بخشد؟ چگونه می تواند بهبود یابد؟ - عملکرد
- ارگونومی API
برای آزمایش اولیه ثبت نام کنید
- برای مبدا خود یک نشانه درخواست کنید .
- توکن را به صفحات خود اضافه کنید، دو راه برای ارائه این نشانه در هر صفحه ای در مبدا وجود دارد:
- یک تگ
origin-trial
<meta>
را به سر هر صفحه اضافه کنید. برای مثال، ممکن است چیزی شبیه به این باشد:<meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
- اگر میتوانید سرور خود را پیکربندی کنید، میتوانید با استفاده از سرآیند
Origin-Trial
HTTP، توکن را در صفحات ارائه دهید. سرصفحه پاسخ حاصل باید چیزی شبیه به این باشد:Origin-Trial: TOKEN_GOES_HERE
- یک تگ
مشخصات وب
مشخصات پیش نویس در آزمایش اولیه از API جلوتر رفته است، از جمله:
- جریان های یک طرفه که بیشتر با جریان های WHATWG همسو هستند
- غیرفعال کردن ارسال مجدد
- (به زودی) دیتاگرام
ما علاقه مند به اجرای مشخصات کامل و فراتر از آن (از جمله پشتیبانی از جریان WHATWG) هستیم، اما می خواهیم ابتدا بازخورد شما را بشنویم!
امنیت
امنیت در دست دادن QUIC از طریق استفاده از یک کلید مشترک از قبل برای ایجاد یک اتصال QUIC رمزگذاری شده P2P اعمال می شود. این کلید باید از طریق یک کانال امن خارج از باند با تضمین محرمانه بودن و یکپارچگی سیگنال داده شود. توجه داشته باشید که کلید در معرض جاوا اسکریپت قرار می گیرد.
حمله فعال
برخلاف DTLS-SRTP، که فقط برای سیگنال دادن به اثر انگشت گواهی نیاز به یکپارچگی دارد، سیگنال دادن به کلید مشترک از قبل به یکپارچگی و محرمانه بودن نیاز دارد. اگر PSK به خطر بیفتد (مثلاً توسط سرور در کانال سیگنالینگ)، یک مهاجم فعال به طور بالقوه می تواند یک حمله مرد در وسط را علیه دست دادن QUIC انجام دهد.
وضعیت فعلی
مرحله | وضعیت |
---|---|
1. توضیح دهنده ایجاد کنید | کامل شود |
** 2 الف. مشخصات RTCQuicTransport ** | **در حال انجام** |
** 2 ب. مشخصات RTCIceTransport ** | **در حال انجام** |
**3. جمع آوری بازخورد و تکرار در طراحی ** | **در حال انجام** |
4. آزمایش مبدا | در Chrome 73 شروع می شود! |
5. راه اندازی کنید | شروع نشده است |
لینک های مفید
- مستندات بیشتر
- توضیح دهنده عمومی
- اشکال ردیابی
- درخواست یک نشانه آزمایشی مبدا
- نحوه استفاده از نشانه آزمایشی مبدا
- بحث در مورد مسائل مربوط به RTCQuicTransport
- بحث در مورد مسائل مربوط به RTCIceTransport