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

Nasıl yani?

RTCQuicTransport, QUIC protokolünü kullanarak uzaktaki eşlerle rastgele veri alışverişini sağlayan yeni bir web platformu API'sidir. Eşler arası kullanım alanlarına yönelik tasarlanmıştır ve bu nedenle ICE üzerinden eşler arası bağlantı kurmak için bağımsız bir RTCIceTransport API ile kullanılır. Veriler güvenilir bir şekilde ve sırayla taşınır (siparişsiz ve güvenilir olmayan teslimat ile ilgili ayrıntılar için aşağıdaki bölüme bakın). Genel, çift 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 taşıma 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 geliştirebilir, eşler arası bağlantılarla yapılabileceklerin sınırlarını zorlayabilirsiniz. Örneğin, özel bit hızı ayırma düğmelerinin kilidini açabilirsiniz. Gelecekte, kodlanmış medya için daha fazla destek, düşük seviyeli kontrollerle kendi video iletişim uygulamanızı derlemenize bile olanak tanıyabilir. WebRTC'nin NV girişimi, daha alt düzey API'lere geçmek için çalışıyor ve bununla erkenden denemeler yapmak değerlidir.

Neden QUIC?

Gerçek zamanlı iletişimler için QUIC protokolü tercih edilir. UDP üzerine kuruludur, yerleşik şifrelemeye, tıkanıklık kontrolüne sahiptir ve hat başı engelleme olmadan çoğaltılır. RTCQuicTransport, RTCDataChannel API'sine çok benzer yetenekler sunar ancak aktarım protokolü olarak SCTP yerine QUIC'yi 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ünden etkilenmez.

Nasıl mı?

Genel API'ye genel bakış

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

API mimarisini gösteren RTCQuicTransport şeması

RTCIceTransport

ICE, internet üzerinden eşler arası bağlantı kurmak için kullanılan bir protokoldür ve bugün WebRTC'de kullanılmaktadır. Bu nesne, ICE bağlantısı kurmak için bağımsız bir API sağlar. QUIC bağlantısı için paket aktarımı olarak kullanılır ve RTCQuicTransport, bunu oluşturucuda alı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 alakalı istatistikleri de gösterir.

RTCQuicStream

Uzak tarafa veri okumak ve yazmak için kullanılır. Akışlar, verileri güvenilir bir şekilde ve sırayla taşır. Aynı RTCQuicTransport öğesinden birden fazla akış oluşturulabilir ve veriler bir akışa yazıldıktan sonra uzaktan taşımada bir "onquicstream" etkinliği tetikler. Akışlar, aynı QUIC bağlantısındaki farklı verileri ayırt etmenin bir yolunu sunar. Yaygın örnekler arasında ayrı akışlara ayrı dosyalar, farklı akışlara ait küçük veri parçalarının veya farklı akışlar boyunca farklı medya türlerinin gönderilmesi verilebilir. RTCQuicStream'ler hafiftir, QUIC bağlantısı üzerinden çoğaltılır ve diğer RTCQuicStream'lerde hat başı engellemeye neden olmaz.

Bağlantı Kurulumu

Aşağıda, eşler arası QUIC bağlantısı kurmaya yönelik bir örnek verilmiştir. RTCPeerConnection gibi RTCQuicTransport API de güvenlik parametreleri dahil olmak üzere bağlantının parametrelerini düzenlemek için güvenli bir sinyal kanalının kullanılmasını gerektirir. RTCIceTransport, ICE parametrelerinin (ufrag ve şifre) yanı sıra RTCIceCandidate için anlaşır.

API mimarisini gösteren RTCQuicTransport şeması

Müşterinin 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 gerçekleştirilebilir:

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öntemlerinin döndürdüğü vaatler, JavaScript meşgul olduğunda verilerin arabelleğe alınmasına olanak tanır. Okuma arabelleği alma tarafında dolduğunda, gönderme tarafına geri baskı uygulanır. Gönderme tarafında, geri baskı uygulandığında doldurulabilecek bir yazma arabelleği vardır. Bu nedenle, yazma tarafında da arabelleğe alan tarafın yazması için yer beklenmesini sağlayacak bir waitForWriteBufferedAmountBelow yöntemi bulunur. Veri yazma/okuma hakkında daha fazla bilgiyi diğer geliştirici belgelerinde bulabilirsiniz.

Siparişsiz/Güvenilir Olmayan Teslimat

RTCQuicStream, verilerin yalnızca güvenilir şekilde ve sıralı olarak gönderilmesini destekler, ancak güvenilir olmayan/sırasız yayınlama başka yollarla da gerçekleştirilebilir. Siparişsiz teslimatta, veriler akışlar arasında sıralanmadığından küçük veri parçaları ayrı akışlarda gönderilebilir. Güvenilir olmayan teslimat için bitiş doğru olarak ayarlanmış küçük veri parçaları gönderilebilir. Ardından zaman aşımından sonra akışta reset() çağrısı yapılabilir. Zaman aşımı, veriler atlanmadan önce kaç yeniden iletim istendiğine bağlı olmalıdır.

Ne zaman?

Kaynak denemesi Chrome 73 sürümünde başlayacak ve M75 sürümüne kadar (M75 dahil) kullanılabilecektir. Bu sürenin sonunda kaynak denemesi sona erer. Geri bildirim ve ilgiye göre gerekli değişiklikleri yapıp API'yi gönderecek, bu API'nin yeni kaynak denemesiyle devam edecek veya API'yi kullanımdan kaldıracağız.

Nerede?

iOS hariç tüm platformlarda Chrome Tarayıcı.

Başka bir konu var mı?

Geri bildirim

Kaynak denemesinin ana hedeflerinden biri, siz geliştiricilerden geri bildirim almaktır. İlgi alanlarımız:

  • Bu API size neler sağlar?
  • Bu API, diğer veri aktarımı API'lerine (WebSocket veya WebRTC'nin RTCDataChannel) göre nasıl daha iyi hale gelir? Nasıl iyileştirilebilir?
  • Performans
  • API ergonomisi

Kaynak denemesine kaydolun

  1. Kaynağınız için bir jeton isteyin.
  2. Sayfalarınıza jeton ekleyin. Bu jetonu kaynağınızdaki tüm sayfalarda sağlamanın iki yolu vardır:
    • Herhangi bir sayfanın başına origin-trial <meta> etiketi ekleyin. Örneğin, bu hesap aşağıdaki gibi görünebilir: <meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
    • Sunucunuzu yapılandırabiliyorsanız sayfalardaki jetonu Origin-Trial HTTP üst bilgisi kullanarak da sağlayabilirsiniz. Bu işlem sonucunda elde edilen yanıt başlığı şuna benzer şekilde olmalıdır: Origin-Trial: TOKEN_GOES_HERE

Web Spesifikasyonu

Aşağıdakiler dahil olmak üzere taslak spesifikasyon, kaynak denemesinde API'nin önüne taşındı:

  • whatWG akışlarıyla daha yakından uyumlu olan tek yönlü akışlar
  • Yeniden iletimleri devre dışı bırakma
  • (Çok yakında) datagramlar

Spesifikasyonun tamamını ve daha fazlasını (whatWG akış desteği dahil) uygulamak istiyoruz ancak önce geri bildiriminizi duymak istiyoruz.

Güvenlik

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

Aktif Saldırı

Yalnızca sertifika parmak izini göndermek için bütünlük gerektiren DTLS-SRTP'nin aksine, önceden paylaşılan anahtara sinyal vermek için bütünlük ve gizlilik gerekir. PSK'nin güvenliği ihlal edilirse (örneğin, sinyal kanalındaki sunucu tarafından) etkin bir saldırgan QUIC el sıkışmasına karşı ortadaki adam saldırısı yapabilir.

Mevcut durum

Adım Durum
1. Açıklayıcı oluşturun Tamamlandı
**2a. RTCQuicTransport Spesifikasyonu ** **Devam Ediyor**
**2b. RTCIceTransport Spesifikasyonu ** **Devam Ediyor**
**3. Geri bildirim alma ve tasarımı tekrarlama** **Devam Ediyor**
4. Kaynak denemesi Chrome 73'te başlıyor!
5. Başlatın Başlatılmadı

Yararlı Bağlantılar