Протокол quic что это

На замену TCP: обсуждение протокола QUIC

QUIC — новый транспортный протокол, работающий поверх UDP. Некоторые в шутку называют его TCP/2. Расскажем, что сейчас обсуждают, как принять участие и кто внедряет поддержку QUIC.

Что такое QUIC

Это — механизм передачи данных по сети, построенный на протоколе UDP. Позволяет сократить задержку соединения. В отличие от TCP, который использует принцип «тройного рукопожатия», в QUIC рукопожатие происходит в один этап со знакомым сервером и в два этапа с незнакомым.

По сравнению с TCP QUIC также обладает большей пропускной способностью. Тесты показали 30-процентное снижение числа ребуферизаций при воспроизведении YouTube-видео.

Какие документы обсуждают

В 2018 году представители Инженерного совета интернета (IETF) отмечали, что QUIC готов для широкомасштабных тестов, но пока не может стать стандартом из-за ряда недостатков. За два года протокол доработали, и группа экспертов готовится оформить его в формате RFC.

Дополнительное чтение из нашего блога на Хабре:

В середине июня сопредседатель рабочей группы в IETF Лукас Пардью (Lucas Pardue) сообщил о начале последнего этапа обсуждения черновиков QUIC. Всего документов шесть, и они посвящены различным аспектам работы протокола:

Сейчас ведется дискуссия, посвященная выбору между AAD или nonce. Но возвращаться к вопросам, по которым уже был достигнут консенсус, будут только по веским причинам.

Кто уже внедряет протокол

Несмотря на то что QUIC пока не является стандартом, его используют некоторые ИТ-компании. С ним начали работать CDN-сервисы, включая Cloudflare и Verizon Digital Media Services (VDMS).

Протокол quic что это
/ Unsplash / Nathan Dumlao

Экспериментальную поддержку HTTP/3 уже добавили в Chrome и Firefox. В последнем случае работа протокола строится на проекте Neqo (есть на GitHub). Это — реализация клиента и сервера для QUIC.

Черновики IETF использовали и в NGINX — в середине июня компания представила превью-версию прокси-сервера с поддержкой QUIC и HTTP/3. В конце мая Microsoft также объявили, что открывают код библиотеки MsQuic с реализацией протокола. Библиотека кроссплатформенная — можно запустить на Windows и Linux, используя Schannel и OpenSSL соответственно (для TLS 1.3). Эксперты прогнозируют, что с принятием стандарта QUIC свои реализации выпустит еще больше компаний.

О чем мы пишем в корпоративном блоге:

Источник

Транспортный протокол QUIC приняли в качестве стандарта RFC 9000

Протокол quic что это

QUIC — новый транспортный протокол связи, который отличается уменьшенным временем задержки, большей надёжностью и безопасностью, чем широко используемый сегодня TCP (RFC 793).

Уже много рассказывалось о преимуществах транспорта QUIC, который взят за основу будущего стандарта HTTP/3. В HTTP следующего поколения транспорт TCP меняется на QUIC, что означает автоматическое ускорение соединений и зашифровку всего интернет-трафика, который раньше шёл в открытом виде по TCP. Нешифрованный QUIC не предусмотрен вообще.

В мае 2021 года состоялось знаменательное событие: протокол QUIC принят в качестве официального стандарта RFC9000. Это великолепные новости для всей интернет-экосистемы.

Утверждением таких стандартов занимается Инженерный совет Интернета (IETF). Ранее были оформлены вспомогательные стандарты RFC 9001, RFC 9002 и RFC 8999.

Таким образом, QUIC версии 1 теперь официально принят и утверждён. Все участвующие стороны могут завершить эксперименты с черновиками протокола и перейти на первую официальную версию.

В последние годы QUIC был одним из главных приоритетов IETF. Появившись как эксперимент Google, вскоре разработка QUIC вышла на международный уровень. Она велась почти пять лет. Зафиксировано 26 очных собраний, 1749 задач в трекере и многие тысячи писем в почтовой рассылке.

QUIC — очень амбициозный проект, который принесёт большие изменения. «Транспортная экосистема интернета за несколько десятилетий закостенела, а QUIC оживит её», — пишут инженеры из компании Fastly, которые входят в рабочую группу по разработке протокола.

Окостенение означает, что система с каждым годом становится всё менее гибкой, менее подвижной. QUIC принесёт в транспортный уровень множество инноваций, включая обязательное шифрование, версионность, гораздо более богатый и более производительный набор сервисов, поверх которых будут строиться новые технологии. Предполагается, что QUIC приведёт к появлению нового поколения интернет-инноваций. Это уже начало происходит с расширениями, такими как ненадёжные датаграммы (Unreliable Datagram Extension). Ненадёжные датаграммы открывают двери перед новым классом медиа в реальном времени и другими приложениями, которым нужен более функциональный транспорт, чем обязательная доставка пакетов с обрывом канала при потере нескольких пикселей. Мы уже видим многообещающие технологии, такие как MASQUE и WebTransport.

HTTP/3

Стандарт HTTP/3 (это HTTP поверх QUIC) идёт с небольшим опозданием за QUIC и тоже будет официально принят в самое ближайшее время.

Протокол quic что это
34-й (!) драфт HTTP/3

С момента принятия HTTP/2 прошло шесть лет: спецификация RFC 7540 опубликована в мае 2015-го, но пока не используется повсеместно. Протокол реализован во всех браузерах ещё с конца 2015 года, а спустя три года только 45,4% из 10 млн самых популярных интернет-сайтов поддерживают HTTP/2. Два с половиной года назад таких было 31,2%. Севсем недавно на HTTP/2 перешли сайты Amazon, Paypal, Telegram.org.

Cейчас практически готова третья версия HTTP/3, осталось совсем немного подождать.

QUIC представляет собой замену TCP, которая работает поверх UDP. Изначально эта технология была создана инженерами Google, как и предыдущий протокол SPDY, который стал основой HTTP/2. В первое время QUIC именовали “HTTP/2-encrypted-over-UDP”.

Затем разработку QUIC передали в IETF для стандартизации. Здесь он разделилcя на две части: транспорт и HTTP. Идея в том, что транспортный протокол можно использовать также для передачи других данных, а не только эксклюзивно для HTTP или HTTP-подобных протоколов. Однако название осталось таким же: QUIC. Разработкой транспортного протокола занимается рабочая группа QUIC Working Group в IETF.

Долгое время версия IETF называлась iQUIC, в то время как Google и другие продолжили работу над собственной реализацией gQUIC, но 7 ноября 2018 года один из ведущих разработчиков протокола Дмитрий Тихонов объявил, что стороны достигли совместимости протоколов, и теперь разработка продолжится в общем русле. QUIC в Chrome включается в настройках chrome://flags. Есть ещё расширение-индикатор, которое показывает, какие сайты поддерживают QUIC.

Протокол quic что это

Встроенная безопасность и производительность

В чём преимущества транспортного протокола QUIC перед TCP? Преимуществ очень много. По словам руководителя рабочей группы Марка Ноттингема, переход от устаревшего TCP на новые протоколы просто неизбежен, поскольку сейчас очевидно, что TCP страдает от проблем неэффективности.

«Поскольку TCP — протокол доставки пакетов по порядку, то потеря одного пакета может помешать доставке приложению последующих пакетов из буфера. В мультиплексированном протоколе это может привести к большой потере производительности, — объясняет Марк Ноттингем. — QUIC пытается решить эту проблему с помощью эффективной перестройки семантики TCP (вместе с некоторыми аспектами потоковой модели HTTP/2) поверх UDP».

Кроме перехода значительного объёма трафика с TCP на UDP, протокол QUIC требует обязательного шифрования: нешифрованного QUIC не существует вообще. QUIC использует TLS 1.3 для установки ключей сессии, а затем шифрования каждого пакета. Но поскольку он основан на UDP, значительная часть информации о сессии и метаданных, открытых в TCP, шифруется в QUIC.

Протокол quic что это

В статье «Будущее интернет-протоколов» Марк Ноттингем говорит о значительных улучшениях в безопасности с переходом на QUIC:

На самом деле текущий «короткий заголовок» iQUIC — который используется для всех пакетов, кроме рукопожатия — выдаёт только номер пакета, необязательный идентификатор соединения и байт состояния, необходимый для процессов вроде смены ключей шифрования и типа пакета (который тоже может быть зашифрован). Всё остальное зашифровано — включая пакеты ACK, что значительно повышает планку для проведения атак с анализом трафика.

Кроме того, становится невозможна пассивная оценка RTT и потерь пакетов путём простого наблюдения за соединением; там недостаточно информации для этого.

Отсутствие наблюдаемости вызвало серьёзную озабоченность у некоторых представителей сообщества операторов связи. Они говорят, что такие пассивные измерения критически важны для отладки и анализа их сетей.

Одно из предложений для решения этой проблемы — введение спин-бита. Это бит в заголовке, который меняет своё значение один раз по пути туда-обратно, так что наблюдатель может оценить RTT. Поскольку он не привязан к состоянию приложения, то не должен выдавать никакой информации о конечных точках, кроме примерной оценки местоположения сети.

