HTTP über UDP – gute Nutzung des QUIC-Protokolls

HTTP über UDP – gute Nutzung des QUIC-Protokolls

QUIC (Quick UDP Internet Connections) ist ein auf UDP aufbauendes Protokoll, das alle Funktionen von TCP, TLS und HTTP/2 unterstützt und die meisten ihrer Probleme löst. Es wird oft als neues oder „experimentelles“ Protokoll bezeichnet, aber es hat das experimentelle Stadium längst überlebt: Die Entwicklung läuft seit mehr als sieben Jahren. In dieser Zeit gelang es dem Protokoll zwar nicht, sich zum Standard zu entwickeln, doch es verbreitete sich dennoch. Beispielsweise wird QUIC von Giganten wie Google und Facebook verwendet, um den Datenverkehr zu beschleunigen und Verzögerungen in Mobilfunknetzen zu reduzieren, und die IETF erklärte ihre Abzweigung des Protokolls zur Grundlage für den HTTP/7-Standard (obwohl HTTP/3 verwendet). nur 44.8 % Websites).

Konzept

QUIC wurde als Ersatz für das alte TCP entwickelt, das ursprünglich für verlustarme kabelgebundene Netzwerke konzipiert war. TCP liefert Pakete der Reihe nach. Wenn also ein Paket verloren geht, wird die gesamte Warteschlange angehalten (Head-of-Line-Blockierung), was sich negativ auf die Qualität und Stabilität der Verbindung auswirkt. Um massive Verluste zu vermeiden, greifen Mobilfunknetze auf die Verwendung großer Puffer zurück, was wiederum zu Redundanz und falsch negativen Reaktionen des Protokolls führt (Bufferbloat). Darüber hinaus benötigt TCP viel Zeit für den Verbindungsaufbau: SYN/ACK- und TLS-Anfragen werden separat verarbeitet, sodass drei Roundtrips statt einem erforderlich sind, wie dies bei QUIC der Fall ist.

HTTP über UDP – gute Nutzung des QUIC-Protokolls

Da QUIC einen TCP-Ersatz und eine Implementierung von TLS 1.3 kombiniert, sind alle Verbindungen immer verschlüsselt, und die Entschlüsselung dieses Datenverkehrs ist nicht einfacher, als wenn er über HTTPS erfolgen würde. Darüber hinaus wird QUIC auf Anwendungsebene implementiert, da eine vollständige Ablösung des TCP-Stacks erforderlich wäre für immer.

Trotz der Unterstützung von Multiplexing in HTTP/2 blieb das Problem der Head-of-Line-Blockierung aufgrund der Notwendigkeit, Pakete in der richtigen Reihenfolge zuzustellen, bestehen. QUIC wird zusätzlich zu UDP implementiert, sodass es im Prinzip keine Blockierung gibt. Um zu verhindern, dass Pakete für immer verloren gehen, sind sie nummeriert und können Teile von „Nachbarn“ enthalten, was für Redundanz sorgt. Darüber hinaus teilt QUIC die monolithische Warteschlange in mehrere Threads für verschiedene Arten von Anforderungen innerhalb einer einzigen Verbindung auf. Wenn also ein Paket verloren geht, können Probleme nur für eine Warteschlange auftreten (z. B. bei der Übertragung einer bestimmten Datei):

HTTP über UDP – gute Nutzung des QUIC-Protokolls

Verwenden

Ursprünglich wurde QUIC innerhalb von Google entwickelt und war weitgehend auf den Einsatz innerhalb des Unternehmens zugeschnitten. Im Jahr 2013 wurde es zur Standardisierung an die IETF übergeben (die noch läuft), und jetzt kann sich jeder an der Entwicklung des Protokolls beteiligen, indem er vorschlägt, was ihm fehlt. Die IETF-Arbeitsgruppe organisiert jährliche Treffen, bei denen ein neuer Standard verabschiedet und Innovationen besprochen werden. Diese Implementierung von QUIC gilt als die wichtigste und auf ihrer Grundlage wird der HTTP/3-Standard zertifiziert.

Bisher gibt es keine Diskussion darüber, HTTP/3 als Hauptprotokoll aufzunehmen, da es noch nicht fertig ist und fast nicht unterstützt wird:

HTTP über UDP – gute Nutzung des QUIC-Protokolls

Aber QUIC kann als Transport zwischen der Anwendung und dem Server implementiert werden, was bei Uber erfolgreich durchgeführt wurde:

Ubers Kommentar zur Einführung von QUIC

Um QUIC erfolgreich einzubetten und die Anwendungsleistung in Umgebungen mit schlechter Konnektivität zu verbessern, haben wir den alten Stack (HTTP/2 über TLS/TCP) durch das QUIC-Protokoll ersetzt. Wir haben die Netzwerkbibliothek verwendet Krone von Chrom-Projekte, das die ursprüngliche Google-Version des Protokolls enthält – gQUIC. Auch diese Implementierung wird ständig verbessert, um der neuesten IETF-Spezifikation zu entsprechen.

Wir haben Cronet zunächst in unsere Android-Apps integriert, um Unterstützung für QUIC hinzuzufügen. Die Integration wurde so durchgeführt, dass die Migrationskosten so gering wie möglich gehalten werden. Anstatt den alten Netzwerk-Stack, der die Bibliothek verwendet, vollständig zu ersetzen OkHttp, wir haben Cronet UNTER dem OkHttp API-Framework integriert. Durch die Integration auf diese Weise haben wir Änderungen an unseren Netzwerkaufrufen (die von verwendet werden) vermieden Nachrüstung) auf der API-Ebene.

Ähnlich wie bei Android-Geräten haben wir Cronet in Uber-Apps auf iOS implementiert und so den HTTP-Verkehr vom Netzwerk abgefangen APIVerwendung NSURL-Protokoll. Diese von der iOS Foundation bereitgestellte Abstraktion verarbeitet protokollspezifische URL-Daten und stellt sicher, dass wir Cronet ohne nennenswerte Migrationskosten in unsere iOS-Anwendungen integrieren können.

entnommen aus diese Übersetzung Uber-Artikel

Im Backend haben sie QUIC-Verbindungen über Google Cloud lb abgefangen, was unterstützt Protokoll seit Mitte 2018.

Es ist keine Überraschung, dass Google Cloud hervorragend mit dem von Google entwickelten Protokoll funktioniert, aber welche Alternativen gibt es?

Nginx

Vor nicht allzu langer Zeit CloudFlare Ich habe versucht zu überqueren nginx (das HTTP/3 standardmäßig nicht unterstützt) mit seinem Quiche-Tool. Die Implementierung ist als einzelne .patch-Datei verfügbar, die ein Installations-Tutorial enthält:

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 Sie bei Bedarf Ihre Module anschließen

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

Jetzt muss nur noch die HTTP/3-Unterstützung aktiviert werden

events {
    worker_connections  1024;
}

http {
    server {
        # Enable QUIC and HTTP/3.
        listen 443 quic reuseport;

        # Enable HTTP/2 (optional).
        listen 443 ssl http2;

        ssl_certificate      cert.crt;
        ssl_certificate_key  cert.key;

        # Enable all TLS versions (TLSv1.3 is required for QUIC).
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

        # Request buffering in not currently supported for HTTP/3.
        proxy_request_buffering off;

        # Add Alt-Svc header to negotiate HTTP/3.
        add_header alt-svc 'h3-27=":443"; ma=86400';
    }
}

In normalen Browsern ist es noch nicht möglich, eine Verbindung über HTTP/3 herzustellen, aber Sie können es verwenden Chrome Canary und führen Sie es mit der Flagge aus --enable-quic, gehen Sie zu Ihrem Server oder beispielsweise zur Website quic.rocks und sehen Sie sich den Verbindungstyp in den Entwicklertools an:
HTTP über UDP – gute Nutzung des QUIC-Protokolls
Anstelle von HTTP/3 wird geschrieben http2+quic/99, aber im Wesentlichen ist es dasselbe.

Andere Technologien

  • QUIC unterstützt auch LiteSpeed (die mit großem Getöse über HTTP/3 eine Verbindung zu Facebook herstellte) und progressiv Caddie. Apache kann das noch nicht, aber die Arbeit ist im Gange Voller Schwung.
  • 21. Januar aktualisiert Standardentwurf für WebRTC
  • Erst neulich hat Microsoft eröffnet msquic-Implementierungscode, bei dem noch nicht alle Funktionen aus dem IETF-Standard verfügbar sind, aber das ist schon ein großer Durchbruch.

Abschluss

HTTP über UDP – gute Nutzung des QUIC-Protokolls

Das Interesse an QUIC ist instabil, wächst jedoch und es wird an einer Standardisierung gearbeitet. Fast jeden Monat erscheinen neue Implementierungen des Protokolls und jedes Jahr sind immer mehr Entwickler davon überzeugt, dass QUIC die Zukunft ist. Es ist sogar möglich, das Protokoll in zukünftige Versionen des TCP-Stacks einzubinden, was bedeutet, dass früher oder später das gesamte Internet auf stabilere und schnellere Verbindungen umsteigen wird.

Sie können die QUIC-Interaktion bereits jetzt für Ihre Infrastruktur konfigurieren oder sie sogar an Browser weitergeben. Alle planen, Unterstützung für das Protokoll hinzuzufügen, und die traurigen Statistiken mit Caniuse werden fröhlicher.

HTTP über UDP – gute Nutzung des QUIC-Protokolls

Source: habr.com

Kommentar hinzufügen