HTTP över UDP - att använda QUIC-protokollet

HTTP över UDP - att använda QUIC-protokollet

QUIC (Quick UDP Internet Connections) är ett protokoll ovanpå UDP som stöder alla funktioner i TCP, TLS och HTTP/2 och löser de flesta av deras problem. Det kallas ofta ett nytt eller "experimentellt" protokoll, men det har länge överlevt experimentstadiet: utveckling har pågått i mer än 7 år. Under denna tid lyckades protokollet inte bli en standard, men blev ändå utbrett. QUIC används till exempel av sådana jättar som Google och Facebook för att påskynda trafiken och minska förseningar i mobila nätverk, och IETF förklarade att dess del av protokollet var grunden för HTTP/3-standarden (även om HTTP/2 använder bara 44.8% webbplatser).

Koncept

QUIC utvecklades som en ersättning för det äldre TCP, som ursprungligen designades för trådbundna nätverk med låga förluster. TCP levererar paket i ordning, så om ett paket går förlorat stoppas hela kön (head-of-line blockering), vilket negativt påverkar anslutningens kvalitet och stabilitet. För att undvika stora förluster använder mobilnätverk stora buffertar, vilket i sin tur leder till redundans och falskt negativt svar av protokollet (buffertsvällning). Dessutom lägger TCP mycket tid på att upprätta en anslutning: SYN/ACK- och TLS-förfrågningar behandlas separat, vilket kräver tre tur och retur i stället för en, som QUIC gör.

HTTP över UDP - att använda QUIC-protokollet

Eftersom QUIC kombinerar en TCP-ersättning och en implementering av TLS 1.3, är alla anslutningar alltid krypterade, och att dekryptera sådan trafik är inte enklare än om den skulle gå över HTTPS. Dessutom implementeras QUIC på applikationsnivå, vilket en fullständig ersättning av TCP-stacken skulle kräva evighet.

Trots stöd för multiplexering i HTTP/2 kvarstod problemet med head-of-line blockering där på grund av behovet av att leverera paket i ordning. QUIC är implementerat ovanpå UDP, så det har ingen blockering i princip, och för att förhindra att paket går förlorade för alltid är de numrerade och kan innehålla delar av "grannar", vilket ger redundans. Dessutom delar QUIC upp den monolitiska kön i flera trådar för olika typer av förfrågningar inom en enda anslutning. Om ett paket går förlorat kan problem uppstå endast för en kö (till exempel för att överföra en specifik fil):

HTTP över UDP - att använda QUIC-protokollet

Använd

Inledningsvis utvecklades QUIC inom Google och var till stor del skräddarsydd för användning inom företaget. 2013 överfördes det till IETF för standardisering (som fortfarande pågår), och nu kan alla delta i utvecklingen av protokollet genom att föreslå vad de saknar. IETF-arbetsgruppen anordnar årliga möten under vilka en ny standard godkänns och innovationer diskuteras. Denna implementering av QUIC anses vara den viktigaste och det är på grundval av denna som HTTP/3-standarden är certifierad.

Än så länge är det inget snack om att inkludera HTTP/3 som huvudprotokoll, eftersom det inte är färdigt än och nästan inte stöds:

HTTP över UDP - att använda QUIC-protokollet

Men QUIC kan implementeras som en transport mellan applikationen och servern, vilket framgångsrikt gjordes hos Uber:

Ubers kommentar om införandet av QUIC

För att framgångsrikt bädda in QUIC och förbättra applikationsprestanda i dåliga anslutningsmiljöer ersatte vi den gamla stacken (HTTP/2 över TLS/TCP) med QUIC-protokollet. Vi använde nätverksbiblioteket Cronet av Chromium-projekt, som innehåller den ursprungliga Google-versionen av protokollet - gQUIC. Denna implementering förbättras också ständigt för att följa den senaste IETF-specifikationen.

Vi integrerade först Cronet i våra Android-appar för att lägga till stöd för QUIC. Integrationen genomfördes på ett sådant sätt att migrationskostnaderna minskade så mycket som möjligt. Istället för att helt ersätta den gamla nätverksstacken som använde biblioteket OkHttp, vi har integrerat Cronet UNDER OkHttp API-ramverket. Genom att göra integrationen på detta sätt undvek vi ändringar i våra nätverkssamtal (som används av Retrofit) på API-nivå.

I likhet med tillvägagångssättet för Android-enheter, implementerade vi Cronet i Uber-appar på iOS, avlyssnade HTTP-trafik från nätverket APIanvänder sig av NSURL-protokoll. Denna abstraktion, som tillhandahålls av iOS Foundation, hanterar protokollspecifika URL-data och säkerställer att vi kan integrera Cronet i våra iOS-applikationer utan betydande migreringskostnader.

tagen från denna översättning Uber-artiklar

På backend fångade de QUIC-anslutningar via Google Cloud lb, vilket stöder protokoll sedan mitten av 2018.

Det är ingen överraskning att Google Cloud fungerar utmärkt med det Google-utvecklade protokollet, men vilka är alternativen?

nginx

Inte så länge sedan CloudFlare Jag försökte gå över nginx (som inte stöder HTTP/3 som standard) med sitt Quiche-verktyg. Implementeringen är tillgänglig som en enda .patch-fil, som kommer med en installationshandledning:

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

Här kan du koppla ihop dina moduler vid behov

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

Allt som återstår är att aktivera HTTP/3-stöd

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';
    }
}

Det är ännu inte möjligt att ansluta via HTTP/3 i vanliga webbläsare, men du kan använda Krom kanariefågel och kör den med flaggan --enable-quic, gå till din server eller till exempel webbplatsen quic.rocks och titta på anslutningstypen i utvecklarverktyg:
HTTP över UDP - att använda QUIC-protokollet
Istället för HTTP/3 skrivs det http2+quic/99, men det är i princip samma sak.

Andra tekniker

Slutsats

HTTP över UDP - att använda QUIC-protokollet

Intresset för QUIC är instabilt, men växer, och arbetet pågår för att standardisera det. Nya implementeringar av protokollet dyker upp nästan varje månad, och varje år är fler och fler utvecklare övertygade om att QUIC är framtiden. Det är till och med möjligt att inkludera protokollet i framtida versioner av TCP-stacken, vilket innebär att hela Internet förr eller senare kommer att gå över till stabilare och snabbare anslutningar.

Redan nu kan du konfigurera QUIC-interaktion för din infrastruktur eller till och med ge den till webbläsare - de planerar alla att lägga till stöd för protokollet, och den sorgliga statistiken med caniuse kommer att bli gladare.

HTTP över UDP - att använda QUIC-protokollet

Källa: will.com

Lägg en kommentar