HTTP peste UDP - folosind bine protocolul QUIC

HTTP peste UDP - folosind bine protocolul QUIC

QUIC (Quick UDP Internet Connections) este un protocol peste UDP care acceptă toate caracteristicile TCP, TLS și HTTP/2 și rezolvă majoritatea problemelor acestora. Este adesea numit un protocol nou sau „experimental”, dar a depășit de mult stadiul experimental: dezvoltarea este în curs de mai bine de 7 ani. În acest timp, protocolul nu a reușit să devină un standard, dar a devenit totuși răspândit. De exemplu, QUIC este folosit de asemenea giganți precum Google și Facebook pentru a accelera traficul și a reduce întârzierile în rețelele mobile, iar IETF a declarat că furnizarea protocolului său este baza standardului HTTP/3 (chiar dacă HTTP/2 utilizează doar 44.8% site-uri).

Concept

QUIC a fost dezvoltat ca un înlocuitor pentru vechiul TCP, care a fost proiectat inițial pentru rețele cu fir cu pierderi reduse. TCP livrează pachetele în ordine, așa că dacă un pachet este pierdut, întreaga coadă este oprită (blocarea capului de linie), care afectează negativ calitatea și stabilitatea conexiunii. Pentru a evita pierderile masive, rețelele celulare recurg la utilizarea de buffer-uri mari, ceea ce, la rândul său, duce la redundanță și răspuns fals negativ al protocolului (bufferbloat). În plus, TCP petrece mult timp stabilind o conexiune: cererile SYN/ACK și TLS sunt procesate separat, necesitând trei călătorii dus-întors în loc de una, așa cum face QUIC.

HTTP peste UDP - folosind bine protocolul QUIC

Deoarece QUIC combină o înlocuire TCP și o implementare a TLS 1.3, toate conexiunile sunt întotdeauna criptate, iar decriptarea unui astfel de trafic nu este mai ușoară decât dacă ar trece prin HTTPS. În plus, QUIC este implementat la nivel de aplicație, așa cum ar fi nevoie de o înlocuire completă a stivei TCP eternitate.

În ciuda suportului pentru multiplexarea în HTTP/2, problema blocării head-of-line a rămas acolo din cauza necesității de a livra pachetele în ordine. QUIC este implementat peste UDP, deci nu are blocare în principiu și pentru a preveni pierderea definitivă a pachetelor, acestea sunt numerotate și pot conține părți din „vecini”, oferind redundanță. În plus, QUIC împarte coada monolitică în mai multe fire pentru diferite tipuri de solicitări într-o singură conexiune. Astfel, dacă se pierde un pachet, pot apărea probleme doar pentru o singură coadă (de exemplu, pentru transferul unui anumit fișier):

HTTP peste UDP - folosind bine protocolul QUIC

Folosi

Inițial, QUIC a fost dezvoltat în cadrul Google și a fost în mare parte adaptat pentru utilizare în cadrul companiei. În 2013, a fost transferat la IETF pentru standardizare (care este încă în desfășurare), iar acum toată lumea poate participa la dezvoltarea protocolului propunând ceea ce le lipsește. Grupul de lucru IETF organizează întâlniri anuale în cadrul cărora se aprobă un nou standard și se discută inovațiile. Această implementare a QUIC este considerată cea principală și tocmai pe baza ei este certificat standardul HTTP/3.

Până acum, nu se vorbește despre includerea HTTP/3 ca protocol principal, deoarece nu este încă terminat și aproape că nu este acceptat:

HTTP peste UDP - folosind bine protocolul QUIC

Dar QUIC poate fi implementat ca un transport între aplicație și server, ceea ce a fost realizat cu succes la Uber:

Comentariul Uber cu privire la introducerea QUIC

Pentru a încorpora cu succes QUIC și a îmbunătăți performanța aplicațiilor în medii de conectivitate slabă, am înlocuit vechea stivă (HTTP/2 peste TLS/TCP) cu protocolul QUIC. Am folosit biblioteca de rețea Cronet de Proiecte Chromium, care conține versiunea originală Google a protocolului - gQUIC. Această implementare este, de asemenea, îmbunătățită în mod constant pentru a respecta cele mai recente specificații IETF.

Am integrat mai întâi Cronet în aplicațiile noastre Android pentru a adăuga suport pentru QUIC. Integrarea a fost realizată în așa fel încât să reducă cât mai mult posibil costurile de migrare. În loc să înlocuiți complet vechea stivă de rețea care folosea biblioteca OkHttp, am integrat Cronet ÎN cadrul API-ului OkHttp. Făcând integrarea în acest fel, am evitat modificările la apelurile noastre de rețea (care sunt folosite de Retrofit) la nivel de API.

Similar cu abordarea pentru dispozitivele Android, am implementat Cronet în aplicațiile Uber de pe iOS, interceptând traficul HTTP din rețea APIfolosind NSURLProtocol. Această abstractizare, furnizată de Fundația iOS, gestionează datele URL specifice protocolului și ne asigură că putem integra Cronet în aplicațiile noastre iOS fără costuri semnificative de migrare.

luat din această traducere articole Uber

Pe backend au prins conexiuni QUIC prin Google Cloud lb, care acceptă protocolul de la mijlocul anului 2018.

Nu este surprinzător faptul că Google Cloud funcționează excelent cu protocolul dezvoltat de Google, dar care sunt alternativele?

nginx

Nu cu mult timp în urmă CloudFlare Am încercat să traversez nginx (care nu acceptă HTTP/3 în mod implicit) cu instrumentul său Quiche. Implementarea este disponibilă ca un singur fișier .patch, care vine cu un tutorial de instalare:

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

Aici vă puteți conecta modulele dacă este necesar

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

Tot ce rămâne este să activați suportul HTTP/3

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

Încă nu este posibil să vă conectați prin HTTP/3 în browserele obișnuite, dar puteți utiliza Chrome Canary și rulează-l cu steagul --enable-quic, accesați serverul dvs. sau, de exemplu, site-ul quic.rocks și uitați-vă la tipul de conexiune în Instrumente pentru dezvoltatori:
HTTP peste UDP - folosind bine protocolul QUIC
În loc de HTTP/3 este scris http2+quic/99, dar este în esență același lucru.

Alte tehnologii

Concluzie

HTTP peste UDP - folosind bine protocolul QUIC

Interesul pentru QUIC este instabil, dar în creștere și se lucrează pentru a-l standardiza. Noi implementări ale protocolului apar aproape în fiecare lună, iar în fiecare an tot mai mulți dezvoltatori sunt convinși că QUIC este viitorul. Este chiar posibil să se includă protocolul în versiunile viitoare ale stivei TCP, ceea ce înseamnă că, mai devreme sau mai târziu, întregul Internet se va muta la conexiuni mai stabile și mai rapide.

Deja acum puteți configura interacțiunea QUIC pentru infrastructura dvs. sau chiar o puteți oferi browserelor - toți plănuiesc să adauge suport pentru protocol, iar statisticile triste cu caniuse vor deveni mai vesele.

HTTP peste UDP - folosind bine protocolul QUIC

Sursa: www.habr.com

Adauga un comentariu