Возможно, принятие стандарта QUIC произошло бы и раньше, если бы компания Google не поспешила внедрить свою реализацию в браузер Chrome, так что случилось «раздвоение» стандарта.

Тем не менее, прогресс неизбежен — и в ближайшие годы обязательно продолжится стандартизация и повсеместное внедрение различных протоколов нового поколения, в том числе HTTP/3 на транспорте QUIC.

Источник

По пути к QUIC: что лежит в основе HTTP/3

Протокол quic что это

QUIC (Quick UDP Internet Connections) – это новый, шифрованный по умолчанию, протокол транспортного уровня, который имеет множество улучшений HTTP: как для ускорения трафика, так и для повышения уровня безопасности. Также QUIC имеет долгосрочную цель – в итоге заменить TCP и TLS. В этой статье мы рассмотрим как ключевые фишки QUIC и почему веб выиграет за счет них, так и проблемы поддержки этого абсолютно нового протокола.

По факту существует два протокола с таким именем: Google QUIC (gQUIC), изначальный протокол, который разработали инженеры Google несколько лет назад, который после ряда экспериментов был принят IETF (Internet Engineering Task Force) в целях стандартизации.

IETF QUIC (далее – просто QUIC) уже имеет настолько сильные расхождения с gQUIC, что может считаться отдельным протоколом. От формата пакетов до хендшейка и мэппинга HTTP – QUIC улучшил оригинальную архитектуру gQUIC благодаря сотрудничеству со многими организациями и разработчиками, которые преследуют единую цель: сделать Интернет быстрее и безопаснее.

Итак, какие улучшения предлагает QUIC?

Встроенная безопасность (и производительность)

Одно из самых заметных отличий QUIC от почтенного TCP – это изначально заявленная цель быть транспортным протоколом, который безопасен по умолчанию. QUIC добивается этого с помощью аутентификации и шифрования, которые обычно происходят на уровне выше (например, в TLS), а не в самом транспортном протоколе.

Первоначальный хендшейк в QUIC сочетает привычное трехстороннее общение по TCP с TLS 1.3 хендшейком, который обеспечивает аутентификацию участников, равно как и согласование криптографических параметров. Для тех, кто хорошо знаком с TLS: QUIC заменяет уровень записи TLS своим собственным форматом кадра, но при этом использует хендшейки TLS.

Это не только позволяет соединению быть всегда шифрованным и аутентифицированным, но также быстрее делать первоначальное соединение: рядовой QUIC-хендшейк делает обмен между клиентом и сервером за один проход, в то время как TCP + TLS 1.3 делают два прохода.

Протокол quic что это

Протокол quic что это

Однако QUIC идет дальше и также шифрует метаданные о соединении, которые могут быть легко скомпрометированы третьей стороной. Например, атакующие могут использовать номера пакетов, чтобы направлять пользователей по множеству сетевых путей, когда используется миграция соединения (см. ниже). QUIC шифрует номера пакетов, поэтому они не могут быть скорректированы никем, кроме настоящих участников соединения.

Шифрование также может быть эффективно против «косности» – феномена, которые не дает использовать гибкость протокола на практике из-за неверных предположений в реализациях (ossification – то, что из-за чего долго откладывали выкладку TLS 1.3. Выложили только после нескольких изменений, которые предотвратят нежелательные блоки для новых ревизий TLS).

Блокировка начала очереди (Head-of-line blocking)

Одним из главных улучшений, которое нам принес HTTP/2, это возможность объединять разные HTTP-запросы в одном TCP-соединении. Это позволяет приложениям на HTTP/2 параллельно обрабатывать запросы и лучше использовать сетевой канал.

Конечно, это было значительным шагом вперед. Потому что ранее приложениям нужно было инициировать множество TCP+TLS соединений, если они хотели одновременно обрабатывать несколько HTTP-запросов (например, когда браузеру нужно получить и CSS, и JavaScript чтобы отрисовать страницу). Создание новых соединений требует множественных хендшейков, а также инициализацию окна перегрузки: это означает замедление рендеринга страницы. Объединенные HTTP-запросы позволяют избежать этого.

Протокол quic что это

Однако здесь есть недостаток: так как множественные запросы/ответы передаются по тому же TCP-соединению, они все одинаковы зависимы от потери пакетов, даже если потерянные данные касаются лишь одного из запросов. Это и называется «блокировкой начала очереди».

QUIC идет глубже и дает первоклассную поддержку для объединения запросов, например, разные HTTP-запросы могут быть расценены как разные транспортные QUIC-запросы, но при этом все они будут использовать одно и то же соединение QUIC – то есть дополнительные хендшейки не нужны, есть единое состояние перегрузки, запросы QUIC доставляются независимо – в итоге, в большинстве случаев потеря пакетов затрагивает только один запрос.

Таким образом можно существенно сократить время на, например, полный рендеринг веб-страницы (CSS, JavaScript, картинки и прочие ресурсы), особенно в случае перегруженной сети с высокой потерей пакетов.

Так просто, да?

Чтобы выполнить свои обещания, протокол QUIC должен преодолеть некоторые допущения, которые приняли во многих сетевых приложениях как нечто само собой разумеющееся. Это может затруднить имплементацию и внедрение QUIC.

QUIC спроектирован, чтобы доставляться поверх UDP-датаграмм, дабы облегчить разработку и избежать проблем с сетевыми устройствами, которые отбрасывают пакеты неизвестных протоколов (потому что большинство устройств поддерживают UDP). Также это позволяет QUIC жить в user-space, поэтому, например, браузеры смогут внедрять новые фишки протокола и доносить их до конечных пользователей, не дожидаясь обновлений ОС.

Тем не менее, благая цель – уменьшить сетевые проблемы – делает более трудным защиту пакетов и их правильный роутинг.

Один NAT чтобы всех воедино созвать и единою черною волей сковать

Обычно NAT-роутеры работают с TCP-соединениями, используя кортеж из 4 значений (исходные IP и порт плюс IP и порт назначения), а также отслеживая TCP SYN, ACK и FIN-пакеты, переданные по сети; роутеры могут определять, когда установилось новое соединение и когда закончилось. Поэтому возможно точное управление привязками NAT (связи между внутренними и внешними IP и портами).

В случае QUIC это пока невозможно, т.к. современные NAT-роутеры еще не знают про QUIC, поэтому они обычно делают даунгрейд к дефолтной и менее точной обработке UDP, что означает таймауты произвольной (иногда малой) длительности, которые могут влиять на длительные соединения.

Когда происходит перепривязка (например, из-за таймаута), устройство вне периметра NAT начинает получать пакеты из другого источника, из-за чего невозможно поддерживать соединение используя только лишь кортеж из 4 значений.

Протокол quic что это

И дело не только в NAT! Одна из фишек QUIC называется connection migration и позволяет устройствам по их усмотрению переносить соединения на другие IP-адреса/пути. Например, мобильный клиент сможет перенести QUIC-соединение с мобильной сети на уже известную WiFi-сеть (пользователь зашел в любимую кофейню и т.п.).

QUIC пытается решить эту проблему с помощью концепции connection ID: кусок информации произвольной длины, передаваемый в пакетах QUIC и позволяющий идентифицировать соединение. Конечные устройства могут использовать этот ID, чтобы отслеживать свои соединения без сверки с кортежем. На практике тут должно быть множество ID, которые указывают на одно и то же соединение, к примеру, чтобы избежать соединения разных путей, когда происходит миграция соединения – потому что весь процесс контролируется только конечными устройствами, а не миддлбоксами.

Однако и здесь может быть проблема для операторов связи, которые используют anycast и ECMP-роутинг, где один IP потенциально может идентифицировать сотни или тысячи серверов. Так как пограничные маршрутизаторы в этих сетях еще не знают, как обрабатывать QUIC-трафик, то может случиться так, что UDP-пакеты из одного QUIC-соединения, но с разными кортежами будут отданы разным серверам, что означает разрыв соединения.

Протокол quic что это

Чтобы избежать этого, операторам может понадобиться внедрить более умный балансировщик на 4 уровне. Этого можно добиться программно, не затрагивая сами пограничные роутеры (для примера см. проект Katran от Facebook).

QPACK

Другой полезной особенностью HTTP/2 было сжатие заголовков (HPACK), которое позволяет конечным устройствам уменьшать размер пересылаемых данных за счет отбрасывания ненужного в запросах и ответах.

В частности, помимо прочих техник, HPACK использует динамические таблицы с заголовками, которые уже были отправлены/получены от прошлых HTTP-запросов/ответов, что позволяет устройствам ссылаться в новых запросах/ответах на ранее встречавшиеся заголовки (вместо того, чтобы снова их передавать).

Таблицы HPACK должны быть синхронизированы между кодером (стороной, которая шлет запрос/ответ) и декодером (принимающая сторона), иначе декодер просто не сможет декодировать то, что получает.

В случае HTTP/2 поверх TCP эта синхронизация прозрачна, потому что транспортный уровень (TCP) обеспечивает доставку запросов/ответов в том же порядке, в каком они они были отправлены. То есть отправить декодеру инструкции по обновлению таблиц можно в простом запросе/ответе. Но в случае QUIC все намного сложнее.

QUIC может доставлять множественные HTTP-запросы/ответы по разным направлениям одновременно, что означает, что QUIC гарантирует порядок доставки в рамках одного направления, при это такой гарантии нет в случае множества направлений.

Например, если клиент отправляет HTTP-запрос А в QUIC-потоке А, а также запрос B в потоке B, то из-за перестановки пакетов или сетевых потерь, сервер получит запрос B до запроса А. И если запрос B был закодирован так, как было указано в заголовке запросе А, то сервер просто не сможет декодировать запрос B, так как он еще не видел запрос А.

В протоколе gQUIC эту проблему решили, просто сделав все заголовки (но не тела) HTTP-запросов/ответов последовательными в рамках одного gQUIC-потока. Это дало гарантию, что все заголовки придут в нужном порядке, что бы ни случилось. Это весьма простая схема, с ее помощью существующие решения могут продолжать использовать код, заточенный под HTTP/2; с другой стороны, это увеличивает вероятность блокировки начала очереди, снижать которую как раз и призван QUIC. Поэтому рабочая группа по QUIC из IETF разработала новый маппинг между HTTP и QUIC (HTTP/QUIC), а также новый принцип сжатия заголовков – QPACK.

В последнем драфте спецификаций HTTP/QUIC и QPACK каждый обмен HTTP-запросом/ответом использует свой собственный двунаправленный поток QUIC, так что блокировка начала очереди не возникает. Также, ради поддержки QPACK, каждый участник создает два дополнительных, однонаправленных потока QUIC, один для отправки обновлений таблиц, другой – для подтверждения их получения. Таким образом, кодер QPACK может использовать ссылку на динамическую таблицу только после того, как ее получение подтвердил декодер.

Преломляя отражение

Общая проблема основанных на UDP протоколов – их восприимчивость к атакам отражения, когда атакующий заставляет некий сервер отправлять огромное количество данных жертве. Атакующий подменяет свой IP, чтобы сервер думал, что запрос данных приходил с адреса жертвы.

Протокол quic что это

Эта разновидность атаки может быть очень эффективна, когда ответ сервер несравнимо больше, чем запрос. В таком случае говорят об «усилении».

TCP обычно не используется для таких атак, потому что пакеты в изначальном хендшейке (SYN, SYN+ACK, …) имеют одинаковую длину, поэтому у них нет потенциала для «усиления».

С другой стороны, хендшейк QUIC очень ассиметричен: как и в TLS, сначала сервер QUIC отправляет свою цепочку сертификатов, которая может быть весьма большой, несмотря на то, что клиент должен отправить только несколько байт (сообщение от TLS-клиента ClientHello встроено в пакет QUIC). По этой причине, первоначальный пакет QUIC должен быть увеличен до определенной минимальный длины, даже если содержимое пакета значительно меньше. Как бы то ни было, эта мера все еще не очень эффективна, так как типичный ответ сервера содержит несколько пакетов и поэтому может быть больше чем увеличенный клиентский пакет.

Протокол QUIC также определяет явный механизм верификации источника: сервер, вместо того чтобы отдавать большой ответ, отправляет только retry-пакет с уникальным токеном, который клиент затем отправит серверу в новом пакете. Так у сервера есть бОльшая уверенность, что у клиента не подменный IP-адрес и можно завершить хендшейк. Минус решения – увеличивается время хендшейка, вместо одного прохода уже потребуется два.

Альтернативное решение заключается в уменьшении ответа сервера до размера, при котором атака отражения становится менее эффективной – например, с помощью сертификатов ECDSA (обычно они значительно меньше, чем RSA). Мы также экспериментировали с механизмом сжатия TLS-сертификатов, используя off-the-shelf алгоритмы сжатия вроде zlib и brotli; это фича, которая впервые появилась в gQUIC, но сейчас не поддерживается в TLS.

Производительность UDP

Одна из постоянных проблем QUIC – это ныне существующие железо и софт, которые не способны работать с QUIC. Мы уже рассматривали, как QUIC пытается справляться с сетевыми миддлбоксами вроде роутеров, однако другая потенциально проблемная зона это производительность отправки/получения данных между QUIC-устройствами по UDP. Долгие годы прикладывались усилия, чтобы оптимизировать реализации TCP насколько это возможно, включая встроенные возможности по разгрузке в софте (например, операционные системы) и в железе (сетевые интерфейсы), но ничто из этого не касается UDP.

Однако это лишь вопрос времени, пока реализации QUIC превзойдут эти улучшения и преимущества. Взгляните на недавние усилия внедрить разгрузку UDP на Linux, которая позволила бы приложениям объединять и передавать множественные UDP-сегменты между user-space и kernel-space сетевым стеком по затратам примерно одного сегмента; другой пример – поддержка zerocopy для сокетов в Linux, благодаря которой приложения смогли бы избегать затрат по копированию user-space памяти в kernel-space.

Источник

Протокол QUIC: переход Web от TCP к UDP

Протокол QUIC (название расшифровывается как Quick UDP Internet Connections) — совершенно новый способ передачи информации в интернете, построенный поверх протокола UDP, вместо общепринятого ранее использования TCP. Некоторые люди называют его (в шутку) TCP/2. Переход к UDP — наиболее интересная и мощная особенность протокола, из которой следуют некоторые другие особенности.

Сегодняшний Web построен на протоколе TCP, который был выбран за его надёжность и гарантированность доставки пакетов. Для открытия TCP-соединения используется так называемое «трёхкратное рукопожатие». Это означает дополнительные циклы отправки-приёма сообщений для каждого нового соединения, что увеличивает задержки.

Протокол quic что это

Если вы захотите установить защищённое TLS-соединение, придётся переслать ещё больше пакетов.

Протокол quic что это

Некоторые инновации, вроде TCP Fast Open, улучшат некоторые аспекты ситуации, но эта технология пока не очень широко распространена.

Протокол UDP, с другой стороны, построен на идее «отправить пакет и забыть о нём». Сообщение, отправленное по UDP, будет доставлено получателю (не гарантированно, с некоторой вероятностью успеха). Яркое преимущество здесь в меньшем времени установки соединения, такой же яркий недостаток — негарантированность доставки или порядка прихода пакетов получателю. Это означает, что для обеспечения надёжности придётся построить некоторый механизм поверх UDP, который гарантирует доставку пакетов.

И здесь на сцену выходит QUIC от Google.

Протокол QUIC может открыть соединение и согласовать все параметры TLS (HTTPs) за 1 или 2 пакета (1 или 2 — зависит от того, открывается ли соединение к новому серверу или к уже знакомому).

Протокол quic что это

Это невероятно ускоряет открытие соединения и начало загрузки данных.

Зачем нужен QUIC?

Планы команды разработчиков протокола QUIC выглядят очень амбициозно: протокол попытается совместить скорость UDP с надёжностью TCP.

Вот что об этом пишет Википедия:

Улучшение протокола TCP является долговременной целью для Google, а протокол QUIC создан как эквивалент независимого TCP-соединения, но с уменьшенными задержками и улучшенной в духе SPDY поддержкой мультиплексирования. Если QUIC покажет свою эффективность, то эти возможности могут войти в следующую версию протоколов TCP и TLS (разработка которых занимает больше времени).

В этой цитате есть важный момент: если QUIC докажет свою эффективность, то есть шанс, что опробованные в нём идеи станут частью следующей версии TCP.

Протокол TCP достаточно сильно формализован. Его реализации есть в ядрах Windows и Linux, в каждой мобильной OS, да и во многих более простых устройствах. Улучшение TCP является непростым делом, поскольку все эти реализации должны его поддерживать.

UDP же является относительно простым протоколом. Значительно быстрее разработать новый протокол поверх UDP чтобы иметь возможность проверить теоретические идеи, работу в перегруженных сетях, обработку заблокированных потерянным пакетом потоков и т.д. Как только эти моменты будут прояснены — можно будет начинать работу по переносу лучших частей QUIC в следующую версию TCP.

Где же сегодня место QUIC?

Если вы посмотрите на уровни, составляющие современное HTTPs-соединение, то увидите, что QUIC заменяет собой весь TLS-стек и часть HTTP/2.

Да, протокол QUIC реализует собственный крипто-слой, что позволяет избежать использования TLS 1.2.

Протокол quic что это

Поверх QUIC работает небольшая прослойка HTTP/2 API, используемая для общения с удалёнными серверами. Она меньше полной реализации HTTP/2, поскольку мультиплексирование и установка соединения уже реализованы в QUIC. Остаётся лишь реализация протокола HTTP.

Блокировка начала очереди (Head-of-line blocking)

Протоколы SPDY и HTTP/2 используют одно TCP-соединение с сервером вместо отдельных соединений для каждой страницы. Это единое соединение может быть использовано для независимых запросов и получения отдельных ресурсов.

Протокол quic что это

Поскольку весь обмен данными теперь построен на одном TCP-соединении, мы автоматически получаем один недостаток: блокировку начала очереди (Head-of-line blocking). В протоколе TCP требуется, чтобы пакеты приходили (точнее обрабатывались) в правильном порядке. Если пакет потерялся на пути к\от сервера — он должен быть отослан повторно. TCP-соединение в это время должно ожидать (блокироваться) и лишь после повторного получения потерянного пакета продолжается обработка всех пакетов в очереди — только так можно соблюсти условие корректного порядка обработки пакетов.

