HTTP över UDP — vi anvĂ€nder QUIC-protokollet effektivt

HTTP över UDP — vi anvĂ€nder QUIC-protokollet effektivt

QUIC (Quick UDP Internet Connections) Àr ett protokoll ovanpÄ UDP som stödjer alla funktioner hos TCP, TLS och HTTP/2 och löser de flesta av deras problem. Det kallas ofta det nya eller "experimentella" protokollet, men det har lÀnge överlevt experimentfasen: utvecklingen har pÄgÄtt i över 7 Är. Under denna tid har protokollet inte blivit en standard, men har ÀndÄ fÄtt bred spridning. Till exempel anvÀnder företag som Google och Facebook QUIC för att öka hastigheten pÄ trafik och minska fördröjningar i mobila nÀtverk, och IETF har deklarerat sin fork-version av protokollet som grunden för standarden HTTP/3 (Àven om HTTP/2 bara anvÀnds av 44,8% av webbplatser).

Konceptet

QUIC utvecklades som en ersÀttning för det förÄldrade TCP, som ursprungligen var anpassat för trÄdbundna nÀt med lÄg förlust. TCP levererar paket i ordning, sÄ nÀr ett paket gÄr förlorat stannar hela kön (head-of-line blocking), vilket negativt pÄverkar kvaliteten och stabiliteten i anslutningen. För att undvika massförluster anvÀnder mobila nÀt stora buffertar, vilket i sin tur leder till överflödighet och falska negativa reaktioner frÄn protokollet (bufferbloat). Dessutom tar TCP vÀldigt lÄng tid pÄ sig att etablera en anslutning: SYN/ACK och TLS-förfrÄgningar skickas separat, vilket krÀver tre roundtrip istÀllet för en, som QUIC gör.

HTTP över UDP — vi anvĂ€nder QUIC-protokollet effektivt

Eftersom QUIC kombinerar ersÀttningen för TCP och implementeringen 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 har QUIC implementerats pÄ applikationsnivÄ, eftersom en fullstÀndig ersÀttning av TCP-stacken skulle ta evigheter.

Trots att HTTP/2 stödjer multiplexering kvarstÄr problemet med head-of-line blocking dÀr pÄ grund av behovet av att leverera paket i ordning. QUIC implementeras ovanpÄ UDP, vilket i princip eliminerar blockeringsproblemet, och för att sÀkerstÀlla att paket inte gÄr förlorade för alltid numreras de och kan innehÄlla delar av "grannar" för att sÀkerstÀlla överflödighet. Dessutom delar QUIC upp den monolitiska kön i flera strömmar för olika typer av förfrÄgningar inom en anslutning. SÄledes kan problem vid paketförlust endast uppstÄ i en kö (till exempel vid överföring av en specifik fil):

HTTP över UDP — vi anvĂ€nder QUIC-protokollet effektivt

AnvÀndning

QUIC utvecklades ursprungligen inom Google och var till stor del anpassad för interna behov. År 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Ă„ det som saknas för dem. IETF:s arbetsgrupp anordnar Ă„rliga möten dĂ€r nya standarder godkĂ€nns och nya idĂ©er diskuteras. Denna implementation av QUIC anses vara den grundlĂ€ggande och det Ă€r pĂ„ denna som standarden HTTP/3 certifieras.

För tillfÀllet talas det inte om att inkludera HTTP/3 som huvudprotokoll, eftersom det fortfarande Àr ofullstÀndigt och nÀstan inte stöds:

HTTP över UDP — vi anvĂ€nder QUIC-protokollet effektivt

Men QUIC kan implementeras som transport mellan applikationen och servern, vilket har gjorts framgÄngsrikt av Uber:

Ubers kommentar om implementeringen av QUIC

För att framgĂ„ngsrikt integrera QUIC och förbĂ€ttra applikationens prestanda under dĂ„liga anslutningar, bytte vi ut den gamla stacken (HTTP/2 över TLS/TCP) mot protokollet QUIC. Vi anvĂ€nde det nĂ€tverksbiblioteket Cronet frĂ„n Chromium Projects, som innehĂ„ller den ursprungliga Google-versionen av protokollet – gQUIC. Denna implementation förbĂ€ttras ocksĂ„ stĂ€ndigt för att följa den senaste IETF-specifikationen.

Först integrerade vi Cronet i vÄra Android-appar för att lÀgga till stöd för QUIC. Integrationen genomfördes pÄ ett sÀtt som minimerade migrationskostnaderna. IstÀllet för att helt ersÀtta den gamla nÀtverksstacken, som anvÀnde biblioteket OkHttp, integrerade vi Cronet UNDER OkHttp API-ramverket. Genom att utföra integrationen pÄ detta sÀtt undvek vi förÀndringar i vÄra nÀtverksanrop (som anvÀnder Retrofit) pÄ API-nivÄ.

PÄ liknande sÀtt som för Android-enheter implementerade vi Cronet i Uber-apparna pÄ iOS, genom att avlyssna HTTP-trafiken frÄn nÀtverks API, med hjÀlp av NSURLProtocol. 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-appar utan betydande migrationskostnader.

tagit frÄn denna översÀttning artikel frÄn Uber

PÄ backend fÄngade de QUIC-anslutningar via Google Cloud lb, som stöder protokollet sedan mitten av 2018.

Det Àr inte förvÄnande att Google Cloud fungerar utmÀrkt med protokollet som Google utvecklade, men vilka alternativ finns?

Nginx

Nyligen försökte CloudFlare komma i kontakt med nginx (som som standard inte stödjer HTTP/3) med sitt verktyg Quiche. Implementeringen finns tillgÀnglig som en enda .patch-fil, som har en installationshandledning bifogad:

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 man ansluta sina egna 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

Det ÄterstÄr bara att aktivera stöd för HTTP/3

events {
    worker_connections  1024;
}

http {
    server {
        # Aktivera QUIC och HTTP/3.
        listen 443 quic reuseport;

        # Aktivera HTTP/2 (valfritt).
        listen 443 ssl http2;

        ssl_certificate      cert.crt;
        ssl_certificate_key  cert.key;

        # Aktivera alla TLS-versioner (TLSv1.3 krÀvs för QUIC).
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

        # BegÀrningsbuffring stöds för nÀrvarande inte för HTTP/3.
        proxy_request_buffering off;

        # LÀgg till Alt-Svc-header för att förhandla HTTP/3.
        add_header alt-svc 'h3-27=":443"; ma=86400';
    }
}

I vanliga webblÀsare gÄr det fortfarande inte att ansluta via HTTP/3, men man kan ta Chrome Canary och köra det med flaggan --enable-quic, besöka sin server eller till exempel sidan quic.rocks och se vilken typ av anslutning som anvÀnds i Developer Tools:
HTTP över UDP — vi anvĂ€nder QUIC-protokollet effektivt
IstÀllet för HTTP/3 stÄr det http2+quic/99, men det Àr i stort sett samma sak.

Andra teknologier

Slutsats

HTTP över UDP — vi anvĂ€nder QUIC-protokollet effektivt

Intresset för QUIC Àr ostadigt men vÀxer, arbetet med dess standardisering pÄgÄr. Nya implementationer av protokollet dyker upp nÀstan varje mÄnad, och allt fler utvecklare övertygar sig om att framtiden ligger i QUIC. 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 övergÄ till mer stabila och snabba anslutningar.

Redan nu kan du konfigurera QUIC-interaktioner för din infrastruktur eller till och med erbjuda dem till webblÀsare - de planerar alla att lÀgga till stöd för protokollet, och den sorgliga statistiken frÄn caniuse kommer att bli roligare.

HTTP över UDP — vi anvĂ€nder QUIC-protokollet effektivt

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster