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.
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.
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'ninRTCDataChannel
) kıyasla nasıl bir iyileştirme sunuyor? Nasıl iyileştirilebilir? - Performans
- API ergonomisi
Kaynak denemesine kaydolma
- Kaynağınız için jeton isteyin.
- 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
- Herhangi bir sayfanın başına bir
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
- Diğer dokümanlar
- Herkese açık açıklama
- İzleme hatası
- Kaynak deneme jetonu isteme
- Kaynak deneme jetonunu kullanma
- RTCQuicTransport ile ilgili sorunlarla ilgili tartışma
- RTCIceTransport ile ilgili sorunlarla ilgili tartışma