RTCQuicTransport Yakınınızdaki Bir Kaynak Denemesine Geliyor (Chrome 73)

Ne?

RTCQuicTransport, QUIC protokolünü kullanarak uzak eşlerle rastgele veri alışverişine olanak tanıyan yeni bir web platformu API'sidir. Eşler arası kullanım alanları için tasarlanmıştır ve bu nedenle ICE üzerinden eşler arası bağlantı kurmak için bağımsız bir RTCIceTransport API'siyle kullanılır. Veriler güvenilir ve sıralı bir şekilde aktarılır (sıralı olmayan ve güvenilir olmayan yayınlama hakkında ayrıntılar için aşağıdaki bölüme bakın). Genel, iki yönlü bir veri aktarımı olduğundan oyun, dosya aktarımı, medya aktarımı, mesajlaşma vb. için kullanılabilir.

Neden?

Güçlü bir düşük düzey veri aktarma API'si, uygulamaların (gerçek zamanlı iletişim gibi) web'de yeni şeyler yapmasını sağlayabilir. API'yi temel alarak kendi çözümlerinizi oluşturabilir, eşler arası bağlantılarla yapılabilecek şeylerin sınırlarını zorlayabilir (ör. özel bit hızı atama düğmelerinin kilidini açabilirsiniz). Gelecekte, kodlanmış medya için daha fazla destek sağlandığında düşük düzey kontrollere sahip kendi video iletişim uygulamanızı bile oluşturabilirsiniz. WebRTC'nin NV çalışması, daha düşük düzey API'lere geçmeyi amaçlamaktadır ve bu konuda erken denemeler yapmak değerlidir.

Neden QUIC?

QUIC protokolü, gerçek zamanlı iletişim için tercih edilir. UDP'nin üzerine inşa edilmiştir, yerleşik şifreleme ve tıkanıklık kontrolüne sahiptir ve sıra başında engelleme olmadan çoklu yayın yapılır. RTCQuicTransport, RTCDataChannel API'ye çok benzer özellikler sunar ancak taşıma protokolü olarak SCTP yerine QUIC kullanır. RTCQuicTransport bağımsız bir API olduğundan gerçek zamanlı medya yığınını içeren RTCPeerConnection API'sinin ek yüküne sahip değildir.

Nasıl mı?

Genel API'ye genel bakış

API'de RTCIceTransport, RTCQuicTransport ve RTCQuicStream olmak üzere 3 ana soyutlama vardır.

API'nin mimarisini gösteren RTCQuicTransport şeması

RTCIceTransport

ICE, internet üzerinden eşler arası bağlantılar kurmak için kullanılan ve günümüzde WebRTC'de kullanılan bir protokoldür. Bu nesne, ICE bağlantısı oluşturmak için bağımsız bir API sağlar. QUIC bağlantısı için paket aktarımı olarak kullanılır ve RTCQuicTransport tarafından kurucusuna alınır.

RTCQuicTransport

QUIC bağlantısını temsil eder. QUIC bağlantısı kurmak ve QUIC akışları oluşturmak için kullanılır. Ayrıca QUIC bağlantı düzeyiyle ilgili istatistikleri de gösterir.

RTCQuicStream

Uzak taraftan veri okumak ve yazmak için kullanılır. Akışlar, verileri güvenilir ve düzenli bir şekilde aktarır. Aynı RTCQuicTransport kaynağından birden fazla akış oluşturulabilir ve bir akışa veri yazıldıktan sonra uzak aktarımda bir "onquicstream" etkinliği tetiklenir. Akışlar, aynı QUIC bağlantısında farklı verileri ayırt etmenin bir yolunu sunar. Ayrı akışlarda ayrı dosyalar, farklı akışlarda küçük veri parçaları veya farklı akışlarda farklı medya türleri göndermek yaygın örneklerdir. RTCQuicStream'ler hafiftir, QUIC bağlantısı üzerinden çoklu yayın yapar ve diğer RTCQuicStream'lerin başında engellemeye neden olmaz.

Bağlantı Kurulumu

Aşağıda, eşler arası QUIC bağlantısı oluşturmaya dair bir örnek verilmiştir. RTCPeerConnection gibi RTCQuicTransport API'si de güvenlik parametreleri dahil olmak üzere bağlantının parametrelerini görüşmek için güvenli bir sinyalleme kanalının kullanılmasını gerektirir. RTCIceTransport, ICE parametrelerinin (ufrag ve şifre) yanı sıra RTCIceCandidate'ların pazarlığını yapar.

API'nin mimarisini gösteren RTCQuicTransport şeması

Müşteri bakış açı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);
  }
};

Sunucu perspektifi:

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);
  }
};

Veri Aktarımı

Veri aktarımı, okuma ve yazma için RTCQuicStream API'leri kullanılarak yapılabilir:

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

Arabelleğe alınıyor

