WebTransport'u kullanma

WebTransport, düşük gecikme süreli, çift yönlü, istemci-sunucu mesajlaşması sunan bir API'dir. Kullanım alanları ve uygulamanın geleceği hakkında nasıl geri bildirim vereceğiniz hakkında daha fazla bilgi edinin.

Arka plan

WebTransport nedir?

WebTransport, çift yönlü aktarım olarak HTTP/3 protokolünü kullanan bir web API'sidir. Web istemcisi ile HTTP/3 sunucusu arasındaki iki yönlü iletişim için tasarlanmıştır. Datagram API'leri aracılığıyla verilerin güvenilir olmayan bir şekilde, akış API'leri aracılığıyla ise güvenilir bir şekilde gönderilmesini destekler.

Datagramlar, güçlü teslimat garantisi gerektirmeyen verileri göndermek ve almak için idealdir. Veri paketlerinin boyutu, temel bağlantının maksimum iletim birimi (MTU) ile sınırlıdır. Bu paketler başarıyla iletilebilir veya iletilemeyebilir. İletildikleri takdirde rastgele bir sırada ulaşabilirler. Bu özellikler, datagram API'lerini düşük gecikmeli ve en iyi çaba prensibiyle veri iletimi için ideal hale getirir. Datagramları, Kullanıcı Datagram Protokolü (UDP) mesajları olarak düşünebilirsiniz ancak bunlar şifrelenmiş ve tıkanıklık kontrolü yapılmış mesajlardır.

Bunun aksine, akış API'leri güvenilir ve sıralı veri aktarımı sağlar. Sıralı verilerin bir veya daha fazla akışını göndermeniz ya da almanız gereken senaryolar için uygundur. Birden fazla WebTransport akışı kullanmak, birden fazla TCP bağlantısı oluşturmaya benzer. Ancak HTTP/3, arka planda daha hafif olan QUIC protokolünü kullandığından bu akışlar, daha az ek yükle açılıp kapatılabilir.

Kullanım alanları

Bu, geliştiricilerin WebTransport'u kullanabileceği olası yolların küçük bir listesidir.

  • Oyun durumunu, küçük, güvenilmez ve sırası bozulmuş iletilerle düzenli aralıklarla ve minimum gecikmeyle sunucuya gönderme.
  • Diğer veri akışlarından bağımsız olarak, sunucudan gönderilen medya akışlarını minimum gecikmeyle alma.
  • Bir web sayfası açıkken sunucudan gönderilen bildirimleri alma

WebTransport'u nasıl kullanmayı planladığınız hakkında daha fazla bilgi edinmek istiyoruz.

Tarayıcı desteği

Browser Support

  • Chrome: 97.
  • Edge: 97.
  • Firefox: 114.
  • Safari: behind a flag.

Source

Evrensel tarayıcı desteği olmayan tüm özelliklerde olduğu gibi, özellik algılama yoluyla savunma amaçlı kodlama yapmak en iyi uygulamadır.

Mevcut durum

Step Durum
1. Açıklayıcı oluşturma Tamamlandı
2. Spesifikasyonun ilk taslağını oluşturma Tamamlandı
3. Geri bildirim toplama ve tasarımı yineleme Eksiksiz
4. Kaynak denemesi Eksiksiz
5. Lansman Chromium 97

WebTransport'un diğer teknolojilerle ilişkisi

WebTransport, WebSocket'lerin yerine mi geçiyor?

Açmanız gerekebilir. WebSockets veya WebTransport'un kullanılabileceği geçerli iletişim protokolleri olduğu kullanım alanları vardır.

WebSockets iletişimi, tek bir güvenilir ve sıralı mesaj akışı etrafında şekillenir. Bu, bazı iletişim ihtiyaçları için uygundur. Bu özelliklere ihtiyacınız varsa WebTransport'un akış API'leri de bunları sağlayabilir. Buna karşılık WebTransport'un datagram API'leri, güvenilirlik veya sıralama konusunda garanti vermeden düşük gecikmeli teslimat sağlar. Bu nedenle, WebSockets'in doğrudan yerine kullanılamaz.

WebTransport'u, datagram API'leri veya eşzamanlı birden fazla Streams API örneği aracılığıyla kullanmak, WebSockets'te sorun olabilecek ön sıradaki engelleme konusunda endişelenmenize gerek kalmayacağı anlamına gelir. Ayrıca, temel alınan QUIC el sıkışması, TLS üzerinden TCP başlatmaktan daha hızlı olduğundan yeni bağlantılar oluştururken performans avantajları elde edersiniz.

