HTTP over UDP - gjør god bruk av QUIC-protokollen

HTTP over UDP - gjør god bruk av QUIC-protokollen

QUIC (Quick UDP Internet Connections) er en protokoll på toppen av UDP som støtter alle funksjonene til TCP, TLS og HTTP/2 og løser de fleste problemene deres. Det kalles ofte en ny eller "eksperimentell" protokoll, men den har lenge overlevd det eksperimentelle stadiet: utviklingen har pågått i mer enn 7 år. I løpet av denne tiden rakk ikke protokollen å bli en standard, men ble likevel utbredt. For eksempel brukes QUIC av slike giganter som Google og Facebook for å øke hastigheten på trafikken og redusere forsinkelser i mobilnettverk, og IETF erklærte at protokollen er grunnlaget for HTTP/3-standarden (selv om HTTP/2 bruker bare 44.8% nettsteder).

Konseptet

QUIC ble utviklet som en erstatning for den eldre TCP, som opprinnelig ble designet for kablede nettverk med lite tap. TCP leverer pakker i rekkefølge, så hvis en pakke går tapt, stoppes hele køen (head-of-line blokkering), som negativt påvirker kvaliteten og stabiliteten til forbindelsen. For å unngå store tap, tyr mobilnettverk til å bruke store buffere, som igjen fører til redundans og falsk negativ respons av protokollen (bufferbloat). I tillegg bruker TCP mye tid på å etablere en forbindelse: SYN/ACK- og TLS-forespørsler behandles separat, og krever tre rundturer i stedet for én, slik QUIC gjør.

HTTP over UDP - gjør god bruk av QUIC-protokollen

Siden QUIC kombinerer en TCP-erstatning og en implementering av TLS 1.3, er alle tilkoblinger alltid kryptert, og å dekryptere slik trafikk er ikke enklere enn om den gikk over HTTPS. I tillegg er QUIC implementert på applikasjonsnivå, som en fullstendig utskifting av TCP-stakken ville kreve evigheten.

Til tross for støtte for multipleksing i HTTP/2, forble problemet med head-of-line blokkering der på grunn av behovet for å levere pakker i rekkefølge. QUIC er implementert på toppen av UDP, så det har ingen blokkering i prinsippet, og for å forhindre at pakker går tapt for alltid, er de nummererte og kan inneholde deler av "naboer", som gir redundans. I tillegg deler QUIC den monolittiske køen i flere tråder for forskjellige typer forespørsler innenfor en enkelt tilkobling. Hvis en pakke går tapt, kan det derfor bare oppstå problemer for én kø (for eksempel for overføring av en bestemt fil):

HTTP over UDP - gjør god bruk av QUIC-protokollen

Bruk

Opprinnelig ble QUIC utviklet innen Google og var i stor grad skreddersydd for bruk i selskapet. I 2013 ble den overført til IETF for standardisering (som fortsatt pågår), og nå kan alle delta i utviklingen av protokollen ved å foreslå det de mangler. IETF-arbeidsgruppen arrangerer årlige møter hvor en ny standard godkjennes og innovasjoner diskuteres. Denne implementeringen av QUIC regnes som den viktigste, og det er på grunnlag av den at HTTP/3-standarden er sertifisert.

Så langt er det ikke snakk om å inkludere HTTP/3 som hovedprotokoll, fordi den ikke er ferdig ennå og nesten ikke støttes:

HTTP over UDP - gjør god bruk av QUIC-protokollen

Men QUIC kan implementeres som en transport mellom applikasjonen og serveren, noe som ble gjort vellykket hos Uber:

Ubers kommentar til introduksjonen av QUIC

For å lykkes med å bygge inn QUIC og forbedre applikasjonsytelsen i dårlige tilkoblingsmiljøer, erstattet vi den gamle stabelen (HTTP/2 over TLS/TCP) med QUIC-protokollen. Vi brukte nettverksbiblioteket Cronet av Chromium-prosjekter, som inneholder den originale Google-versjonen av protokollen - gQUIC. Denne implementeringen blir også stadig forbedret for å følge den nyeste IETF-spesifikasjonen.

Vi integrerte Cronet først i Android-appene våre for å legge til støtte for QUIC. Integrasjonen ble utført på en slik måte at migrasjonskostnadene ble redusert så mye som mulig. I stedet for å fullstendig erstatte den gamle nettverksstabelen som brukte biblioteket OkHttp, har vi integrert Cronet UNDER OkHttp API-rammeverket. Ved å gjøre integrasjonen på denne måten unngikk vi endringer i nettverksanropene våre (som brukes av retrofit) på API-nivå.

I likhet med tilnærmingen for Android-enheter, implementerte vi Cronet i Uber-apper på iOS, og fanget opp HTTP-trafikk fra nettverket APIved hjelp av NSURL-protokoll. Denne abstraksjonen, levert av iOS Foundation, håndterer protokollspesifikke URL-data og sikrer at vi kan integrere Cronet i iOS-applikasjonene våre uten betydelige migreringskostnader.

tatt fra denne oversettelsen Uber-artikler

På backend fanget de QUIC-forbindelser via Google Cloud lb, som støtter protokoll siden midten av 2018.

Det er ingen overraskelse at Google Cloud fungerer bra med den Google-utviklede protokollen, men hva er alternativene?

Nginx

Ikke lenge siden CloudFlare Jeg prøvde å krysse nginx (som ikke støtter HTTP/3 som standard) med Quiche-verktøyet. Implementeringen er tilgjengelig som en enkelt .patch-fil, som kommer med en installasjonsveiledning:

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 koble til dine moduler om nødvendig

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

Alt som gjenstår er å aktivere HTTP/3-støtte

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 er ennå ikke mulig å koble til via HTTP/3 i vanlige nettlesere, men du kan bruke Chrome Canary og kjøre den med flagget --enable-quic, gå til serveren din eller for eksempel nettstedet quic.rocks og se på tilkoblingstypen i utviklerverktøy:
HTTP over UDP - gjør god bruk av QUIC-protokollen
I stedet for HTTP/3 skrives det http2+quic/99, men det er i hovedsak det samme.

Andre teknologier

Konklusjon

HTTP over UDP - gjør god bruk av QUIC-protokollen

Interessen for QUIC er ustabil, men økende, og det arbeides med å standardisere den. Nye implementeringer av protokollen dukker opp nesten hver måned, og hvert år er flere og flere utviklere overbevist om at QUIC er fremtiden. Det er til og med mulig å inkludere protokollen i fremtidige versjoner av TCP-stakken, noe som betyr at før eller siden vil hele Internett gå over til mer stabile og raskere tilkoblinger.

Allerede nå kan du konfigurere QUIC-interaksjon for infrastrukturen din eller til og med gi den til nettlesere - de planlegger alle å legge til støtte for protokollen, og den triste statistikken med caniuse vil bli mer munter.

HTTP over UDP - gjør god bruk av QUIC-protokollen

Kilde: www.habr.com

Legg til en kommentar