HTTP pe UDP – să folosim protocolul QUIC în mod util

HTTP pe UDP – să folosim protocolul QUIC în mod util

QUIC (Quick UDP Internet Connections) este un protocol bazat pe UDP, care susține toate funcționalitățile TCP, TLS și HTTP/2, rezolvând majoritatea problemelor acestora. Este adesea numit un protocol nou sau „experimentativ”, dar a depășit de multă vreme stadiul experimentului: dezvoltarea a avut loc timp de mai bine de 7 ani. În acest interval, protocolul nu a ajuns să devină un standard, dar a câștigat în continuare o răspândire largă. De exemplu, QUIC este utilizat pentru accelerarea traficului și reducerea latențelor în rețelele mobile de gigantii precum Google și Facebook, iar IETF a declarat fork-ul său ca bază pentru standardul HTTP/3 (având în vedere că HTTP/2 folosește doar 44.8% din site-uri).

Conceptul

QUIC a fost dezvoltat ca o alternativă la TCP-ul învechit, care a fost inițial conceput pentru rețele cablate cu un procent scăzut de pierderi. TCP livrează pachetele în ordinea în care sunt primite, astfel că, în caz de pierdere a unui pachet, întreaga coadă se blochează (head-of-line blocking), ceea ce afectează negativ calitatea și stabilitatea conexiunii. Pentru a evita pierderile masive, rețelele mobile recurg la utilizarea bufferelor mari, ceea ce, la rândul său, duce la redundanță și reacția fals negativă a protocolului (bufferbloat,). În plus, TCP consumă foarte mult timp pentru a stabili o conexiune: cererile SYN/ACK și TLS sunt trimise separat, necesitând trei runde de returnare în loc de una, așa cum face QUIC.

HTTP pe UDP – să folosim protocolul QUIC în mod util

Deoarece QUIC combină înlocuirea TCP cu implementarea TLS 1.3, toate conexiunile sunt întotdeauna criptate, iar decriptarea unui astfel de trafic nu este mai ușoară decât dacă ar circula prin HTTPS. În plus, QUIC este implementat la nivel de aplicație, deoarece o înlocuire completă a stivului TCP ar dura eternitate.

În ciuda suportului pentru multiplexare în HTTP/2, problema head-of-line blocking a rămas din cauza necesității de a livra pachetele în ordine. QUIC este implementat deasupra UDP, astfel încât blocajele nu există în principiu, iar pentru a evita pierderile irecuperabile ale pachetelor, acestea sunt numerotate și pot conține părți ale „vecinilor”, asigurând redundanță. În plus, QUIC împarte coada monolitică în mai multe fluxuri pentru diferite tipuri de cereri într-o singură conexiune. Astfel, în caz de pierdere a unui pachet, problemele pot apărea doar într-o singură coadă (de exemplu, în transmiterea unui anumit fișier):

HTTP pe UDP – să folosim protocolul QUIC în mod util

Utilizare

Inițial, QUIC a fost dezvoltat în interiorul Google și a fost în mare parte adaptat pentru utilizarea în cadrul companiei. În 2013, a fost predat IETF pentru standardizare (care continuă și în prezent), iar acum oricine poate participa la dezvoltarea protocolului, propunând ceea ce îi lipsește. Grupul de lucru IETF organizează anual întâlniri în cadrul cărora se aprobă un nou standard și se discută inovațiile. Această implementare a QUIC este considerată principală și pe baza ei se certifică standardul HTTP/3.

Deocamdată, nu se discută despre includerea HTTP/3 ca protocol principal, deoarece acesta nu este finalizat și este aproape deloc suportat:

HTTP pe UDP – să folosim protocolul QUIC în mod util

Însă QUIC poate fi implementat ca transport între aplicație și server, ceea ce a fost realizat cu succes de Uber:

Comentariul Uber despre implementarea QUIC

Pentru a integra cu succes QUIC și a îmbunătăți performanța aplicației în condiții de conexiune slabă, am înlocuit vechea stivă (HTTP/2 deasupra TLS/TCP) cu protocolul QUIC. Am utilizat biblioteca de rețea Cronet din Chromium Projects, care conține versiunea originală, dezvoltată de Google, a protocolului – gQUIC. Această implementare este, de asemenea, îmbunătățită constant pentru a urma ultima specificație IETF.

Am integrat mai întâi Cronet în aplicațiile noastre Android pentru a adăuga suport pentru QUIC. Integrarea a fost realizată astfel încât să reducem la minimum costurile migrației. În loc să înlocuim complet vechiul stack de rețea care folosea biblioteca OkHttp, am integrat Cronet sub cadrul API-ului OkHttp. Realizând integrarea în acest mod, am evitat modificările în apelurile noastre de rețea (care utilizează Retrofit) la nivel de API.

Similar abordării pentru dispozitivele Android, am implementat Cronet în aplicațiile Uber pe iOS, interceptând traficul HTTP din API, utilizând NSURLProtocol. Această abstracție oferită de fundația iOS gestionează datele URL specifice protocolului și garantează că putem integra Cronet în aplicațiile noastre iOS fără costuri semnificative de migrare.

preluat din această traducere articolului Uber

Pe backend, aceștia au captat conexiunile QUIC prin intermediul Google Cloud lb, care suportă protocolul din mijlocul anului 2018.

Nu este surprinzător că Google Cloud funcționează foarte bine cu protocolul dezvoltat de Google, dar ce alternative există?

Nginx

Nu cu mult timp în urmă, CloudFlare a încercat să combine nginx (care în mod implicit nu suportă HTTP/3) cu instrumentul său Quiche. Implementarea este disponibilă sub formă de un singur fișier .patch, la care este atașat 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 poți să-ți conectezi 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

Rămâne doar să activezi suportul HTTP/3

events {
    worker_connections  1024;
}

http {
    server {
        # Activează QUIC și HTTP/3.
        listen 443 quic reuseport;

        # Activează HTTP/2 (opțional).
        listen 443 ssl http2;

        ssl_certificate      cert.crt;
        ssl_certificate_key  cert.key;

        # Activează toate versiunile TLS (TLSv1.3 este necesar pentru QUIC).
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

        # Bufferizarea cererilor nu este momentan suportată pentru HTTP/3.
        proxy_request_buffering off;

        # Adaugă header Alt-Svc pentru a negocia HTTP/3.
        add_header alt-svc 'h3-27=":443"; ma=86400';
    }
}

În browserele obișnuite, conectarea prin HTTP/3 nu este posibilă deocamdată, dar se poatelua Chrome Canary și rula cu flagul --enable-quic, să se adreseze serverului său sau, de exemplu, site-ului quic.rocks și să verifice tipul de conexiune în Developer Tools:
HTTP pe UDP – să folosim protocolul QUIC în mod util
În loc de HTTP/3 se va scrie http2+quic/99, dar acesta este în esență același lucru.

Alte tehnologii

  • QUIC este, de asemenea, susținut LiteSpeed (care s-au conectat cu mare fast la Facebook prin HTTP/3) și progresiv Caddy. Apache încă nu poate, dar munca este în curs de învigorare.
  • Pe 21 ianuarie a fost actualizat draftul standard pentru WebRTC
  • Cu doar câteva zile în urmă, Microsoft a deschis codul implementării sale msquic, în care nu toate funcțiile din standardul IETF sunt deocamdată disponibile, dar este deja un mare pas înainte.

Concluzie

HTTP pe UDP – să folosim protocolul QUIC în mod util

Interesul pentru QUIC este instabil, dar în creștere; se lucrează la standardizarea sa. Noi implementări ale protocolului apar aproape în fiecare lună, iar din ce în ce mai mulți dezvoltatori se conving că viitorul aparține QUIC. Se acceptă chiar includerea protocolului în viitoarele versiuni ale stivei TCP, iar asta înseamnă că, mai devreme sau mai târziu, întregul internet va trece la conexiuni mai stabile și mai rapide.

Deja acum, puteți configura interacțiunea QUIC pentru infrastructura dumneavoastră sau chiar să o oferiți browserelor — toate planifică să adauge suport pentru protocol, iar statistica tristă de pe caniuse va deveni mai optimistă.

HTTP pe UDP – să folosim protocolul QUIC în mod util

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster