RTCQuicTransport به نسخه آزمایشی اصلی نزدیک شما (Chrome 73) می رسد

چی؟

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 .

نمودار RTCQuicTransport که معماری API را نشان می دهد

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 مذاکره می کند.

نمودار RTCQuicTransport که معماری API را نشان می دهد

دیدگاه مشتری:

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

برای آزمایش اولیه ثبت نام کنید

  1. برای مبدا خود یک نشانه درخواست کنید .
  2. توکن را به صفحات خود اضافه کنید، دو راه برای ارائه این نشانه در هر صفحه ای در مبدا وجود دارد:
    • یک تگ 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. راه اندازی کنید شروع نشده است

لینک های مفید