Протокол quic что это

Протокол QUIC решает эту проблему фундаментально — отказом от протокола TCP в пользу UDP, который не требует соблюдения порядка обработки принимаемых пакетов. И, хотя потери пакетов, конечно, всё так же возможны, это будет влиять только на обработку тех ресурсов (индивидуальных HTML\CSS\JS-файлов), к которым относится потерянный пакет.

Протокол quic что это

QUIC очень элегантно комбинирует лучшие части SPDY\HTTP2 (мультиплексирование) с неблокируемым транспортным протоколом.

Почему уменьшить количество пересылаемых пакетов так важно

Если у вас быстрое Интернет-соединение, то задержки передачи пакетов между вашим компьютером и удалённым сервером составляют около 10-50 мс. Каждый пересылаемый от вас по сети пакет будет получен сервером через этот промежуток времени. Для такого порядка величин преимущества QUIC могут быть не очень понятны. Но стоит нам рассмотреть вопрос обмена данными с сервером на другом континенте или использования мобильных сетей — и вот у нас уже появляются задержки порядка 100-150 мс.

Протокол quic что это

В итоге на мобильном устройстве, при доступе к находящемуся далеко серверу, разница между 4 пакетами TCP+TLS и одним пакетом QUIC может составить около 300 мс, что уже является существенной величиной, наблюдаемой невооруженным глазом.

Превентивная коррекция ошибок

Изящной фичей протокола QUIC является превентивная коррекция ошибок (Forward Error Correction, FEC). Каждый пересылаемый пакет содержит в себе некоторое количество данных других пакетов, что позволяет реконструировать любой потерянный пакет по данным в его соседях, без необходимости запрашивать переотправку потерянного пакета и дожидаться его содержимого. Это, по сути, реализация RAID 5 на сетевом уровне.

Но вы уже и сами видите недостаток этого решения: каждый пакет становится немного больше. Текущая реализация устанавливает этот оверхед равным 10%, т.е. сделав каждый пересылаемый пакет на 10% больше мы тем самым получаем возможность восстановления данных без перезапроса в случае, если будет теряться не более каждого десятого пакета.

Эта избыточность — плата пропускной способностью сети за уменьшение задержек (что выглядит логично, ведь скорости соединения и пропускная способность каналов непрерывно растут, а вот тот факт, что передача данных на другой конец планеты занимает сотню миллисекунд — навряд ли удастся как-то изменить без фундаментального переворота в физике).

Возобновление сессии и параллельные загрузки

Ещё одной интересной особенностью использования протокола UDP является то, что вы больше не привязаны к IP сервера. В протоколе TCP соединение определяется четырьмя параметрам: IP-адресами сервера и клиента, портами сервера и клиента. В Linux вы можете увидеть эти параметры для каждого установленного соединения с помощью комманды netstat:

Если любой из этих четырёх параметров потребуется изменить — нам потребуется открывать новое TCP-соединение. Вот почему трудно поддерживать стабильную связь на мобильных устройствах при переключении между WiFi и 3G/LTE.

Протокол quic что это

В QUIC, с его использованием UDP, данного набора параметров больше нет. QUIC вводит понятие идентификатора соединения, называемого Connection UUID. Появляется возможность перейти с WiFi на LTE с сохранением Connection UUID, таким образом избежав затрат на пересоздание соединения. Похожим образом работает Mosh Shell, сохраняя SSH-соединение активным при смене IP-адреса.

Также данный подход открывает двери возможности использования нескольких источников для запроса контента. Если Connection UUID может быть использовано для перехода от WiFi к мобильной сети, то мы можем, теоретически, использовать и их обе одновременно для получения данных параллельно. Больше каналов связи — больше пропускная способность.

Практические реализации QUIC

Браузер Chrome имеет экспериментальную поддержку QUIC с 2014-го года. Если вы хотите потестировать QUIC, то можете включить его поддержку в Chrome и попробовать поработать с сервисами Google, которые его поддерживают. Это сильное преимущество Google — возможность использовать комбинацию своего браузера и своих же веб-ресурсов. Включив QUIC в самом популяром в мире браузере (Chrome) и высоконагруженных сайтах (Youtube.com, Google.com), они смогут получить большую, наглядную статистику использования протокола, что позволит выявить все существенные проблемы практического использования QUIC.

Есть плагин для Chrome, который показывает в виде иконки поддержку сервером протоколов HTTP/2 и QUIC.