WebTransport, yeni bir taslak spesifikasyonun parçasıdır. Bu nedenle, istemci ve sunucu kitaplıkları etrafındaki WebSocket ekosistemi şu anda çok daha sağlamdır. Yaygın sunucu kurulumlarıyla ve geniş web istemcisi desteğiyle "kullanıma hazır" bir çözüm arıyorsanız WebSockets günümüzde daha iyi bir seçimdir.

WebTransport, UDP Socket API ile aynı mı?

Hayır. WebTransport, UDP Socket API değildir. WebTransport, HTTP/3'ü kullanır. HTTP/3 ise "arka planda" UDP'yi kullanır. WebTransport, şifreleme ve tıkanıklık kontrolüyle ilgili gereksinimleri nedeniyle temel bir UDP Socket API'sinden daha fazlasını sunar.

WebTransport, WebRTC veri kanallarına alternatif midir?

Evet, istemci-sunucu bağlantıları için. WebTransport, temel protokoller farklı olsa da WebRTC veri kanallarıyla aynı özelliklerin çoğunu paylaşır.

Genel olarak, HTTP/3 ile uyumlu bir sunucu çalıştırmak, WebRTC sunucusu çalıştırmaktan daha az kurulum ve yapılandırma gerektirir. WebRTC sunucusu çalıştırmak için çalışan bir aktarım elde etmek amacıyla birden fazla protokolün (ICE, DTLS ve SCTP) anlaşılması gerekir. WebRTC, başarısız istemci/sunucu görüşmelerine yol açabilecek çok daha fazla hareketli parça içerir.

WebTransport API, web geliştiricilerin kullanım alanları göz önünde bulundurularak tasarlanmıştır ve WebRTC'nin veri kanalı arayüzlerini kullanmaktan ziyade modern web platformu kodu yazmaya daha çok benzer. WebRTC'nin aksine WebTransport, Web Workers içinde desteklenir. Bu sayede, belirli bir HTML sayfasından bağımsız olarak istemci-sunucu iletişimi gerçekleştirebilirsiniz. WebTransport, Streams uyumlu bir arayüz sunduğundan geri basınç ile ilgili optimizasyonları destekler.

Ancak, halihazırda memnun olduğunuz çalışan bir WebRTC istemci/sunucu kurulumunuz varsa WebTransport'a geçiş pek avantaj sağlamayabilir.

Deneyin

WebTransport ile deneme yapmanın en iyi yolu, uyumlu bir HTTP/3 sunucusu başlatmaktır. Ardından, istemci/sunucu iletişimlerini denemek için bu sayfayı temel bir JavaScript istemcisiyle kullanabilirsiniz.

Ayrıca, topluluk tarafından bakımı yapılan bir echo sunucusu webtransport.day adresinde kullanılabilir.

API'yi kullanma

WebTransport, Streams API gibi modern web platformu temel öğeleri üzerine tasarlanmıştır. Bu yöntem büyük ölçüde sözlere dayanır ve async ile await ile iyi çalışır.

Chromium'daki mevcut WebTransport uygulaması üç farklı trafik türünü destekler: datagramlar, tek yönlü ve çift yönlü akışlar.

Sunucuya bağlanma

WebTransport örneği oluşturarak bir HTTP/3 sunucusuna bağlanabilirsiniz. URL'nin şeması https olmalıdır. Bağlantı noktası numarasını açıkça belirtmeniz gerekir.

Bağlantının kurulmasını beklemek için ready sözünü kullanmanız gerekir. Bu söz, kurulum tamamlanana kadar yerine getirilmez ve QUIC/TLS aşamasında bağlantı başarısız olursa reddedilir.

Bağlantı normal şekilde kapandığında closed sözü yerine getirilir, kapanma beklenmedik bir şekilde gerçekleştiyse söz reddedilir.

Sunucu, bağlantıyı bir istemci belirtisi hatası nedeniyle (ör. URL'nin yolu geçersiz) reddederse bu durum closed'nin reddedilmesine neden olurken ready çözümlenmeden kalır.

const url = 'https://example.com:4999/foo/bar';
const transport = new WebTransport(url);

// Optionally, set up functions to respond to
// the connection closing:
transport.closed.t>hen(() = {
  console.log(`The HTTP/3 connection to ${url} closed gracefully.`);
}).catch((>error) = {
  console.error(`The HTTP/3 connection to ${url} closed due to ${error}.`);
});

// Once .ready fulfills, the connection can be used.
await transport.ready;

Datagram API'leri

Bir sunucuya bağlı bir WebTransport örneğiniz olduğunda bunu, datagramlar olarak bilinen ayrı veri parçalarını göndermek ve almak için kullanabilirsiniz.

writeable alıcı, web istemcisinin sunucuya veri göndermek için kullanabileceği bir WritableStream döndürür. readable alıcı, ReadableStream döndürür. Bu sayede, sunucudan gelen verileri dinleyebilirsiniz. Her iki akış da doğası gereği güvenilir değildir. Bu nedenle, yazdığınız verilerin sunucu tarafından alınmaması veya bunun tam tersi bir durum yaşanabilir.

Her iki türdeki akışta da veri aktarımı için Uint8Array örnekleri kullanılır.

// Send two datagrams to the server.
const writer = transport.datagrams.writable.getWriter();
const data1 = new Uint8Array([65, 66, 67]);
const data2 = new Uint8Array([68, 69, 70]);
writer.write(data1);
writer.write(data2);

// Read datagrams from the server.
const reader = transport.datagrams.readable.getReader();
while (true) {
  const {value, done} = await reader.read();
  if (done) {
    break;
  }
  // value is a Uint8Array.
  console.log(value);
}

Streams API'leri

Sunucuya bağlandıktan sonra, Streams API'leri aracılığıyla veri göndermek ve almak için WebTransport'u da kullanabilirsiniz.

Tüm akışların her bir parçası Uint8Array olarak kabul edilir. Datagram API'lerinin aksine, bu akışlar güvenilirdir. Ancak her akış bağımsız olduğundan akışlar arası veri sırası garanti edilmez.

WebTransportSendStream

WebTransportSendStream için söz döndüren bir WebTransport örneğinin createUnidirectionalStream() yöntemi kullanılarak web istemcisi tarafından bir WebTransportSendStream oluşturulur.

İlişkili HTTP/3 akışını kapatmak için WritableStreamDefaultWriter close() yöntemini kullanın. Tarayıcı, ilişkili akışı kapatmadan önce bekleyen tüm verileri göndermeye çalışır.

// Send two Uint8Arrays to the server.
const stream = await transport.createUnidirectionalStream();
const writer = stream.writable.getWriter();
const data1 = new Uint8Array([65, 66, 67]);
const data2 = new Uint8Array([68, 69, 70]);
writer.write(data1);
writer.write(data2);
try {
  await writer.close();
  console.log('All data has been sent.');
} catch (error) {
  console.error(`An error occurred: ${error}`);
}

Benzer şekilde, sunucuya RESET_STREAM göndermek için WritableStreamDefaultWriter abort() yöntemini kullanın. abort() kullanılırken tarayıcı, henüz gönderilmemiş bekleyen verileri atabilir.

const ws = await transport.createUnidirectionalStream();
const writer = ws.getWriter();
writer.write(...);
writer.write(...);
await writer.abort();
// Not all the data may have been written.

WebTransportReceiveStream

WebTransportReceiveStream, sunucu tarafından başlatılır. WebTransportReceiveStream alma, web istemcisi için iki adımlı bir işlemdir. İlk olarak, bir WebTransport örneğinin incomingUnidirectionalStreams özelliğini çağırır ve bu özellik bir ReadableStream döndürür. Bu ReadableStream öğesinin her bir parçası, sunucu tarafından gönderilen Uint8Array örneklerini okumak için kullanılabilecek bir WebTransportReceiveStream öğesidir.

async function readFrom(receiveStream) {
  const reader = receiveStream.readable.getReader();
  while (true) {
    const {done, value} = await reader.read();
    if (done) {
      break;
    }
    // value is a Uint8Array
    console.log(value);
  }
}

const rs = transport.incomingUnidirectionalStreams;
const reader = rs.getReader();
while (true) {
  const {done, value} = await reader.read();
  if (done) {
    break;
  }
  // value is an instance of WebTransportReceiveStream
  await readFrom(value);
}

ReadableStreamDefaultReader öğesinin closed sözünü kullanarak akışın kapatıldığını algılayabilirsiniz. Temel HTTP/3 akışı FIN bitiyle kapatıldığında, tüm veriler okunduktan sonra closed sözü yerine getirilir. HTTP/3 akışı aniden kapatıldığında (örneğin, RESET_STREAM tarafından) closed sözü reddedilir.

// Assume an active receiveStream
const reader = receiveStream.readable.getReader();
reader.closed.then(() => {
  console.log('The receiveStream closed gracefully.');
}).ca>tch(() = {
  console.error('The receiveStream closed abruptly.');
});

WebTransportBidirectionalStream

WebTransportBidirectionalStream, sunucu veya istemci tarafından oluşturulabilir.

Web istemcileri, WebTransport örneğinin createBidirectionalStream() yöntemini kullanarak bir tane oluşturabilir. Bu yöntem, WebTransportBidirectionalStream için bir söz döndürür.

const stream = await transport.createBidirectionalStream();
// stream is a WebTransportBidirectionalStream
// stream.readable is a ReadableStream
// stream.writable is a WritableStream

WebTransport örneğinin incomingBidirectionalStreams özelliğiyle sunucu tarafından oluşturulan WebTransportBidirectionalStream öğesini dinleyebilirsiniz. Bu işlem, ReadableStream döndürür. Söz konusu ReadableStream öğesinin her bir parçası da WebTransportBidirectionalStream'dir.

const rs = transport.incomingBidirectionalStreams;
const reader = rs.getReader();
while (true) {
  const {done, value} = await reader.read();
  if (done) {
    break;
  }
  // value is a WebTransportBidirectionalStream
  // value.readable is a ReadableStream
  // value.writable is a WritableStream
}

WebTransportBidirectionalStream, yalnızca WebTransportSendStream ve WebTransportReceiveStream öğelerinin birleşimidir. Önceki iki bölümdeki örneklerde her birinin nasıl kullanılacağı açıklanmaktadır.

Diğer örnekler

WebTransport taslak spesifikasyonu, tüm yöntemler ve özelliklerle ilgili tam belgelerin yanı sıra bir dizi ek satır içi örnek içerir.

Chrome'un Geliştirici Araçları'nda WebTransport

Maalesef Chrome'un Geliştirici Araçları şu anda WebTransport'u desteklemiyor. Geliştirici Araçları arayüzündeki güncellemelerden haberdar olmak için bu Chrome sorununa "yıldız" ekleyebilirsiniz.

Polyfill

WebTransport'un bazı özelliklerini uygulayan webtransport-ponyfill-websocket adlı bir polyfill (daha doğrusu, kullanabileceğiniz bağımsız bir modül olarak işlevsellik sağlayan ponyfill) mevcuttur. Bu çözümün kullanım alanınız için uygun olup olmadığını belirlemek amacıyla projenin README bölümündeki kısıtlamaları dikkatlice okuyun.

Gizlilik ve güvenlik ile ilgili dikkat edilmesi gerekenler

Yetkili rehberlik için taslak spesifikasyonun ilgili bölümüne bakın.

Geri bildirim

Chrome ekibi, bu API'yi kullanırken yaşadığınız deneyimler ve düşünceleriniz hakkında bilgi edinmek istiyor.

API tasarımıyla ilgili geri bildirimler

API ile ilgili garip veya beklendiği gibi çalışmayan bir şey var mı? Yoksa fikrinizi uygulamak için eksik parçalar mı var?

Web Transport GitHub deposunda sorun bildirin veya düşüncelerinizi mevcut bir soruna ekleyin.

Uygulamayla ilgili sorun mu var?

Chrome'un uygulamasında bir hata mı buldunuz?

https://new.crbug.com adresinden hata bildirin. Yeniden üretmeyle ilgili basit talimatların yanı sıra mümkün olduğunca fazla ayrıntı ekleyin.

API'yi kullanmayı mı planlıyorsunuz?

Herkese açık desteğiniz, Chrome'un özelliklere öncelik vermesine yardımcı olur ve diğer tarayıcı satıcılarına bu özelliklerin desteklenmesinin ne kadar önemli olduğunu gösterir.

  • @ChromiumDev adresine #WebTransport hashtag'ini ve nerede, nasıl kullandığınıza dair ayrıntıları içeren bir tweet gönderin.

Genel tartışmalar

Diğer kategorilerden birine uymayan genel sorular veya sorunlar için web-transport-dev Google Grubu'nu kullanabilirsiniz.

Teşekkür

Bu makalede, WebTransport Açıklayıcı, taslak spesifikasyonu ve ilgili tasarım belgelerindeki bilgiler yer almaktadır. Bu temeli sağlayan ilgili yazarlara teşekkür ederiz.

Bu yayındaki hero resmi, Unsplash'te Robin Pierre tarafından çekilmiştir.