HTTP über UDP – Nutzen wir das QUIC-Protokoll sinnvoll

HTTP über UDP – Nutzen wir das QUIC-Protokoll sinnvoll

QUIC (Quick UDP Internet Connections) ist ein Protokoll über UDP, das alle Funktionen von TCP, TLS und HTTP/2 unterstützt und die meisten ihrer Probleme löst. Oft wird es als neues oder „experimentelles“ Protokoll bezeichnet, aber es hat die experimentelle Phase längst hinter sich: Die Entwicklung läuft seit über 7 Jahren. In dieser Zeit wurde das Protokoll zwar nicht zum Standard, hat jedoch dennoch weite Verbreitung gefunden. Zum Beispiel nutzen Giganten wie Google und Facebook QUIC, um den Datenverkehr zu beschleunigen und Verzögerungen in Mobilfunknetzen zu reduzieren, und die IETF kündigte ihren Fork des Protokolls als Grundlage für den Standard HTTP/3 an (während HTTP/2 nur 44,8% der Websites verwendet).

Konzept

QUIC wurde als Ersatz für das veraltete TCP entwickelt, das ursprünglich für Kabelnetze mit niedrigem Verlustanteil optimiert war. TCP liefert Pakete in der richtigen Reihenfolge, wodurch bei Verlust eines Pakets die gesamte Warteschlange zum Stillstand kommt (head-of-line blocking), was sich negativ auf die Qualität und Stabilität der Verbindung auswirkt. Um massiven Paketverlusten entgegenzuwirken, verwenden Mobilfunknetze große Pufferspeicher, was seinerseits zu Überflüssigkeit und einer falschen negativen Reaktion des Protokolls führt (Bufferbloat). Außerdem benötigt TCP sehr viel Zeit für den Verbindungsaufbau: SYN/ACK- und TLS-Anfragen erfolgen getrennt, was drei Roundtrips statt eines erfordert, wie es QUIC tut.

HTTP über UDP – Nutzen wir das QUIC-Protokoll sinnvoll

Da QUIC sowohl TCP ersetzt als auch TLS 1.3 implementiert, sind alle Verbindungen immer verschlüsselt, und es ist nicht einfacher, diesen Datenverkehr zu entschlüsseln, als wenn er über HTTPS ginge. Darüber hinaus ist QUIC auf Anwendungsebene implementiert, da eine vollständige Ersetzung des TCP-Stacks eine Ewigkeit.

dauern würde. Trotz der Unterstützung von Multiplexing in HTTP/2 bleibt das Problem des head-of-line blocking aufgrund der Notwendigkeit, Pakete in der richtigen Reihenfolge zu liefern, bestehen. QUIC ist über UDP implementiert, wodurch es grundsätzlich keine Blockierungen gibt, und um sicherzustellen, dass Pakete nicht unwiderruflich verloren gehen, werden sie nummeriert und können Teile von „Nachbarn“ enthalten, um Redundanz zu gewährleisten. Außerdem unterteilt QUIC die monolithische Warteschlange in mehrere Streams für unterschiedliche Anfragearten innerhalb einer Verbindung. Somit können bei einem Paketverlust Probleme nur bei einer Warteschlange auftreten (zum Beispiel beim Übertragen einer bestimmten Datei):

HTTP über UDP – Nutzen wir das QUIC-Protokoll sinnvoll

Verwendung

Ursprünglich wurde QUIC intern bei Google entwickelt und war stark auf den Einsatz innerhalb des Unternehmens ausgerichtet. Im Jahr 2013 wurde es zur Standardisierung an die IETF übergeben (die bis heute andauert), und jetzt kann jeder an der Entwicklung des Protokolls teilnehmen, indem er das vorschlägt, was ihm fehlt. Die IETF-Arbeitsgruppe organisiert jährlich Treffen, in denen neue Standards festgelegt und neue Entwicklungen diskutiert werden. Diese QUIC-Implementierung gilt als die Hauptimplementierung und darauf basiert die Zertifizierung des HTTP/3-Standards.

Bisher ist die Rede von einer Einführung von HTTP/3 als Hauptprotokoll noch nicht aktueller, da es noch nicht abgeschlossen ist und kaum unterstützt wird:

HTTP über UDP – Nutzen wir das QUIC-Protokoll sinnvoll

QUIC kann jedoch als Transport zwischen Anwendung und Server implementiert werden, was Uber erfolgreich gemacht hat:

Kommentar von Uber zur Einführung von QUIC

Um QUIC erfolgreich zu implementieren und die Leistung der Anwendung bei schlechten Verbindungen zu verbessern, haben wir den alten Stack (HTTP/2 über TLS/TCP) durch das QUIC-Protokoll ersetzt. Wir haben die Netzwerkbibliothek Cronet aus Chromium Projects, die die originale Google-Version des Protokolls – gQUIC – enthält, eingesetzt. Diese Implementierung wird auch kontinuierlich weiterentwickelt, um der neuesten IETF-Spezifikation zu folgen.

Zunächst haben wir Cronet in unsere Android-Anwendungen integriert, um Unterstützung für QUIC hinzuzufügen. Die Integration wurde so vorgenommen, dass die Migrationskosten minimiert werden. Anstatt den alten Netzwerk-Stack, der die Bibliothek OkHttp, vollständig zu ersetzen, haben wir Cronet UNTER dem OkHttp-API-Framework integriert. Durch diese Vorgehensweise haben wir Änderungen an unseren Netzwerkaufrufen (die verwenden Retrofit) auf der API-Ebene vermieden.

Ähnlich wie bei Android-Geräten haben wir Cronet in die Uber-Anwendungen auf iOS integriert, indem wir den HTTP-Verkehr über die Netzwerke API, unter Verwendung von NSURLProtocolabgefangen haben. Diese Abstraktion, die von iOS Foundation bereitgestellt wird, verarbeitet protokollspezifische URL-Daten und gewährleistet, dass wir Cronet in unsere iOS-Anwendungen ohne wesentliche Migrationskosten integrieren können.

entnommen von dieser Übersetzung des Uber-Artikels

Auf der Backend-Seite erfingen sie QUIC-Verbindungen über Google Cloud lb, die das Protokoll seit Mitte 2018 unterstützt.

Es überrascht nicht, dass Google Cloud hervorragend mit einem Protokoll funktioniert, das von Google entwickelt wurde, aber welche Alternativen gibt es?

Nginx

Vor nicht allzu langer Zeit versuchte CloudFlare nginx (das standardmäßig kein HTTP/3 unterstützt) mit ihrem Tool Quiche zu kombinieren. Die Implementierung ist als einzelnes .patch-Datei verfügbar, die mit einem Tutorial zur Installation geliefert wird: curl -O https://nginx.org/download/nginx-1.16.1.tar.gz tar xvzf nginx-1.16.1.tar.gz git clone --recursive https://github.com/cloudflare/quiche cd nginx-1.16.1 patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch

Hier können bei Bedarf eigene Module hinzugefügt werden

. /configure --prefix=$PWD --with-http_ssl_module --with-http_v2_module --with-http_v3_module --with-openssl=../quiche/deps/boringssl --with-quiche=../quiche make

Es bleibt nur noch, die Unterstützung für HTTP/3 zu aktivieren

events { worker_connections 1024; }http { server { # QUIC und HTTP/3 aktivieren. listen 443 quic reuseport;# HTTP/2 aktivieren (optional). listen 443 ssl http2;ssl_certificate cert.crt; ssl_certificate_key cert.key;# Alle TLS-Versionen aktivieren (TLSv1.3 ist für QUIC erforderlich). ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;# Anfrage-Pufferung wird derzeit für HTTP/3 nicht unterstützt. proxy_request_buffering off;# Alt-Svc-Header hinzufügen, um HTTP/3 auszuhandeln. add_header alt-svc 'h3-27=":443"; ma=86400'; } }

In herkömmlichen Browsern ist es derzeit nicht möglich, eine Verbindung über HTTP/3 herzustellen, aber man kann

nehmen und es mit dem Flag Chrome Canary --enable-quic , sich mit seinem Server oder beispielsweise der Website quic.rocks verbinden und den Verbindungstyp in den Entwicklertools ansehen:Statt HTTP/3 wird angezeigt
HTTP über UDP – Nutzen wir das QUIC-Protokoll sinnvoll
http2+quic/99 , aber das ist im Grunde dasselbe.Andere Technologien

Andere Technologien

Fazit

HTTP über UDP – Nutzen wir das QUIC-Protokoll sinnvoll

Das Interesse an QUIC ist instabil, wächst aber, und es wird an seiner Standardisierung gearbeitet. Neue Implementierungen des Protokolls erscheinen fast jeden Monat, und mit jedem Jahr überzeugen sich immer mehr Entwickler davon, dass die Zukunft QUIC gehört. Es wird sogar darüber nachgedacht, das Protokoll in zukünftige Versionen des TCP-Stacks aufzunehmen, was bedeutet, dass das gesamte Internet früher oder später auf stabilere und schnellere Verbindungen umsteigen wird.

Sie können jetzt bereits QUIC-Interaktionen für Ihre Infrastruktur einrichten oder sogar an die Browser ausliefern — sie alle planen, das Protokoll zu unterstützen, und die traurige Statistik von caniuse wird fröhlicher.

HTTP über UDP – Nutzen wir das QUIC-Protokoll sinnvoll

Quelle: habr.com

60GB SSD 8Gb DDR4