Cloudflare przygotował moduł zapewniający obsługę protokołu HTTP / 3 w NGINX. Moduł jest gotowy w formie przystawki do biblioteki quiche opracowany w Cloudflare z implementacją protokołu transportowego QUIC i HTTP / 3. Kod quiche został napisany w języku Rust, ale moduł dla NGINX jest napisany w języku C i uzyskuje dostęp do biblioteki poprzez łącza dynamiczne. Godziny pracy są otwarte na licencji BSD.
Z oprogramowania klienta, Obsługa protokołu HTTP / 3 została już dodana do eksperymentalnych wersji Chrome Canary i narzędzie curl. Po stronie serwera do tej pory wymagane było stosowanie izolowanych implementacji testowych o ograniczonych możliwościach. Możliwość obsługi HTTP / 3 w nginx znacznie uprości wdrażanie serwerów z obsługą HTTP / 3 i sprawi, że testowa implementacja nowego protokołu będzie bardziej dostępna.
HTTP / 3 standaryzuje użycie protokołu QUIC jako transport dla HTTP / 2. Tym samym protokół QUIC został opracowany przez Google jako alternatywa dla TCP + TLS dla sieci Zamierza rozwiązać problemy związane z długim czasem instalacji i koordynacji związków w TCP i opóźnia eliminację utraty pakietów podczas transmisji danych. QUIC to wtyczka do protokołu UDP, która obsługuje multipleksowanie wielu połączeń i zapewnia metody szyfrowania równoważne TLS / SSL.
Wśród kluczowych cech QUIC, które się wyróżniają:
- Wysoki poziom bezpieczeństwa, podobny do TLS (w rzeczywistości QUIC zapewnia możliwość korzystania z TLS przez UDP).
- Kontrola integralności przepływu, która zapobiega utracie pakietów.
- Możliwość natychmiastowego nawiązania połączenia (0-RTT, w około 75% przypadków dane mogą być przesłane natychmiast po wysłaniu pakietu konfiguracji połączenia) i zapewnia minimalne opóźnienia między wysłaniem żądania a otrzymaniem odpowiedzi (RTT, Round Trip Time) .
- Nieużywanie tego samego numeru sekwencji podczas retransmisji pakietu, co pozwala uniknąć niejednoznaczności w określaniu odebranych pakietów i eliminuje przekroczenia czasu.
- Utrata pakietu wpływa na dostarczenie tylko związanego z nim strumienia i nie zatrzymuje dostarczania danych w strumieniach przesyłanych równolegle przez bieżące połączenie.
- Narzędzia do korekcji błędów, które minimalizują opóźnienia spowodowane retransmisją utraconych pakietów. Zastosowanie specjalnych kodów korekcji błędów na poziomie pakietu w celu ograniczenia sytuacji, które wymagają retransmisji utraconych danych pakietowych.
- Granice bloków kryptograficznych są wyrównane z granicami pakietów QUIC, zmniejszając wpływ utraty pakietów na dekodowanie zawartości kolejnych pakietów
- Brak problemów z blokowaniem kolejki TCP
- Obsługa identyfikatora połączenia, co skraca czas nawiązywania ponownego połączenia dla klientów mobilnych
- Możliwość łączenia zaawansowanych mechanizmów kontrolujących przeciążenie połączenia
- Wykorzystanie techniki przewidywania przepustowości w każdym kierunku w celu zapewnienia optymalnej intensywności przesyłania pakietów, zapobiegając osiągnięciu przez nie stanu przeciążenia, w którym obserwuje się utratę pakietów
- Niezwykła wydajność i wzrost wydajności w porównaniu z TCP. W przypadku usług wideo, takich jak YouTube, QUIC wykazał 30% redukcję operacji ponownego buforowania podczas oglądania filmów.
Jak zaimplementować moduł do obsługi HTTP / 3 w NGINX?
Dla tych, którzy są zainteresowani możliwością zaimplementowania tego modułu na swoim serwerze, Mogą to zrobić, postępując zgodnie z instrukcjami, które udostępniamy poniżej.
Aby to skompilować, wystarczy pobrać łatkę dla nginx 1.16 i kod biblioteki quiche.
curl -O https://nginx.org/download/nginx-1.16.1.tar.gz tar xzvf 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
Kompilujemy NGINX z włączoną obsługą HTTP / 3:
./configure \ --prefix=$PWD \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_v3_module \ --with-openssl=../quiche/deps/boringssl \ --with-quiche=../quiche make
Podczas kompilacji obsługa TLS musi być oparta na bibliotece BoringSSL ("–with-openssl = .. / quiche / deps / boringssl"), użycie OpenSSL nie jest jeszcze obsługiwane.
Aby akceptować połączenia w konfiguracji, będą musieli dodać dyrektywę listener z flagą „quic”.