HTTP/3
HTTP over QUIC: nast臋pna generacja protoko艂贸w webowych.
Motywacja do Zmian: Ostatnie W膮skie Gard艂o
Ewolucja z HTTP/1.1 do HTTP/2 by艂a monumentalnym krokiem naprz贸d w dziedzinie wydajno艣ci sieci. HTTP/2 wprowadzi艂 multipleksowanie, umo偶liwiaj膮c r贸wnoczesne wysy艂anie wielu 偶膮da艅 i odpowiedzi przez jedno po艂膮czenie TCP, co doskonale rozwi膮za艂o problem blokowania na czele kolejki na poziomie aplikacji. Wolne 偶膮danie o du偶y obrazek nie blokowa艂o ju偶 szybkiego pobierania pliku CSS. Jednak偶e, naprawiaj膮c ten problem, spo艂eczno艣膰 internetowa wkr贸tce odkry艂a g艂臋bsze, bardziej fundamentalne w膮skie gard艂o: blokowanie na czele kolejki w warstwie transportowej, nieod艂膮cznie zwi膮zane z architektur膮 protoko艂u .
TCP gwarantuje niezawodne i uporz膮dkowane dostarczanie pakiet贸w danych. Jest to kluczowa cecha dla wielu aplikacji, zapewniaj膮ca, 偶e pliki nie s膮 uszkodzone, a dane docieraj膮 zgodnie z zamierzeniami. Aby to osi膮gn膮膰, TCP traktuje wszystkie dane w ramach jednego po艂膮czenia jako jeden uporz膮dkowany strumie艅. Je艣li pojedynczy pakiet zostanie utracony w tranzycie, TCP wstrzyma dostarczanie wszystkich kolejnych pakiet贸w, nawet tych nale偶膮cych do innych, niezale偶nych strumieni HTTP/2 do czasu, a偶 utracony pakiet zostanie retransmitowany i odebrany. Oznacza to, 偶e pojedynczy utracony pakiet z pobieranego obrazu m贸g艂by zamrozi膰 renderowanie ca艂kowicie oddzielnego pliku JavaScript na tym samym po艂膮czeniu.
To blokowanie HOL na poziomie TCP jest szczeg贸lnie szkodliwe w sieciach niestabilnych lub o wysokim op贸藕nieniu, takich jak sieci kom贸rkowe. W miar臋 jak coraz wi臋cej os贸b na 艣wiecie korzysta z internetu na urz膮dzeniach mobilnych, to ograniczenie stawa艂o si臋 coraz bardziej znacz膮ce. Sta艂o si臋 jasne, 偶e aby uczyni膰 sie膰 szybsz膮 i bardziej odporn膮, sama podstawa jej transportu wymaga艂a przeprojektowania. Ta konieczno艣膰 by艂a g艂贸wnym motorem nap臋dowym powstania HTTP/3.
Zmiana Paradygmatu: Budowa na UDP z wykorzystaniem QUIC
HTTP/3 stanowi radykalne odej艣cie od swoich poprzednik贸w. Nie dzia艂a on na protokole TCP. Zamiast tego jest zbudowany na nowym protokole transportowym o nazwie , co jest skr贸tem od Quick UDP Internet Connections.
Aby zrozumie膰, dlaczego jest to tak znacz膮ca zmiana, musimy najpierw zrozumie膰 protok贸艂, na kt贸rym opiera si臋 QUIC, czyli UDP. jest minimalistycznym, bezpo艂膮czeniowym protoko艂em. Pozwala aplikacjom wysy艂a膰 do siebie pakiety (zwane datagramami), ale nie oferuje 偶adnych gwarancji. Pakiety mog膮 zosta膰 utracone, zduplikowane lub dotrze膰 w innej kolejno艣ci. To jak wysy艂anie serii poczt贸wek; niekt贸re mog膮 zagin膮膰, a te, kt贸re dotr膮, niekoniecznie pojawi膮 si臋 w kolejno艣ci, w jakiej zosta艂y wys艂ane.
QUIC bierze szybko艣膰 i prostot臋 UDP i buduje na nich warstw臋 niezawodno艣ci, w zasadzie reimplementuj膮c najlepsze cechy TCP, ale bez jego najwi臋kszych wad. Oferuje niezawodno艣膰, kontrol臋 przeci膮偶enia i kontrol臋 przep艂ywu, ale robi to w spos贸b zoptymalizowany dla nowoczesnej, zmultipleksowanej natury HTTP.
G艂贸wna Korzy艣膰 1: Eliminacja Blokowania HOL w Warstwie Transportowej
Podstawow膮 zalet膮 QUIC jest ca艂kowita eliminacja blokowania na czele kolejki, kt贸re jest charakterystyczne dla TCP. QUIC osi膮ga to, poniewa偶 obs艂uguje strumienie natywnie, jako pierwszorz臋dny element samego protoko艂u transportowego.
W HTTP/2 nad TCP koncepcja strumieni istnieje tylko na poziomie aplikacji. Sam protok贸艂 TCP jest ich nie艣wiadomy i widzi tylko pojedynczy, monolityczny strumie艅 bajt贸w. W przeciwie艅stwie do tego, QUIC zarz膮dza wieloma niezale偶nymi strumieniami logicznymi w ramach jednego po艂膮czenia. Pakiety danych przesy艂ane przez sie膰 s膮 oznaczane identyfikatorem strumienia QUIC, do kt贸rego nale偶膮.
Je艣li pakiet zawieraj膮cy dane dla strumienia 3 zostanie utracony, mechanizm niezawodno艣ci QUIC wie, 偶e ma wstrzyma膰 dostarczanie danych tylko dla strumienia 3, do czasu retransmisji tego pakietu. Strumienie 1 i 5, kt贸rych pakiety zosta艂y pomy艣lnie odebrane, mog膮 by膰 nadal dostarczane do warstwy aplikacji i natychmiast przetwarzane. To niezale偶ne obs艂ugiwanie strumieni sprawia, 偶e po艂膮czenie jest znacznie bardziej odporne na utrat臋 pakiet贸w, zapewniaj膮c znacznie p艂ynniejsze i szybsze do艣wiadczenie u偶ytkownika, zw艂aszcza w sieciach mobilnych i o du偶ej stratno艣ci.
G艂贸wna Korzy艣膰 2: Szybsze Ustanawianie Po艂膮czenia
Kolejn膮 znacz膮c膮 popraw膮 wydajno艣ci w HTTP/3 jest radykalnie skr贸cony czas nawi膮zywania po艂膮czenia, co r贸wnie偶 jest zas艂ug膮 QUIC. W 艣wiecie HTTP/2 nad TCP, ustanowienie bezpiecznego po艂膮czenia wymaga艂o dw贸ch oddzielnych, sekwencyjnych uzgodnie艅 (handshakes):
- Uzgadnianie TCP: Wymaga jednego pe艂nego obiegu (round-trip) mi臋dzy klientem a serwerem (SYN -> SYN-ACK -> ACK).
- Uzgadnianie TLS: Wymaga jednego do dw贸ch dodatkowych obieg贸w w celu negocjacji kluczy szyfruj膮cych.
W rezultacie, zanim pierwszy bajt rzeczywistych danych aplikacji mo偶e zosta膰 wys艂any, mijaj膮 dwa do trzech obieg贸w. W sieciach mobilnych o wysokich op贸藕nieniach, to pocz膮tkowe op贸藕nienie mo偶e by膰 znacz膮ce.
Uzgadnianie 1-RTT i 0-RTT w QUIC
QUIC usprawnia ten proces, 艂膮cz膮c uzgadnianie transportowe i kryptograficzne w jedn膮 procedur臋.
- Po艂膮czenie 1-RTT: Dla nowego po艂膮czenia, klient wysy艂a komunikat `ClientHello`, a serwer mo偶e odpowiedzie膰 komunikatem zawieraj膮cym sw贸j certyfikat TLS i wszystkie niezb臋dne parametry do ustanowienia bezpiecznej sesji. Klient mo偶e to nast臋pnie zweryfikowa膰 i rozpocz膮膰 wysy艂anie zaszyfrowanych danych. Ca艂y proces zajmuje zazwyczaj tylko jeden czas obiegu ().
- Wznowienie po艂膮czenia 0-RTT: Co jeszcze bardziej imponuj膮ce, dla klient贸w, kt贸rzy ju偶 wcze艣niej 艂膮czyli si臋 z danym serwerem, QUIC obs艂uguje wznowienie po艂膮czenia w zerowym czasie obiegu (0-RTT). Klient mo偶e natychmiast zacz膮膰 wysy艂a膰 zaszyfrowane dane aplikacji wraz ze swoim pierwszym komunikatem uzgadniaj膮cym, u偶ywaj膮c wcze艣niej wynegocjowanych parametr贸w zapisanych z ostatniej sesji. Eliminuje to prawie ca艂e op贸藕nienie zwi膮zane z nawi膮zywaniem po艂膮czenia, sprawiaj膮c, 偶e powt贸rne wizyty na stronach internetowych wydaj膮 si臋 niemal natychmiastowe.
G艂贸wna Korzy艣膰 3: Migracja Po艂膮czenia dla 艢wiata Mobilnego
Jedn膮 z najbardziej zauwa偶alnych dla u偶ytkownika innowacji QUIC jest jego odporno艣膰 na zmiany sieciowe, funkcja znana jako migracja po艂膮czenia. Tradycyjne po艂膮czenie TCP jest 艣ci艣le zdefiniowane przez 4-krotk臋: 藕r贸d艂owy adres IP, port 藕r贸d艂owy, docelowy adres IP i port docelowy. Je艣li kt贸rakolwiek z tych czterech warto艣ci si臋 zmieni, po艂膮czenie zostaje przerwane.
Tworzy to frustruj膮ce do艣wiadczenie u偶ytkownika w 艣wiecie zdominowanym przez urz膮dzenia mobilne. Wyobra藕 sobie, 偶e ogl膮dasz film na telefonie w domu, po艂膮czony z sieci膮 Wi-Fi. Wychodz膮c z domu i trac膮c zasi臋g, Tw贸j telefon p艂ynnie prze艂膮cza si臋 z Wi-Fi na sie膰 kom贸rkow膮. Kiedy to si臋 dzieje, zmienia si臋 adres IP Twojego telefonu. Z perspektywy TCP, narusza to 4-krotk臋, a istniej膮ce po艂膮czenie z serwerem wideo zostaje natychmiast zako艅czone. Odtwarzacz wideo musi buforowa膰, ustanowi膰 ca艂kowicie nowe po艂膮czenie TCP i TLS przez sie膰 kom贸rkow膮 i wznowi膰 strumie艅, co powoduje zauwa偶alne zaci臋cie lub przerw臋.
QUIC rozwi膮zuje ten problem w elegancki spos贸b. Zamiast identyfikowa膰 po艂膮czenie za pomoc膮 adres贸w IP i port贸w, QUIC u偶ywa . Jest to unikalny identyfikator do艂膮czany do nag艂贸wka ka偶dego pakietu QUIC. Kiedy Tw贸j telefon prze艂膮cza si臋 z Wi-Fi na sie膰 kom贸rkow膮, zmienia si臋 Tw贸j adres IP, ale Identyfikator Po艂膮czenia pozostaje taki sam. Mo偶esz kontynuowa膰 wysy艂anie pakiet贸w z tym samym Identyfikatorem Po艂膮czenia ze swojego nowego adresu IP. Serwer, widz膮c ten znajomy identyfikator, wie, 偶e to to samo, trwaj膮ce po艂膮czenie i p艂ynnie kontynuuje transfer danych. Dla u偶ytkownika, strumie艅 wideo jest kontynuowany bez przerw, zapewniaj膮c prawdziwie p艂ynne do艣wiadczenie mobilne.
Warstwa Aplikacji w HTTP/3
Chocia偶 warstwa transportowa zosta艂a ca艂kowicie wymieniona, warstwa aplikacji w HTTP/3 zachowuje te same semantyki i funkcje wysokiego poziomu wprowadzone w HTTP/2. Koncepcje 偶膮dania/odpowiedzi, nag艂贸wk贸w, metod (GET, POST, itp.) i kod贸w statusu pozostaj膮 niezmienione. Funkcje takie jak Server Push i priorytetyzacja strumieni r贸wnie偶 s膮 obecne w HTTP/3, poniewa偶 s膮 one implementowane na poziomie HTTP.
Mapowanie HTTP na Strumienie QUIC
Kluczow膮 r贸偶nic膮 jest spos贸b mapowania tych koncepcji na podstawowy transport. QUIC zapewnia natywn膮 abstrakcj臋 strumienia, wi臋c ka偶da para 偶膮danie-odpowied藕 HTTP/3 jest mapowana na dedykowany strumie艅 QUIC. Jest to znacznie czystsze i bardziej wydajne mapowanie ni偶 implementacja strumieni na poziomie aplikacji, kt贸ra by艂a nak艂adana na TCP w HTTP/2.
QPACK: Kompresja Nag艂贸wk贸w dla QUIC
Kompresja nag艂贸wk贸w pozostaje kluczow膮 funkcj膮. Jednak schemat kompresji HPACK z HTTP/2 opiera艂 si臋 na 艣cis艂ym, uporz膮dkowanym dostarczaniu danych przez TCP. Poniewa偶 strumienie QUIC mog膮 dostarcza膰 dane w innej kolejno艣ci, potrzebny by艂 nowy schemat kompresji. HTTP/3 u偶ywa QPACK, kt贸ry jest podobny w za艂o偶eniach do HPACK, ale zosta艂 zaprojektowany do pracy z bardziej elastycznym modelem dostarczania QUIC. U偶ywa on oddzielnych, jednokierunkowych strumieni do zarz膮dzania dynamicznymi tabelami nag艂贸wk贸w, co zapobiega blokowaniu HOL w samym mechanizmie kompresji nag艂贸wk贸w.
Wdro偶enie i Przysz艂o艣膰
HTTP/3 to przysz艂o艣膰 protoko艂u internetowego, oferuj膮ca namacalne korzy艣ci w zakresie wydajno艣ci i niezawodno艣ci. G艂贸wne przegl膮darki, takie jak Chrome, Firefox i Safari, a tak偶e g艂贸wni dostawcy tre艣ci i sieci CDN, jak Google i Cloudflare, ju偶 szeroko go wspieraj膮.
Najwi臋kszym wyzwaniem dla jego powszechnej adaptacji jest infrastruktura sieciowa. Poniewa偶 QUIC dzia艂a na protokole UDP, czasami mo偶e by膰 blokowany przez 藕le skonfigurowane lub przestarza艂e firmowe zapory sieciowe i inne urz膮dzenia po艣rednicz膮ce, kt贸re s膮 skonfigurowane tak, aby przepuszcza膰 tylko ruch TCP na porcie (standardowy port dla HTTPS). Systemy s膮 jednak projektowane z my艣l膮 o tym problemie. Przegl膮darki najpierw pr贸buj膮 nawi膮za膰 po艂膮czenie za pomoc膮 HTTP/3, a je艣li ruch UDP jest blokowany, p艂ynnie wracaj膮 do ustanowienia po艂膮czenia HTTP/2 przez TCP, zapewniaj膮c, 偶e strony internetowe pozostaj膮 dost臋pne dla wszystkich u偶ytkownik贸w. W miar臋 modernizacji infrastruktury sieciowej, adopcja HTTP/3 b臋dzie tylko ros艂a, czyni膮c sie膰 szybsz膮, bardziej odporn膮 i lepiej przystosowan膮 do naszego mobilnego 艣wiata.