QUIC

Protokół transportowy nad UDP z wbudowanym szyfrowaniem TLS 1.3. Łączy nawiązanie połączenia i szyfrowania w jednym kroku, prowadzi wiele strumieni naraz i przetrwa zmianę sieci; podstawa HTTP/3.

QUIC to protokół transportowy, czyli zestaw reguł, które decydują, jak dane wędrują przez sieć między dwoma urządzeniami. Działa nad UDP i w jednym mechanizmie łączy dwie rzeczy, które wcześniej były osobno: niezawodny transport danych i szyfrowanie (TLS 1.3). Dzięki temu nie trzeba już budować osobno połączenia (TCP) i osobno warstwy szyfrującej (TLS). QUIC ustandaryzowała organizacja IETF w 2021 r. w dokumentach RFC 9000 (sam transport), RFC 9001 (połączenie z TLS) i RFC 9002 (wykrywanie strat i kontrola przeciążenia). Jego głównym zastosowaniem jest HTTP/3 (RFC 9114) — wersja protokołu stron internetowych. Pierwotnie QUIC zaprojektował Google jako „gQUIC”; wersja IETF różni się od tego pierwowzoru na poziomie protokołu.

Jak działa QUIC?

QUIC nie zastępuje UDP — działa na nim i dokłada to, czego samemu UDP brakuje: rozpoznawanie połączenia, pewne dostarczanie danych, kontrolę przeciążenia sieci oraz szyfrowanie. Dane podróżują w pakietach QUIC zapakowanych w datagramy UDP. Wewnątrz tych pakietów są mniejsze porcje (frames), które należą do niezależnych strumieni (streams) — każdy strumień ma swój numer (stream ID).

Najważniejsze cechy:

  • Jedno wspólne uzgadnianie połączenia i szyfrowania. Klasycznie urządzenia najpierw nawiązują połączenie TCP, a dopiero potem uzgadniają szyfrowanie TLS. QUIC robi obie rzeczy naraz, w jednej wymianie. Skraca to czas nawiązania zaszyfrowanego połączenia do jednej tury w obie strony (1-RTT), a przy wznawianiu wcześniejszej sesji nawet do zera (0-RTT).
  • Wiele niezależnych strumieni naraz. Jedno połączenie QUIC prowadzi wiele osobnych strumieni danych. Gdy zgubi się jakiś pakiet, dotyczy to tylko tego strumienia, do którego należał — reszta jedzie dalej bez przeszkód.
  • Connection ID — identyfikator połączenia. Połączenie jest oznaczone własnym identyfikatorem (Connection ID), a nie adresem i portem IP. Dlatego potrafi przetrwać zmianę sieci — na przykład gdy telefon przechodzi z Wi-Fi na sieć komórkową. To mechanizm migracji połączenia (connection migration).
  • Własne wykrywanie strat i kontrola przeciążenia. QUIC sam dba o ponowne wysyłanie zgubionych danych i o to, by nie zalać sieci (algorytmy takie jak NewReno, CUBIC, BBR). Robi to w przestrzeni użytkownika, czyli w samej aplikacji, a nie w jądrze systemu — dzięki czemu łatwiej go rozwijać i poprawiać niż TCP.

Jak QUIC rozwiązuje head-of-line blocking?

Head-of-line blocking (blokada „pierwszego w kolejce”) to sytuacja, w której jeden zgubiony fragment wstrzymuje wszystko, co za nim stoi. W HTTP/2 wiele strumieni dzieli jedno połączenie TCP, a TCP dostarcza dane ściśle po kolei. Wystarczy więc, że zgubi się jeden fragment, a dostarczanie wszystkich strumieni czeka, aż zostanie on wysłany ponownie. QUIC prowadzi strumienie niezależnie: każdy ma własną kolejność, więc strata w jednym nie blokuje pozostałych. To usuwa blokadę na poziomie transportu — choć podobne opóźnienia mogą jeszcze wystąpić wyżej, na poziomie samej aplikacji (np. zależności między żądaniami HTTP).

Czym różni się QUIC od TCP + TLS?

  • Gdzie działa: QUIC działa nad UDP, w samej aplikacji; TCP jest wbudowane w jądro systemu operacyjnego.
  • Szyfrowanie: w QUIC szyfrowanie (TLS 1.3) jest częścią protokołu — zaszyfrowane są nie tylko same dane, ale i większość nagłówków transportowych. W modelu TCP+TLS szyfrowanie to osobna warstwa nad jawnym nagłówkiem TCP.
  • Nawiązanie połączenia: QUIC łączy uzgadnianie połączenia i szyfrowania (1-RTT, a przy wznowieniu nawet 0-RTT); TCP+TLS wymaga najpierw uzgodnienia TCP, a potem TLS.
  • Wiele strumieni: QUIC prowadzi niezależne strumienie bez transportowego head-of-line blocking; HTTP/2 nad TCP jest na tę blokadę podatne.
  • Zmiana sieci: Connection ID pozwala QUIC przetrwać zmianę sieci; połączenie TCP jest przywiązane do adresu i portu, więc zrywa się, gdy adres się zmieni.

QUIC, HTTP/3 i port 443

HTTP/3 to po prostu protokół stron WWW „posadzony” na QUIC i jest jego najważniejszym zastosowaniem. Ale QUIC jest protokołem ogólnego przeznaczenia — może przenosić też inne rzeczy (np. DNS over QUIC czy MASQUE). Ruch QUIC korzysta zwykle z portu UDP/443 — tego samego numeru co zwykły HTTPS nad TCP. Przeglądarka zwykle dowiaduje się o wsparciu HTTP/3 z nagłówka Alt-Svc przy połączeniu HTTP/1.1 lub HTTP/2, albo z rekordu DNS HTTPS (RFC 9460), po czym próbuje przejść na QUIC. Jeśli QUIC jest niedostępny lub zablokowany, wraca do TCP (tzw. fallback).

Dlaczego QUIC jest wyzwaniem dla bezpieczeństwa i widoczności sieci?

QUIC z założenia szyfruje znacznie więcej niż TCP+TLS. To dobre dla prywatności, ale gorsze dla narzędzi, które monitorują i analizują ruch (DPI, IDS/IPS, NDR). Widzą one mniej niż przy zwykłym TCP:

  • Zaszyfrowane nagłówki transportowe. Większość informacji o połączeniu (w tym numery pakietów) jest zaszyfrowana. Pasywne narzędzia nie odczytają więc stanu połączenia tak, jak z jawnego nagłówka TCP. Jawny pozostaje głównie nagłówek pierwszych pakietów (m.in. Connection ID i numer wersji).
  • Często brak widocznej nazwy serwera (SNI). Uzgadnianie TLS 1.3 jest ukryte w zaszyfrowanych pakietach Initial, a w połączeniu z mechanizmem Encrypted Client Hello (ECH) nazwa serwera w ogóle znika z jawnego ruchu. Klasyczna analiza po nazwie hosta przestaje wtedy działać.
  • Trudniejsze rozszywanie ruchu (break-and-inspect). QUIC nie poddaje się tym samym technikom podglądania szyfrowanego ruchu co TCP+TLS. Wymaga osobnego podejścia, a często proxy, które kończy połączenie po stronie organizacji.
  • UDP/443 trudniej rozpoznać. Ruch QUIC ciężko odróżnić od innego ruchu UDP po samym porcie, a brak stanu połączenia (jak w TCP) utrudnia firewallom śledzenie sesji.
  • Ryzyko przy 0-RTT. Dane wysłane w trybie 0-RTT nie są w pełni chronione przed powtórzeniem (atak typu replay), więc powinny obejmować tylko operacje, które można bezpiecznie powtórzyć (idempotentne).

Dla zespołów SOC/NDR oznacza to zmianę podejścia: zamiast zaglądać do treści ruchu, trzeba analizować jego metadane i zachowanie. Liczą się dane o przepływach (wolumeny, czasy, rozkład wielkości pakietów), rozpoznawanie QUIC po cechach charakterystycznych (analiza pól w pakietach Initial), wykrywanie anomalii oraz — tam gdzie to dopuszczalne — kończenie połączeń QUIC na kontrolowanym proxy. Część organizacji świadomie blokuje UDP/443, by wymusić powrót do HTTP/2 nad TCP i zachować dotychczasowe możliwości wglądu — kosztem zysków wydajnościowych QUIC.

Dowiedz się więcej