HTTP over UDP - nutz het QUIC-protocol optimaal

HTTP over UDP - nutz het QUIC-protocol optimaal

QUIC (Quick UDP Internet Connections) is een protocol bovenop UDP, dat alle mogelijkheden van TCP, TLS en HTTP/2 ondersteunt en de meeste van hun problemen oplost. Het wordt vaak een nieuw of 'experimenteel' protocol genoemd, maar is al geruime tijd geen experimentele fase meer: de ontwikkeling is al meer dan 7 jaar aan de gang. In die tijd is het protocol nog geen standaard geworden, maar heeft het wel brede verspreiding gevonden. Zo gebruiken giganten als Google en Facebook QUIC om de datastroom te versnellen en vertraging in mobiele netwerken te verminderen, en heeft de IETF zijn fork van het protocol aangekondigd als basis voor de standaard HTTP/3 (terwijl HTTP/2 slechts 44.8% van de sites gebruikt).

Concept

QUIC is ontwikkeld als vervanging voor het verouderde TCP, dat oorspronkelijk was geoptimaliseerd voor bedrade netwerken met een laag verliespercentage. TCP levert pakketten op volgorde, wat betekent dat bij het verlies van één pakket de hele wachtrij stagneert (head-of-line blocking), wat een negatieve invloed heeft op de kwaliteit en stabiliteit van de verbinding. Om massaal verlies te voorkomen, gebruiken mobiele netwerken grote buffers, wat op zijn beurt leidt tot overbodigheid en een false negative-reactie van het protocol (bufferbloat). Bovendien kost het TCP veel tijd om verbinding te maken: SYN/ACK- en TLS-verzoeken gaan apart, wat drie roundtrips vereist in plaats van één, zoals QUIC doet.

HTTP over UDP - nutz het QUIC-protocol optimaal

Aangezien QUIC zowel een vervanging van TCP als een implementatie van TLS 1.3 is, zijn alle verbindingen altijd versleuteld, en het decrypten van zo'n verkeer is niet eenvoudiger dan wanneer het via HTTPS zou verlopen. Daarnaast is QUIC op applicatieniveau geïmplementeerd, terwijl het een volledige vervanging van de TCP-stack enorm veel tijd zou kosten. Ewigigheid.

Ondanks de ondersteuning van multiplexing in HTTP/2, blijft het probleem van head-of-line blocking bestaan door de noodzaak om pakketten in volgorde te leveren. QUIC is bovenop UDP geïmplementeerd, waardoor er in principe geen blokkades zijn; om ervoor te zorgen dat pakketten niet onherroepelijk verloren gaan, worden ze genummerd en kunnen ze onderdelen van "buren" bevatten, wat zorgt voor redundantie. Bovendien verdeelt QUIC de monolithische wachtrij in verschillende stromen voor verschillende typen verzoeken binnen één verbinding. Bij het verlies van een pakket kunnen problemen dus alleen bij één wachtrij optreden (bijvoorbeeld voor de overdracht van een specifiek bestand):

HTTP over UDP - nutz het QUIC-protocol optimaal

Gebruik van

QUIC werd oorspronkelijk binnen Google ontwikkeld en was in veel opzichten gericht op gebruik binnen het bedrijf. In 2013 is het overgedragen aan de IETF voor standaardisatie (die nog steeds doorgaat), en nu kan iedereen deelnemen aan de ontwikkeling van het protocol door het aan te vullen met wat hij mist. De IETF-werkgroep organiseert jaarlijks bijeenkomsten waarin de nieuwe standaard wordt goedgekeurd en de innovaties worden besproken. Deze implementatie van QUIC wordt als de belangrijkste beschouwd en op basis daarvan wordt de standaard HTTP/3 gecertificeerd.

Momenteel is er nog geen sprake van HTTP/3 als het belangrijkste protocol, omdat het nog niet voltooid is en bijna niet wordt ondersteund:

HTTP over UDP - nutz het QUIC-protocol optimaal

Maar QUIC kan worden geïmplementeerd als transport tussen de applicatie en de server, wat met succes is gedaan bij Uber:

Uber's opmerking over de implementatie van QUIC

Om QUIC succesvol te integreren en de prestaties van de applicatie onder slechte verbindingen te verbeteren, hebben we de oude stack (HTTP/2 boven TLS/TCP) vervangen door het QUIC-protocol. We hebben de netwerklibrary Cronet uit Chromium Projects, die de originele, Google-versie van het protocol – gQUIC – bevat. Deze implementatie wordt ook voortdurend verbeterd om de laatste specificatie van de IETF te volgen.

Eerst hebben we Cronet geïntegreerd in onze Android-applicaties om ondersteuning voor QUIC toe te voegen. De integratie is zo uitgevoerd dat de migratiekosten tot een minimum worden beperkt. In plaats van de oude netwerklayer volledig te vervangen, die gebruik maakte van de library OkHttp, hebben we Cronet geïntegreerd ONDER de OkHttp API-framework. Door de integratie op deze manier uit te voeren, hebben we wijzigingen in onze netwerkoproepen (die gebruik maken van Retrofit) op API-niveau vermeden.

Net als bij de aanpak voor Android-apparaten hebben we Cronet geïmplementeerd in de Uber-apps voor iOS, waarbij we HTTP-verkeer onderscheppen vanuit de netwerken API, met gebruik van NSURLProtocol. Deze abstractie, geboden door de iOS Foundation, verwerkt protocol-specifieke URL-gegevens en zorgt ervoor dat we Cronet in onze iOS-applicaties kunnen integreren zonder aanzienlijke migratiekosten.

genomen uit deze vertaling van het Uber-artikel

Aan de achterkant vingen ze QUIC-verbindingen op via Google Cloud lb, die het protocol ondersteunt sinds midden 2018.

Het is dan ook geen verrassing dat Google Cloud uitstekend werkt met een protocol dat door Google is ontwikkeld, maar welke alternatieven zijn er?

Nginx

Niet zo lang geleden heeft CloudFlare geprobeerd te crossbreeden nginx (dat standaard geen HTTP/3 ondersteunt) met zijn Quiche-tool. De implementatie is beschikbaar als één enkele .patch-bestand, met een installatiehandleiding erbij:

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 kunnen indien nodig uw eigen modules worden toegevoegd

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

Het enige wat overblijft, is de ondersteuning voor HTTP/3 in te schakelen

events {
    worker_connections  1024;
}

http {
    server {
        # Schakel QUIC en HTTP/3 in.
        listen 443 quic reuseport;

        # HTTP/2 inschakelen (optioneel).
        listen 443 ssl http2;

        ssl_certificate      cert.crt;
        ssl_certificate_key  cert.key;

        # Schakel alle TLS-versies in (TLSv1.3 is verplicht voor QUIC).
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

        # Verzoekbuffering wordt momenteel niet ondersteund voor HTTP/3.
        proxy_request_buffering off;

        # Voeg Alt-Svc header toe om HTTP/3 te onderhandelen.
        add_header alt-svc 'h3-27=":443"; ma=86400';
    }
}

In reguliere browsers is verbinding maken via HTTP/3 nog niet mogelijk, maar u kunt Chrome Canary nemen en het starten met de vlag --enable-quic, verbinding maken met uw server of bijvoorbeeld met de website quic.rocks en het type verbinding bekijken in de Developer Tools:
HTTP over UDP - nutz het QUIC-protocol optimaal
In plaats van HTTP/3 staat er http2+quic/99, maar dat is in feite hetzelfde.

Andere technologieën

Conclusie

HTTP over UDP - nutz het QUIC-protocol optimaal

De interesse in QUIC is inconsistent, maar groeit, en er wordt gewerkt aan de standaardisatie ervan. Nieuwe implementaties van het protocol verschijnen bijna elke maand, en elk jaar overtuigen steeds meer ontwikkelaars zich ervan dat de toekomst voor QUIC is. Er wordt zelfs overwogen om het protocol op te nemen in toekomstige versies van de TCP-stack, wat betekent dat op een gegeven moment het hele internet over zal stappen op meer stabiele en snelle verbindingen.

U kunt nu al QUIC-interacties instellen voor uw infrastructuur of zelfs browsers de verbinding laten maken — zij hebben allemaal plannen om de protocollen te ondersteunen, en de treurige statistieken van caniuse zullen vrolijker worden.

HTTP over UDP - nutz het QUIC-protocol optimaal

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster