HTTP па UDP - выкарыстоўваем з карысцю пратакол QUIC

HTTP па UDP - выкарыстоўваем з карысцю пратакол QUIC

QUIC (Quick UDP Internet Connections) - гэта пратакол па-над UDP, які падтрымлівае ўсе магчымасці TCP, TLS і HTTP/2 і вырашальны большасць іх праблем. Яго часта называюць новым або "эксперыментальным" пратаколам, але ён ужо даўно перажыў стадыю эксперыменту: распрацоўка вядзецца больш за 7 гадоў. За гэты час пратакол не паспеў стаць стандартам, але ўсё ж атрымаў шырокае распаўсюджванне. Напрыклад, QUIC выкарыстоўваюць для паскарэння трафіку і зніжэння затрымак у мабільных сетках такія гіганты як Google і Facebook, а IETF абвясціла свой форк пратакола асновай для стандарту HTTP/3 (пры тым, што HTTP/2 выкарыстоўвае толькі 44.8% сайтаў).

Канцэпцыя

QUIC распрацоўваўся як замена састарэлага TCP, які першапачаткова быў заменчаны пад правадныя сеткі з нізкім працэнтам страт. TCP дастаўляе пакеты па парадку, таму пры страце аднаго пакета ўстае ўся чарга (head-of-line blocking), што негатыўна адбіваецца на якасці і стабільнасці злучэння. Каб пазбегнуць масавых страт, сотавыя сеткі звяртаюцца да выкарыстання вялікіх буфераў, што ў сваю чаргу прыводзіць да надмернасці і false negative рэакцыі пратаколу (буфернае ўздуцце). Акрамя таго, TCP марнуе вельмі шмат часу на ўсталяванне злучэння: SYN/ACK і TLS запыты ідуць паасобна, патрабуючы трох roundtrip'аў замест аднаго, як гэта робіць QUIC.

HTTP па UDP - выкарыстоўваем з карысцю пратакол QUIC

Так як QUIC спалучае ў сабе замену TCP і рэалізацыю TLS 1.3, усе злучэнні заўсёды зашыфраваны, расшыфраваць такі трафік не прасцей, чым калі б ён ішоў па HTTPS. Акрамя таго, QUIC рэалізаваны на прыкладным узроўні, як як поўная замена TCP стэка заняла б вечнасць.

Нягледзячы на ​​падтрымку мультыплексавання ў HTTP/2, праблема head-of-line blocking тамака засталася з-за неабходнасці дастаўляць пакеты па парадку. QUIC рэалізаваны па-над UDP, таму ў яго блакіровак не бывае ў прынцыпе, а каб пакеты не губляліся беззваротна, яны нумаруюцца і могуць утрымоўваць у сабе часткі «суседзяў», забяспечваючы надмернасць. Акрамя таго, QUIC разбівае маналітную чаргу на некалькі струменяў для розных тыпаў запытаў усярэдзіне аднаго злучэнні. Такім чынам, пры страце пакета праблемы могуць узнікнуць толькі ў адной чаргі (напрыклад, на перадачу канкрэтнага файла):

HTTP па UDP - выкарыстоўваем з карысцю пратакол QUIC

Выкарыстанне

Першапачаткова QUIC распрацоўваўся ўсярэдзіне Google і быў шмат у чым заменчаны пад выкарыстанне ўсярэдзіне кампаній. У 2013 годзе яго перадалі ў IETF для стандартызацыі (якая ідзе да гэтага часу), і зараз кожны можа паўдзельнічаць у развіцці пратакола, прапанаваўшы тое, чаго не хапае менавіта яму. Рабочая група IETF штогод арганізуе сустрэчы, у рамках якіх зацвярджаецца новы стандарт і вядзецца абмеркаванне новаўвядзенняў. Гэтая рэалізацыя QUIC лічыцца асноўнай і менавіта на яе аснове сертыфікуецца стандарт HTTP/3.

Пакуль што аб уключэнні HTTP/3 як асноўнага пратакола гаворка не ідзе, таму што ён яшчэ не скончаны і амаль не падтрымліваецца:

HTTP па UDP - выкарыстоўваем з карысцю пратакол QUIC

Але QUIC можна рэалізаваць як транспарт паміж дадаткам і серверам, што паспяхова прарабілі ў Uber:

Каментарый Uber аб укараненні QUIC

Каб паспяхова ўбудаваць QUIC і палепшыць прадукцыйнасць прыкладання ва ўмовах дрэннай сувязі, мы замянілі стары стэк (HTTP/2 па-над TLS/TCP) на пратакол QUIC. Мы задзейнічалі сеткавую бібліятэку Cronet з Chromium Projects, якая змяшчае арыгінальную, гуглоўскую версію пратакола – gQUIC. Гэтая рэалізацыя таксама ўвесь час удасканальваецца, каб прытрымлівацца апошняй спецыфікацыі IETF.

Перш мы інтэгравалі Cronet у нашы Android-прыкладанні, каб дадаць падтрымку QUIC. Інтэграцыя была ажыццёўлена так, каб максімальна знізіць выдаткі на міграцыю. Замест таго, каб цалкам замяніць стары сеткавы стэк, які выкарыстоўваў бібліятэку OkHttp, мы інтэгравалі Cronet ПАД фрэймворкам OkHttp API. Выканаўшы інтэграцыю такім спосабам, мы пазбеглі змен у нашых сеткавых выкліках (які выкарыстоўваюць Мадыфікаваць) на ўзроўні API.

Падобна падыходу да Android-прылад, мы ўкаранілі Cronet у прыкладанні Uber пад iOS, перахапляючы HTTP-трафік з сеткавых. API, выкарыстоўваючы NSURLProtocol. Гэта абстракцыя, прадстаўленая iOS Foundation, апрацоўвае пратакол-спецыфічныя URL-дадзеныя і гарантуе, што мы можам інтэграваць Cronet у нашы iOS-прыкладанні без істотных міграцыйных выдаткаў.

узята з гэтага перакладу артыкулы Uber

На бэкендзе яны лавілі QUIC-злучэнні праз Google Cloud lb, які падтрымлівае пратакол з сярэдзіны 2018 года.

Нядзіўна, што Google Cloud выдатна працуе з пратаколам, распрацаваным Google, але якія ёсць альтэрнатывы?

Nginx

Не так даўно CloudFlare спрабавала скрыжаваць nginx (які па змаўчанні не ўмее HTTP/3) са сваёй прыладай Quiche. Рэалізацыя даступна ў выглядзе адзінага .patch файла, да якога прыкладаецца тутарыял па ўсталёўцы:

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

Тут можна падлучыць свае модулі пры неабходнасці

./configure                          	
   	--prefix=$PWD                       	
   	--with-http_ssl_module              	
   	--with-http_v2_module               	
   	--with-http_v3_module               	
   	--with-openssl=../quiche/deps/boringssl 
   	--with-quiche=../quiche
 make

Застаецца толькі ўключыць падтрымку HTTP/3

events {
    worker_connections  1024;
}

http {
    server {
        # Enable QUIC and HTTP/3.
        listen 443 quic reuseport;

        # Enable HTTP/2 (optional).
        listen 443 ssl http2;

        ssl_certificate      cert.crt;
        ssl_certificate_key  cert.key;

        # Enable all TLS versions (TLSv1.3 is required for QUIC).
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

        # Request buffering in not currently supported for HTTP/3.
        proxy_request_buffering off;

        # Add Alt-Svc header to negotiate HTTP/3.
        add_header alt-svc 'h3-27=":443"; ma=86400';
    }
}

У звычайных браўзэрах злучыцца па HTTP/3 пакуль не атрымаецца, але можна ўзяць Chrome Canary і запусціць яго са сцягам --enable-quic, звярнуцца да свайго сервера ці, напрыклад, сайту quic.rocks і паглядзець тып злучэння ў Developer Tools:
HTTP па UDP - выкарыстоўваем з карысцю пратакол QUIC
Замест HTTP/3 пішацца http2+quic/99, Але гэта па сутнасці адно і тое ж.

Іншыя тэхналогіі

Заключэнне

HTTP па UDP - выкарыстоўваем з карысцю пратакол QUIC

Цікавасць да QUIC нестабільна, але расце, вядзецца праца над яго стандартызацыяй. Новыя рэалізацыі пратакола з'яўляюцца ўжо ці ледзь не кожны месяц, і з кожным годам усё больш распрацоўшчыкаў пераконваюцца, што будучыня за QUIC. Дапушчаецца нават уключэнне пратаколу ў будучыя версіі TCP стэка, а гэта азначае, што рана ці позна ўвесь інтэрнэт пераедзе на больш устойлівыя і хуткія злучэнні.

Ужо зараз вы можаце наладзіць QUIC-ўзаемадзеянне для сваёй інфраструктуры ці нават аддаваць яго браўзэрам - яны ўсё плануюць дадаць падтрымку пратаколу, і сумная статыстыка з caniuse стане весялей.

HTTP па UDP - выкарыстоўваем з карысцю пратакол QUIC

Крыніца: habr.com

Дадаць каментар