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.
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.
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'ninRTCDataChannel
) göre nasıl daha iyi hale gelir? Nasıl iyileştirilebilir? - Performans
- API ergonomisi
Kaynak denemesine kaydolun
- Kaynağınız için bir jeton isteyin.
- 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
- Herhangi bir sayfanın başına
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
- Diğer belgeler
- Herkese açık açıklayıcı
- İzleme hatası
- Kaynak deneme jetonu isteme
- Kaynak deneme jetonu nasıl kullanılır?
- RTCQuicTransport ile ilgili sorunlar hakkında tartışmalar
- RTCIceTransport ile ilgili sorunlar hakkında tartışmalar