waitFor* yöntemleri tarafından döndürülen promises, JavaScript meşgulken verilerin arabelleğe alınmasına olanak tanır. Alıcı taraftaki okuma arabelleği dolduğunda gönderen tarafa geri basınç uygulanır. Gönderen tarafta, geri basınç uygulandığında dolabilecek bir yazma arabelleği vardır. Bu nedenle, yazma tarafında da yazmak için arabellekte yer beklemeye olanak tanıyan bir waitForWriteBufferedAmountBelow yöntemi vardır. Veri yazma/okuma hakkında daha fazla bilgiyi geliştirici dokümanlarından edinebilirsiniz.

Sipariş edilmeyen/güvenilir olmayan teslimat

RTCQuicStream yalnızca verilerin güvenilir ve sıralı bir şekilde gönderilmesini desteklese de güvenilir olmayan/sıralı olmayan yayınlama diğer yöntemlerle yapılabilir. Veriler akışlar arasında sıralı olmadığından, sırasız yayınlama için ayrı akışlarda küçük veri parçaları gönderilebilir. Güvenilir olmayan yayınlama için, bitiş değeri true olarak ayarlanmış küçük veri parçaları gönderebilir ve ardından bir zaman aşımı süresinden sonra yayında reset() çağrısı yapabilirsiniz. Zaman aşımı, verileri bırakmadan önce kaç kez yeniden aktarma işlemi yapılmasına bağlı olmalıdır.

Ne zaman?

Kaynak denemesi Chrome 73 sürümünde başlayacak ve M75 sürümü dahil olmak üzere kullanılabilir. Bu işlemden sonra kaynak denemesi sona erer. Geri bildirimlere ve ilgiye göre gerekli değişiklikleri yapıp API'yi kullanıma sunacağız, bu API'nin yeni bir kaynak deneme sürümüne devam edeceğiz veya API'nin kullanımını sonlandıracağız.

Nerede?

iOS dışındaki tüm platformlarda Chrome Tarayıcı.

Başka bir konu var mı?

Geri bildirim

Kaynak deneme sürümünün ana hedeflerinden biri, geliştiricilerden geri bildirim almaktır. Şu konularla ilgileniyoruz:

  • Bu API size ne sağlıyor?
  • Bu API, diğer veri aktarımı API'lerine (WebSocket veya WebRTC'nin RTCDataChannel) kıyasla nasıl bir iyileştirme sunuyor? Nasıl iyileştirilebilir?
  • Performans
  • API ergonomisi

Kaynak denemesine kaydolma

  1. Kaynağınız için jeton isteyin.
  2. Jetonu sayfalarınıza ekleyin. Bu jetonu kaynağınızdaki herhangi bir sayfada sağlamanın iki yolu vardır:
    • Herhangi bir sayfanın başına bir origin-trial <meta> etiketi ekleyin. Örneğin, bu şu şekilde görünebilir: <meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
    • Sunucunuzu yapılandırabiliyorsanız jetonu Origin-Trial HTTP üst bilgisi kullanarak sayfalarda da sağlayabilirsiniz. Elde edilen yanıt başlığı şu şekilde görünmelidir: Origin-Trial: TOKEN_GOES_HERE

Web Spesifikasyonu

Taslak spesifikasyon, kaynak denemesinde API'den daha ileri bir aşamaya geldi. Bu aşamada aşağıdakiler de dahildir:

  • WHATWG akışlarıyla daha uyumlu olan tek yönlü akışlar
  • Yeniden yayınları devre dışı bırakma
  • (Yakında) veri paketleri

Spesifikasyonun tamamını ve daha fazlasını (WHATWG yayın desteği dahil) uygulamak istiyoruz ancak önce geri bildiriminizi almak istiyoruz.

Güvenlik

QUIC el sıkışmasındaki güvenlik, şifrelenmiş bir P2P QUIC bağlantısı oluşturmak için önceden paylaşılmış bir anahtar kullanılarak zorunlu kılınır. Bu anahtarın, gizlilik ve bütünlük garantileri olan güvenli bir bant dışı kanal üzerinden gönderilmesi gerekir. Anahtarın JavaScript'e açık olacağını unutmayın.

Aktif Saldırı

Sertifika parmak izinin sinyali için yalnızca bütünlük gerektiren DTLS-SRTP'nin aksine, önceden paylaşılan anahtarın sinyali için bütünlük ve gizlilik gerekir. PSK'nın güvenliği ihlal edilirse (ör. sinyal kanalındaki sunucu tarafından) etkin bir saldırgan, QUIC el sıkışmasına karşı ortadaki adam saldırısı düzenleyebilir.

Mevcut durum

Step Durum
1. Açıklayıcı oluşturma Tamamlandı
**2a. RTCQuicTransport Spesifikasyonu ** **Devam Ediyor**
**2b. RTCIceTransport Spesifikasyonu ** **Devam Ediyor**
**3. Geri bildirim toplayın ve tasarımda iterasyon yapın** **Devam Ediyor**
4. Kaynak denemesi Chrome 73'ten itibaren geçerlidir.
5. Başlat Başlatılmadı

Yararlı Bağlantılar