Вы также можете увидеть открытые QUIC-соединения открыв вкладку chrome://net-internals/#quic прямо сейчас (обратите внимание в таблице на параметр Connection UUID, упомянутый ранее)

Протокол quic что это

Вы можете пойти ещё дальше и посмотреть все открытые соединения и все переданные по ним пакеты: chrome://net-internals/#events&q=type:QUIC_SESSION%20is:active.

Протокол quic что это

Как при этом всём работают файрволы?

Если вы — сисадмин или сетевой инженер, то, возможно, слегка дёрнулись, когда услышали о том, что QUIC использует UDP вместо TCP. Да, наверное, у вас есть на то свои причины. Возможно у вас (как, например, и у нас в компании), настройки доступа к веб-серверу выглядят как-то так:

Протокол quic что это

Самое главное здесь, конечно же, столбик протокола, в котором явно написано «TCP». Подобные настройки используются тысячами веб-серверов по всему миру, поскольку они разумны. 80 и 443 порты, только TCP — и больше ничего на продакшн-вебсервере разрешено быть не должно. Никакого UDP.

Ну, если мы хотим использовать QUIC, придётся добавить и разрешение UDP-соединений на 443-ий порт. В больших энтерпрайз-сетях это может быть проблемой. Как показывает статистика Google, UDP кое-где блокируется:

Протокол quic что это

Эти цифры были получены в ходе недавнего исследования в Швеции. Отметим несколько ключевых моментов:

Использование QUIC на серверной стороне

На данный момент QUIC поддерживается вебсервером Caddy (с версии 0.9). И клиентская, и серверная реализация QUIC ещё на стадии экспериментальной поддержки, так что будьте осторожны с практическим применением QUIC. Поскольку ни у кого по-умолчанию не включен QUIC, то, вероятно, будет безопасным включить его на своём сервере и экспериментировать со своим браузером (Обновление: с версии 52 QUIC включён по-умолчанию в Chrome).

Производительность QUIC

В 2015-ом году Google опубликовала некоторые результаты замеров производительности QUIC.

Как и ожидалось, QUIC затмевает классический TCP на плохих каналах связи, давая выигрыш в полсекунды на загрузке стартовой страницы www.google.com на 1% наиболее медленных соединений. Этот выигрыш ещё более заметен на видеосервисах вроде YouTube. Пользователи на 30% меньше жаловались на задержки из-за буферизации при просмотре видео при использовании QUIC.

Статистика Youtube особенно интересна. Если улучшения подобного масштаба действительно возможны, то мы увидим очень быструю адаптацию QUIC как-минимум в сфере видеосервисов вроде Vimeo, а также на рынке «видео для взрослых».

Выводы

Лично я нахожу протокол QUIC совершенно очаровательным! Огромный объём работы, проделанный его разработчиками, не пропал даром — один лишь факт того, что уже сегодня крупнейшие сайты в Интернете поддерживают QUIC, немного ошеломляет. Я жду не дождусь финальной спецификации QUIC, ну и дальнейшей её реализации всеми браузерами и веб-серверами.

Комментарий к статье от Jim Roskind, одного из разработчиков QUIC

Я потратил много лет на исследования, дизайн и разработку реализации протокола QUIC, и хотел бы добавить к статье кое-какие свои мысли. В тексте был верно подмечен момент о вероятной недоступности протокола QUIC у некоторых пользователей из-за строгих корпоративных политик в отношении протокола UDP. Это и было причиной того, что мы получили среднюю доступность протокола на уровне в 93%.

Если мы вернёмся немного в прошлое, то увидим что ещё совсем недавно корпоративные системы часто запрещали даже исходящий трафик к 80-му порту, с аргументацией «это уменьшит количество времени, которое работники тратят на серфинг в ущерб работе». Позже, как вы знаете, преимущества доступа к веб-сайтам (в том числе в производственных целях) вынудило большинство корпораций пересмотреть свои правила, разрешив выход в интернет с рабочего места рядового сотрудника. Я ожидаю чего-то аналогичного и с протоколом QUIC: как-только станет понятно, что с новым протоколом связь может быть быстрее, задачи выполняются оперативнее — он пробьёт себе путь и в энтерпрайз.

Я рассчитываю, что QUIC массово заместит собой TCP, и это даже помимо того, что он подарит следующей версии TCP ряд своих идей. Дело в том, что TCP реализуется в ядрах операционных систем, в железе, а значит адаптация к новой версии может занять 5-15 лет, в то время как внедрить QUIC поверх общедоступного и всеми поддерживаемого UDP можно в отдельно взятом продукте\сервисе буквально за несколько недель или месяцев.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *