Firma Cloudflare do zapewnienia wsparcia dla protokołu HTTP/3 w NGINX. Moduł jest zaimplementowany jako nakładka na rozwijaną w Cloudflare bibliotekę z implementacją protokołu transportowego QUIC i HTTP/3. Kod quiche jest napisany w języku Rust, natomiast sam moduł dla NGINX jest napisany w języku C i korzysta z biblioteki za pomocą dynamicznego linkowania. Osiągnięcia na licencji BSD.
Aby kompilować wystarczy pobrać do nginx 1.16 i biblioteki quiche, a następnie przebudować nginx z opcjami "--with-http_v3_module --with-quiche=../quiche". Przy kompilacji wsparcie TLS musi opierać się na bibliotece BoringSSL ("--with-openssl=../quiche/deps/boringssl"), użycie OpenSSL nie jest jeszcze wspierane. Aby przyjmować połączenia, w konfiguracji należy dodać dyrektywę listen z flagą "quic" (na przykład "listen 443 quic reuseport").
W klientach wsparcie HTTP/3 zostało już dodane do eksperymentalnych wersji Chrome Canary oraz narzędzia curl. Po stronie serwera wciąż wymagano użycia ograniczonych w swoich możliwościach oddzielnych . Możliwość obsługi HTTP/3 w nginx znacznie uprości wdrażanie serwerów z wsparciem dla HTTP/3 oraz uczyni testowe wprowadzenie nowego protokołu łatwiejszym. Pojawienie się standardowego wsparcia HTTP/3 w nginx w gałęzi 1.17.x w ciągu 6-12 miesięcy.
Przypomnijmy, że HTTP/3 standaryzuje użycie protokołu QUIC jako transportu dla HTTP/2. Protokół (Quick UDP Internet Connections) od 2013 roku jest rozwijany przez firmę Google jako alternatywa dla połączeń TCP+TLS w sieci, rozwiązując problemy z długim czasem ustanawiania i uzgadniania połączeń w TCP oraz eliminując opóźnienia przy utracie pakietów w trakcie przesyłania danych. QUIC jest nadbudową nad protokołem UDP, wspierającą mnożenie połączeń i zapewniającą metody szyfrowania porównywalne z TLS/SSL.
Podstawowe QUIC:
- Wysokie bezpieczeństwo, podobne do TLS (w zasadzie QUIC zapewnia możliwość użycia TLS nad UDP);
- Kontrola integralności strumienia, zapobiegająca utracie pakietów;
- Możliwość natychmiastowego ustanowienia połączenia (0-RTT, w około 75% przypadków dane można przesyłać natychmiast po wysłaniu pakietu ustanowienia połączenia) oraz zapewnienie minimalnych opóźnień między wysłaniem żądania a otrzymaniem odpowiedzi (RTT, Round Trip Time);
- Nie używanie tego samego numeru sekwencji podczas ponownej transmisji pakietu, co pozwala uniknąć dwuznaczności przy określaniu odebranych pakietów i wyeliminować opóźnienia;
- Utrata pakietu wpływa na dostarczanie tylko powiązanego z nim strumienia i nie zatrzymuje dostarczania danych w równolegle przesyłanych strumieniach przez bieżące połączenie;
- Środki korekcji błędów, minimalizujące opóźnienia spowodowane ponowną transmisją zagubionych pakietów. Wykorzystanie specjalnych kodów korekcji błędów na poziomie pakietów w celu zmniejszenia liczby sytuacji wymagających ponownej transmisji danych zagubionego pakietu.
- Granice bloków kryptograficznych są wyrównane z granicami pakietów QUIC, co zmniejsza wpływ utraty pakietów na dekodowanie zawartości następnych pakietów;
- Brak problemów z blokowaniem kolejek TCP;
- Wsparcie dla identyfikatora połączenia, co pozwala skrócić czas na ponowne nawiązanie połączenia dla klientów mobilnych;
- Możliwość podłączenia rozszerzonych mechanizmów kontroli przeciążenia połączenia;
- Wykorzystanie techniki prognozowania przepustowości w każdym kierunku, aby zapewnić optymalną intensywność wysyłania pakietów, zapobiegając wpadnięciu w stan przeciążenia, w którym występuje utrata pakietów;
- Wyraźny wydajności i przepustowości w porównaniu z TCP. Dla serwisów wideo, takich jak YouTube, zastosowanie QUIC wykazało zmniejszenie operacji ponownego buforowania podczas oglądania wideo o 30%.
Źródło: opennet.ru
