HTTP over UDP - lad os bruge QUIC-protokollen konstruktivt

HTTP over UDP - lad os bruge QUIC-protokollen konstruktivt

QUIC (Quick UDP Internet Connections) er en protokol over UDP, der understøtter alle funktioner fra TCP, TLS og HTTP/2 og løser de fleste af deres problemer. Den kaldes ofte for en ny eller "eksperimentel" protokol, men den har længe oversteg eksperimentfasen: udviklingen har været i gang i over 7 år. I løbet af denne tid er protokollen ikke blevet en standard, men har alligevel opnået bred udbredelse. For eksempel bruger giganter som Google og Facebook QUIC til at accelerere trafik og reducere forsinkelser i mobilnetværk, mens IETF har erklæret sin fork af protokollen som grundlaget for standarden HTTP/3 (hvorimod HTTP/2 kun bruger kun 44,8% af webstederne).

Koncept

QUIC blev udviklet som en erstatning for den forældede TCP, som oprindeligt var designet til kablede netværk med lavt tab. TCP leverer pakker i rækkefølge, så når en pakke går tabt, stopper hele køen (head-of-line blocking), hvilket har en negativ indvirkning på kvaliteten og stabiliteten af forbindelsen. For at undgå massetab bruger mobilnetværk store buffere, hvilket igen fører til overflødighed og falske negative reaktioner i protokollen (bufferbloat). Desuden bruger TCP meget tid på at etablere forbindelsen: SYN/ACK og TLS-anmodninger sendes separat, hvilket kræver tre roundtrips i stedet for én, som QUIC gør.

HTTP over UDP - lad os bruge QUIC-protokollen konstruktivt

Da QUIC kombinerer en erstatning for TCP og implementeringen af TLS 1.3, er alle forbindelser altid krypterede; det er ikke lettere at dekryptere denne trafik end hvis den blev sendt over HTTPS. Desuden er QUIC implementeret på applikationsniveau, da en fuldstændig erstatning af TCP-stakken ville tage evigheder..

På trods af understøttelsen af multiplexing i HTTP/2, forbliver problemet med head-of-line blocking der, på grund af nødvendigheden af at levere pakker i rækkefølge. QUIC er implementeret over UDP, så der er i princippet ingen blokeringer, og for at undgå, at pakker går tabt permanent, nummereres de og kan indeholde dele af "naboer" for at sikre overflødighed. Derudover opdeler QUIC den monolitiske kø i flere strømme til forskellige typer forespørgsler inden for en enkelt forbindelse. Således kan problemer kun opstå i én kø (for eksempel ved overførslen af en bestemt fil) ved pakke tab:

HTTP over UDP - lad os bruge QUIC-protokollen konstruktivt

Brugen af

Oprindeligt blev QUIC udviklet internt i Google og var i høj grad tilpasset brug i virksomheden. I 2013 blev det overdraget til IETF for standardisering (som stadig pågår), og nu kan alle deltage i udviklingen af protokollen ved at foreslå, hvad der mangler netop for dem. IETF-arbejdsgruppen organiserer årligt møder, hvor der fastsættes en ny standard, og der diskuteres nyheder. Denne QUIC-implementering betragtes som den primære, og det er på dens grundlag, at HTTP/3-standarden certificeres.

Indtil videre er der ikke tale om at inkludere HTTP/3 som den primære protokol, fordi den stadig ikke er færdig og næsten ikke understøttes:

HTTP over UDP - lad os bruge QUIC-protokollen konstruktivt

Men QUIC kan implementeres som transport mellem applikationen og serveren, hvilket Uber har gjort med succes:

Ubers kommentar om implementeringen af QUIC

For at integrere QUIC succesfuldt og forbedre applikationens ydeevne under dårlige forbindelser, erstattede vi den gamle stak (HTTP/2 over TLS/TCP) med QUIC-protokollen. Vi anvendte netværksbiblioteket Cronet af Chromium Projects, som indeholder den originale, Google-version af protokollen – gQUIC. Denne implementering forbedres konstant for at følge den nyeste IETF-specifikation.

Først integrerede vi Cronet i vores Android-applikationer for at tilføje støtte til QUIC. Integrationen blev udført på en måde, der minimerede migrationsomkostningerne. I stedet for helt at erstatte den gamle netværksstak, der brugte biblioteket OkHttp, integrerede vi Cronet UNDER OkHttp API-rammen. Ved at udføre integrationen på denne måde undgik vi ændringer i vores netværksanrop (som bruger Retrofit) på API-niveau.

Ligesom med tilgangen til Android-enhederne implementerede vi Cronet i Uber-applikationer på iOS ved at intercept HTTP-trafik fra netværks API, ved hjælp af NSURLProtocol. Denne abstraktion, som tilbydes af iOS Foundation, håndterer protokolspecifikke URL-data og sikrer, at vi kan integrere Cronet i vores iOS-applikationer uden væsentlige migrationsomkostninger.

taget fra denne oversættelse af artiklen fra Uber

På backend fanger de QUIC-forbindelser gennem Google Cloud lb, som understøtter protokollen siden midten af 2018.

Det er ikke overraskende, at Google Cloud fungerer godt med en protokol udviklet af Google, men hvilke alternativer er der?

Nginx

For ikke så længe siden forsøgte CloudFlare at kombinere nginx (som som standard ikke understøtter HTTP/3) med deres værktøj Quiche. Implementeringen er tilgængelig som en enkelt .patch-fil, som inkluderer en installationsguide:

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

Her kan du tilføje dine moduler om nødvendigt

./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 er kun tilbage at aktivere HTTP/3 understøttelse

events {
    worker_connections  1024;
}

http {
    server {
        # Aktiver QUIC og HTTP/3.
        listen 443 quic reuseport;

        # Aktiver HTTP/2 (valgfrit).
        listen 443 ssl http2;

        ssl_certificate      cert.crt;
        ssl_certificate_key  cert.key;

        # Aktiver alle TLS-versioner (TLSv1.3 kræves for QUIC).
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

        # Anmodningsbuffer ikke understøttes i øjeblikket for HTTP/3.
        proxy_request_buffering off;

        # Tilføj Alt-Svc-header for at forhandle HTTP/3.
        add_header alt-svc 'h3-27=":443"; ma=86400';
    }
}

I almindelige browsere er det endnu ikke muligt at oprette forbindelse via HTTP/3, men du kan tage Chrome Canary og køre det med flaget --enable-quic, henvende dig til din server eller for eksempel site quic.rocks og se forbindelsestypen i Developer Tools:
HTTP over UDP - lad os bruge QUIC-protokollen konstruktivt
I stedet for HTTP/3 skrives http2+quic/99, men det er i det væsentlige det samme.

Andre teknologier

Konklusion

HTTP over UDP - lad os bruge QUIC-protokollen konstruktivt

Interessen for QUIC er ustabil, men voksende, arbejdet med at standardisere det fortsætter. Nye implementeringer af protokollen dukker allerede op næsten hver måned, og med hvert år overbeviser flere udviklere sig selv om, at fremtiden tilhører QUIC. Det er endda muligt at inkludere protokollen i fremtidige versioner af TCP-stakken, hvilket betyder, at hele internettet på et tidspunkt vil overgå til mere stabile og hurtigere forbindelser.

Allerede nu kan du konfigurere QUIC-interaktion til din infrastruktur eller endda tilbyde det til browsere — de planlægger alle at tilføje protokolunderstøttelse, og den triste statistik fra caniuse vil blive mere opløftende.

HTTP over UDP - lad os bruge QUIC-protokollen konstruktivt

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster