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 oppå UDP som støtter alle funksjonene til TCP, TLS og HTTP/2 og løser de fleste av problemene deres. Den kalles ofte en ny eller "eksperimentell" protokoll, men den har for lengst overlevd den eksperimentelle fasen: utviklingen har pågått i mer enn 7 år. I løpet av denne tiden har protokollen ennå ikke blitt en standard, men har likevel blitt utbredt. For eksempel brukes QUIC til å øke hastigheten på trafikken og redusere forsinkelser i mobilnettverk av giganter som Google og Facebook, og IETF erklærte sin forgrening av protokollen som grunnlaget for HTTP/3-standarden (selv om HTTP/2 bruker bare 44.8% nettsteder).

Konseptet

QUIC ble utviklet som en erstatning for det utdaterte TCP-systemet, som opprinnelig var designet for kablede nettverk med lav tapsprosent. TCP leverer pakker i rekkefølge, så hvis én pakke går tapt, blir hele køen sittende fast (blokkering av linjehodet), noe som påvirker kvaliteten og stabiliteten til forbindelsen negativt. For å unngå massive tap tyr mobilnettverk til bruk av store buffere, noe som igjen fører til redundans og falske negative reaksjoner fra protokollen (bufferbloatI tillegg bruker TCP mye tid på å opprette en forbindelse: SYN/ACK- og TLS-forespørsler sendes separat, noe som 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 TLS 1.3-implementering, er alle tilkoblinger alltid kryptert, og det er ikke enklere å dekryptere slik trafikk enn om det var over HTTPS. I tillegg er QUIC implementert på applikasjonsnivå, ettersom en fullstendig erstatning av TCP-stakken ville ta evigheten.

Til tross for støtte for multipleksing i HTTP/2, er problemet med blokkering av linjehoder fortsatt der på grunn av behovet for å levere pakker i rekkefølge. QUIC er implementert oppå UDP, så den har ikke blokkering i prinsippet, og for å forhindre at pakker går ugjenkallelig tapt, er de nummerert og kan inneholde deler av "naboer", noe som gir redundans. I tillegg deler QUIC den monolittiske køen inn i flere strømmer for forskjellige typer forespørsler innenfor én forbindelse. Når 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

I utgangspunktet ble QUIC utviklet internt i Google og var i stor grad skreddersydd for bruk internt i selskapet. I 2013 ble den overført til IETF for standardisering (som fortsatt pågår), og nå kan hvem som helst delta i utviklingen av protokollen ved å tilby det de spesifikt mangler. IETF-arbeidsgruppen organiserer årlige møter der en ny standard godkjennes og innovasjoner diskuteres. Denne implementeringen av QUIC regnes som den viktigste, og det er på denne grunnlaget HTTP/3-standarden sertifiseres.

Det er ennå 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 med hell hos Uber:

Ubers kommentar om QUIC-implementering

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 først Cronet i vår Android-applikasjoner for å legge til QUIC-støtte. Integrasjonen ble implementert for å minimere migreringskostnader. I stedet for å erstatte den gamle nettverksstakken som brukte biblioteket fullstendig 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å.

Ligner på tilnærmingen til Android-enheter, implementerte vi Cronet i Uber iOS-apper, 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 av denne oversettelsen Uber-artikler

På backend fanget de opp QUIC-tilkoblinger gjennom Google Cloud lb, som støtter protokollen siden midten av 2018.

Det er ingen overraskelse at Google Cloud fungerer utmerket med protokollen utviklet av Google, men hva er alternativene?

Nginx

For ikke lenge siden CloudFlare Jeg prøvde å krysse nginx (som ikke støtter HTTP/3 som standard) med Quiche-verktøyet sitt. Implementeringen er tilgjengelig som en enkelt .patch-fil, som leveres 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 modulene dine 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';
    }
}

I vanlige nettlesere er det ennå ikke mulig å koble til via HTTP/3, men du kan ta Chrome Canary og kjør den med flagget --enable-quic, kontakt serveren din eller for eksempel quic.rocks-nettstedet og se på tilkoblingstypen i utviklerverktøyene:
HTTP over UDP - gjør god bruk av QUIC-protokollen
I stedet for HTTP/3 skrives det http2+quic/99, men det er i bunn og grunn det samme.

Andre teknologier

Konklusjon

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

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

Du kan allerede sette opp 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

Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Kjøp pålitelig webhotell med DDoS-beskyttelse, VPS VDS-servere | ProHoster