Zum Hauptinhalt springen




QuicTransport es una nueva API que ofrece mensajería cliente-servidor bidireccional de baja latencia. Obtenga más información sobre sus casos de uso y cómo dar comentarios sobre el futuro de la implementación.


Aktualisiert

Hintergrund

Was ist QuicTransport?

QuicTransport es una API Netz que usa QUIC protocolo en un transporte bidireccional, no HTTP. Está diseñado para comunicaciones bidireccionales entre un Klient web y un Server QUIC. Admite el envío de datos de manera poco confiable mediante sus API de datagramas y de manera confiable mediante sus API de transmisión.

Datagramme Sie sind ideal zum Senden und Empfangen von Daten, für die keine strengen Zustellgarantien erforderlich sind. Einzelne Datenpakete sind in der Größe durch die begrenzt maximale Übertragungseinheit (MTU) der zugrunde liegenden Verbindung und können erfolgreich übertragen werden oder nicht, und wenn sie übertragen werden, können sie in einer beliebigen Reihenfolge eintreffen. Diese Funktionen machen Datagram-APIs ideal für die Datenübertragung mit geringer Latenz und bestem Aufwand. Sie können sich Datagramme als vorstellen Benutzerdatagrammprotokoll (UDP) Nachrichten, aber verschlüsselt und durch Überlastung kontrolliert.

Im Gegensatz dazu bieten Streams-APIs vertrauenswürdig, transferencia de datos ordenada. Ellos son muy adecuado a escenarios en los que requiere enviar o recibir uno o más flujos de datos ordenados. El uso de diversos flujos QUIC es análogo a determinar diversos TCP Verbindungen, aber QUIC-Flows sind leicht und können ohne großen Aufwand geöffnet und geschlossen werden.

Was ist WebTransport?

QuicTransport ist ein Teil des Größeren WebTransport-Initiative. WebTransport ist eine Sammlung von APIs zum Senden und Empfangen von Daten zwischen einem Webclient und einem Server. QuicTransport ist die Schnittstelle zur Verwendung des QUIC-Protokolls im Kontext der bidirektionalen WebTransport-Kommunikation.

Chrome implementiert zuerst den QuicTransport-Teil von WebTransport, vor allen anderen vorgeschlagenen Schnittstellen. Das Chrome-Team traf die Entscheidung, QuicTransport zu starten, nachdem es mit Webentwicklern über deren Anwendungsfälle gesprochen hatte. Wir freuen uns darauf, auf der Grundlage der Erfahrungen der Entwickler mit QuicTransport frühzeitig Feedback zu den gesamten WebTransport-Anstrengungen einzuholen.

Anwendungsfälle

Dies ist eine kleine Liste der Möglichkeiten, wie Entwickler QuicTransport verwenden können.

  • Enviar el estado del juego a intervalos regulares con una latencia mínima a un servidor mediante mensajes pequeños, poco fiables y fuera de orden.
  • Recibir flujos de medios enviados desde un servidor con una latencia mínima, sin tener en cuenta otros flujos de datos.
  • Empfangen Sie Benachrichtigungen, die von einem Server gesendet wurden, während eine Webseite geöffnet ist.

Como parte del procedimiento de prueba de origen, nos interesa saber más acerca de cómo planea utilizar QuicTransport.

Tatsächlicher Zustand

Er ging vorbei Bedingung
1. Erstellen Sie einen Erklärer Fertigstellen
2. Erstellen Sie eine erste Entwurfsspezifikation Fertigstellen
3. Sammeln Sie Feedback und wiederholen Sie das Design In Bearbeitung
4. Herkunftsnachweis In Bearbeitung
5. Starten Sie Nicht angefangen

Verknüpfung von QuicTransport mit anderen Technologien

Ist QuicTransport ein Ersatz für WebSockets?

Vielleicht Es gibt Anwendungsfälle, in denen WebSockets o QuicTransport kann ein gültiges Kommunikationsprotokoll sein.

Die WebSockets-Kommunikation basiert auf einem einzigen, zuverlässigen und geordneten Nachrichtenfluss, der für einige Arten von Kommunikationsanforderungen geeignet ist. Wenn Sie diese Funktionen benötigen, können sie auch von den QuicTransport-Stream-APIs bereitgestellt werden. Im Vergleich dazu bieten die Datagramm-APIs von QuicTransport eine Bereitstellung mit geringer Latenz, ohne Zuverlässigkeits- oder Bestellgarantien, sodass sie kein direkter Ersatz für WebSockets sind.

El uso de QuicTransport, mediante las API de datagramas o a través de diversos instancias de API Streams concurrentes, significa que no tiene que preocuparse por Head-of-Line-Blockierung, was bei WebSockets hinderlich sein kann. Gleichzeitig ergeben sich Leistungsvorteile bei der Ermittlung neuer Verbindungen, da Schneller Händedruck Es ist schneller als das Starten von TCP über TLS.

QuicTransport es parte de un nuevo borrador de especificación y, como tal, el ecosistema WebSocket en torno a las bibliotecas de cliente y servidor es hoy en día mucho más sólido. Si requiere algo que funcione «fuera de la caja» con configuraciones de servidor comunes y con un amplio soporte de cliente web, WebSockets es una mejor opción hoy.

Ist QuicTransport dasselbe wie eine UDP-Socket-API?

QuicTransport ist kein UDP-Socket-API. Aunque QUIC utiliza UDP «bajo el capó», QuicTransport tiene requerimientos en torno al cifrado y el control de la congestión que lo hacen más que una API básica de UDP Socket.

Ist QuicTransport eine Alternative zu WebRTC-Datenkanälen?

Ja, für Client-Server-Verbindungen. QuicTransport hat viele der gleichen Eigenschaften wie WebRTC-Datenkanäle, obwohl die zugrunde liegenden Protokolle unterschiedlich sind.

Los canales de datos WebRTC admiten comunicaciones de igual a igual, pero QuicTransport solo admite la conexión cliente-servidor. Si cuenta con varios clientes que necesitan hablar de forma directa entre sí, QuicTransport no es una opción factible.

Im Allgemeinen erfordert der Betrieb eines QUIC-kompatiblen Servers weniger Installation und Konfiguration als die Wartung eines WebRTC-Servers, was bedeutet, dass Sie verschiedene Protokolle verstehen (EIS, DTLSy SCTP) für einen funktionierenden Transport. WebRTC hat viele weitere bewegliche Teile, die zu fehlgeschlagenen Client-Server-Verhandlungen führen könnten.

La API de QuicTransport se diseñó teniendo en cuenta los casos de uso de los desarrolladores web, y debería sentirse más como escribir código de plataforma web moderna que utilizar las interfaces de Kanal de datos de WebRTC. Im Gegensatz zu WebRTC, QuicTransport wird in unterstützt Web-Mitarbeiter, que le posibilita realizar comunicaciones cliente-servidor sin tener en cuenta una página HTML determinada. Debido a que QuicTransport expone un Strömungen-kompatible Schnittstelle, unterstützt Optimierungen rund um Gegendruck.

A pesar de todo, si ya dispone de una configuración de cliente / servidor WebRTC en funcionamiento con la que está satisfecho, es factible que cambiar a QuicTransport no ofrezca muchas ventajas.

Probier es aus

Der beste Weg, um mit QuicTransport zu experimentieren, ist die Verwendung von dieser Python-Code um einen QUIC-kompatiblen Server lokal zu starten. Sie können diese Seite dann mit a . verwenden grundlegender JavaScript-Client um die Client / Server-Kommunikation zu testen.

Verwenden der API

QuicTransport wurde nach den Grundelementen der modernen Webplattform entwickelt, wie z Streams API. Es hängt stark davon ab Versprechenund es passt ganz gut dazu asynchron y erwarten.

La prueba de origen de QuicTransport admite tres tipos distintos de der Verkehr: datagramas, así como flujos unidireccionales y bidireccionales.

Stellen Sie eine Verbindung zu einem Server her

Sie können eine Verbindung zu einem QUIC-Server herstellen, indem Sie eine erstellen QuicTransport ejemplo. El esquema de la Url muss sein Quic-Transport. Sie müssen die Portnummer explizit angeben.

Sie sollten die verwenden bereit verspricht, auf den Verbindungsaufbau zu warten. Dieses Versprechen wird erst erfüllt, wenn die Konfiguration abgeschlossen ist und wird abgelehnt, wenn die Verbindung in der QUIC / TLS-Phase fehlschlägt.

das geschlossen Die Zusage wird erreicht, wenn die Verbindung regelmäßig geschlossen wird, und wird abgelehnt, wenn die Schließung unerwartet war.

Wenn der Server die Verbindung aufgrund von a ablehnt Kundenangabe Fehler (z. B. URL-Pfad ist ungültig) dann verursacht das geschlossen ablehnen, während bereit bleibt ungelöst.

const dirección url = 'quic-transport://example.com:4999/foo/bar';
const Transport = new QuicTransport(dirección url);


Transport.geschlossen.then(() => {
console.Log(`The QUIC connection to ${dirección url} closed gracefully.`);
}).catch((Error) => {
console.Error('The QUIC connection to ${dirección url} closed due to ${error}.');
});


erwarten Transport.bereit;

Datagramm-API

Sobald Sie eine Instanz von QuicTransport haben, die mit einem Server verbunden ist, können Sie damit diskrete Datenbits senden und empfangen, die als bezeichnet werden Datagramme.

das sendDatagrams () Die Methode gibt a zurück WritableStream, mit dem ein Webclient Daten an den Server senden kann. das receiveDatagrams () Die Methode gibt a zurück ReadableStream, lo que le posibilita escuchar datos del servidor. Ambas transmisiones son inherentemente poco confiables, por lo que es factible que el servidor no reciba los datos que escriba y viceversa.

Beide Stromarten verwenden Uint8Array Instanzen für die Datenübertragung.


const ws = Transport.sendDatagrams();
const writer = ws.getWriter();
const data1 = new Uint8Array([65, 66, 67]);
const data2 = new Uint8Array([68, 69, 70]);
writer.write(data1);
writer.write(data2);


const rs = Transport.receiveDatagrams();
const Leser = rs.getReader();
während (wahr) {
const {Wert, erledigt} = erwarten Leser.read();
wenn (erledigt) {
brechen;
}
console.Log(Wert);
}

Chrome Nr hoy en día aussetzen a asynchroner Iterator zum ReadableStream. Im Moment verwenden Sie die getReader () Methode kombiniert mit a while () Schleife ist der beste Weg, um aus der Sequenz zu lesen.

Streams API

Sobald Sie sich mit dem Server verbunden haben, können Sie QuicTransport auch zum Senden und Empfangen von Daten mithilfe seiner API-Streams verwenden.

Jeder Teil aller Übertragungen ist a Uint8Array. Im Gegensatz zu den Datagramm-APIs sind diese Streams zuverlässig. Da jedoch jeder Stream unabhängig ist, kann die Reihenfolge der Daten zwischen den Streams nicht garantiert werden.

SendStream

EIN SendStream wird vom Webclient mit dem createSendStream () Methode eines QuicTransport Instanz, die ein Versprechen für die zurückgibt SendStream.

Verwenden Sie die schließen () Methode von WritableStreamDefaultWriter verbunden mit der Sequenz zum Senden von a QUIC Stream FIN Bit al servidor. El Browser intenta enviar todos los datos pendientes antes de cerrar el flujo QUIC asociado.


const Strom = erwarten Transport.createSendStream();
const writer = Strom.schreibbar.getWriter();
const data1 = new Uint8Array([65, 66, 67]);
const data2 = new Uint8Array([68, 69, 70]);
writer.write(data1);
writer.write(data2);
try {
erwarten writer.close();
console.Log('All data has been sent.');
} catch (Error) {
console.Error(`An error occurred: ${Error}`);
}

Verwenden Sie auf die gleiche Weise die abort () Methode von WritableStreamDefaultWriter senden a QUIC RESET_STREAM zum Server. Wenn Sie verwenden abort (), kann der Browser alle ausstehenden Daten verwerfen, die noch nicht gesendet wurden.

const ws = erwarten Transport.createSendStream();
const writer = ws.getWriter();
writer.write(...);
writer.write(...);
erwarten writer.abort();

ReceiveStream

EIN ReceiveStream es wird vom Server gestartet. Holen Sie sich ReceiveStream Es ist ein zweistufiges Verfahren für einen Webclient. Erster Aufruf receiveStreams () Methode eines QuicTransport Instanz, die a zurückgibt ReadableStream. Jedes Stück davon ReadableStreamist wiederum a ReceiveStream damit kann man lesen Uint8Array Vom Server übermittelte Instanzen.

asynchron Funktion readFrom(receiveStream) {
const Leser = receiveStream.lesbar.getReader();
während (wahr) {
const {erledigt, Wert} = erwarten Leser.read();
wenn (erledigt) {
brechen;
}
console.Log(Wert);
}
}

const rs = Transport.receiveStreams();
const Leser = rs.getReader();
während (wahr) {
const {erledigt, Wert} = erwarten Leser.read();
wenn (erledigt) {
brechen;
}
erwarten readFrom(Wert);
}

Das Schließen eines Stroms können Sie anhand der geschlossen Versprechen von ReadableStreamDefaultReader. Wenn die QUIC-Sequenz ist geschlossen mit dem FIN-Bit, das geschlossen Das Versprechen wird nach dem Lesen aller Daten erreicht. Wenn der QUIC-Flow abrupt geschlossen wird (zum Beispiel durch STREAM_RESET), so dass er geschlossen Versprechen abgelehnt.


const Leser = receiveStream.lesbar.getReader();
Leser.geschlossen.then(() => {
console.Log('The receiveStream closed gracefully.');
}).catch(() => {
console.Error('The receiveStream closed abruptly.');
});

Bidirektionaler Strom

EIN Bidirektionaler Strom Es kann vom Server oder vom Client erstellt werden.

Web-Clients können eine erstellen, indem Sie die createBidirectionalStream () Methode eines QuicTransport Instanz, die ein Versprechen für a zurückgibt Bidirektionaler Strom.

const Strom = erwarten Transport.createBidirectionalStream();

Kannst du ein hören? Bidirektionaler Strom erstellt vom Server mit dem receiveBidirectionalStreams () Methode eines QuicTransport Instanz, die a zurückgibt ReadableStream. Jedes Stück davon ReadableStreamist wiederum a Bidirektionaler Strom.

const rs = Transport.receiveBidrectionalStreams();
const Leser = rs.getReader();
während (wahr) {
const {erledigt, Wert} = erwarten Leser.read();
wenn (erledigt) {
brechen;
}
}

EIN Bidirektionaler Strom es ist nur eine Kombination von a SendStream y ReceiveStream. Die Beispiele in den vorherigen beiden Abschnitten erklären, wie Sie sie verwenden.

Mehr Beispiele

das WebTransport-Spezifikationsprojekt Enthält mehrere zusätzliche Online-Beispiele sowie eine vollständige Dokumentation aller Methoden und Eigenschaften.

Unterstützung beim Ursprungsnachweis aktivieren

  1. Fordern Sie einen Token an von Ihrer Herkunft.
  2. Fügen Sie das Token Ihren Seiten hinzu. Es gibt zwei Möglichkeiten, dies zu tun:
    • Füge hinzu ein Ursprungsversuch Tag an die Kopfzeile jeder Seite an. Als Beispiel könnte dies so aussehen:
    • Wenn Sie Ihren Server konfigurieren können, können Sie das Token auch mit a . hinzufügen Origin-Trial HTTP-Header. Der resultierende Antwortheader sollte folgendermaßen aussehen:
      Origin-Trial: TOKEN_GOES_HERE

QuicTransport in Chrome DevTools

Unglücklicherweise, Chrome DevTools Die Unterstützung für QuicTransport ist nicht bereit für den Beginn des Ursprungsnachweises. Bitte "Stern" dieses Chromproblem um Benachrichtigungen über Updates in der DevTools-Oberfläche zu erhalten.

Datenschutz- und Sicherheitsaspekte

Bitte sehen Sie sich ... an jeweiliger Abschnitt des Spezifikationsentwurfs für maßgebliche Leitlinien.

Feedback

Das Chrome-Team möchte Ihre Gedanken und Erfahrungen mit dieser API während des gesamten Quelltestverfahrens hören.

Kommentare zum API-Design

Könnte etwas in der API sein, das umständlich ist oder nicht wie erwartet funktioniert? Oder fehlen noch Teile, die Sie brauchen, um Ihre Idee in die Tat umzusetzen?

Präsentieren Sie ein Hindernis im Web Transport GitHub Repositoryoder fügen Sie Ihre Gedanken zu einem bestehenden Hindernis hinzu.

Problem mit der Implementierung?

Haben Sie einen Fehler bei der Chrome-Implementierung gefunden?

Einen Fehler einreichen https://new.crbug.com. Geben Sie so viele Details wie möglich sowie einfache Anweisungen für die Reproduktion an.

Planen Sie, die API zu verwenden?

Su soporte público ayuda a Chrome a priorizar funciones y muestra a otros proveedores de Browser lo importante que es brindarles soporte.

  • Stellen Sie sicher, dass Sie sich für das angemeldet haben Essay der Herkunft para mostrar su interés y proporcionar su Domain e información de contacto.
  • Sende ein Tweet zu @Cromodev mit #QuicTransport und Details darüber, wo und wie Sie es verwenden.

Allgemeine Diskussion

Du kannst den ... benutzen Web-Transport-Entwickler Google Group für allgemeine Fragen oder Probleme, die in keine der anderen Kategorien passen.

Vielen Dank

Osten Post incorpora información del WebTransport-Erklärer, Entwurf einer Spezifikationy zugehörige Konstruktionsunterlagen. Vielen Dank an die jeweiligen Autoren für die Bereitstellung dieser Grundlage.

Das Hauptbild dieses Beitrags stammt von Robin Pierre auf Unsplash.