Протокол, который взял скорость UDP, прикрутил к нему надёжность TCP и шифрование TLS 1.3 — и собрал всё заново, правильно.
В 1980 году Дэвид Рид написал RFC 768 — спецификацию User Datagram Protocol на три страницы. Пока TCP был сложным механизмом с рукопожатиями и гарантиями доставки, UDP сказал: «Вот твой пакет, отправил и забыл».
| Что сравниваем | TCP | UDP |
|---|---|---|
| Заголовок | 20–60 байт | всего 8 байт |
| Рукопожатие | SYN → SYN-ACK → ACK | нету вообще |
| Гарантия доставки | да | нет |
| Порядок пакетов | строгий | как повезёт |
| Задержка | выше | минимальная |
| Для чего придуман | страницы, файлы | игры, звонки, DNS, стримы |
Идея Рида была в том, что приложения сами знают лучше, что им нужно. Зачем платить за гарантии, которые тебе не нужны? Потерял кадр видеозвонка — ну и похуй, следующий придёт через миллисекунду. Ретрансмиссия тут только мешает.
Нет setup'а соединения — первый же пакет уже несёт данные. Идеально для DNS и игр.
Сам решай, что ретрансмить, а что забить. WebRTC так и живёт.
Один пакет — всем в сети. TCP так не умеет в принципе.
Но у простоты была цена. 40 лет интернет строил поверх TCP всё, что требовало надёжности. А потом стало понятно: TCP — это тупик. Его нельзя обновить, потому что он зашит в ядра ОС, роутеры и middleboxes по всему миру.
Google задал вопрос: если TCP тронуть нельзя — а если сделать надёжный протокол поверх UDP и вынести его из ядра в userspace?
Джим Роскинд и команда начинают внутренние тесты прототипа: TLS + надёжность поверх UDP.
Google рассказывает о «QUIC» (Quick UDP Internet Connections): поиск страниц стал быстрее на несколько процентов — уже на тех данных, что были.
Браузер начинает пробовать QUIC к сервисам Google параллельно с TCP: кто первый — тем и отдаём данные.
gQUIC был проприетарным и костыльным (спрятанный SPDY внутри). IETF переписывает с нуля: чистый transport + TLS 1.3 внутри.
HTTP-over-QUIC официально переименовывают в HTTP/3. Все понимают: это будущий дефолт веба.
QUIC v1 стандартизирован. Cloudflare, Google, Facebook уже гоняют через него огромную долю трафика.
Поддержка во всех браузерах и CDN. Сегодня через QUIC идёт уже больше трети всего интернет-трафика — и доля растёт.
Не «немного быстрее TCP». Он решает фундаментальные проблемы, которые TCP не может решить никогда:
TCP+TLS = 2–3 round-trip'а до первого байта. QUIC совмещает транспортный хендшейк с TLS 1.3: первое подключение — 1-RTT, повторное к известному серверу — 0-RTT, данные летят в самом первом пакете. На мобильном интернете с пингом 80мс это сотни миллисекунд экономии.
Главная боль TCP: потерялся один пакет — встала вся очередь, хоть сто потоков поверх него открыто. В QUIC потоки независимы: потеря в стриме №3 не тормозит стримы №1 и №2. Данные просто ждут в своём стриме.
TCP-соединение = IP + порт. Сменил Wi-Fi на LTE — IP сменился — соединение сдохло, переконнект заново. QUIC живёт по Connection ID: сеть сменилась, а сессия продолжает жить. Видео не рвётся, загрузки не слетают.
В TLS поверх TCP заголовки пакетов (порты, seq-номера, флаги) видит любой на пути. В QUIC зашифрованы даже транспортные хедеры — middleboxes не могут ни подсмотреть, ни испортить. DPI видит мусор.
TCP обновляется только с ядром ОС — годами. QUIC живёт в userspace: браузер или библиотека обновились — новый алгоритм контроля перегрузки (BBRv3?) у всех на следующий день. Протокол эволюционирует как софт, а не как железо.
Не нужен HTTP/2 поверх капризного TCP — стримы родные, встроенные. У каждого свой flow control, приоритеты и порядок.
Дьявол в деталях — вот что надо знать про QUIC под капотом:
Каждый QUIC-датаграмма должна быть минимум 1200 байт — чтобы сервер мог проверить путь на MTU и защититься от амлификации.
Сервер до подтверждения клиента отвечает максимум в 3 раза большим объёмом, чем получил. Иначе QUIC превратили бы в усилитель DDoS.
Данные ранних 0-RTT пакетов атакующий может записать и отправить дважды — сервер их примет как новые. Поэтому 0-RTT только для идемпотентных запросов, не для POST платежей.
CID не статичен: стороны регулярно ротируют его, чтобы трекеры не могли связать сменённые сети по одному ID. Приватность даже на этом уровне.
Отдельные лимиты на каждый стрим и общий на соединение. Приложение само рулит, кому сколько окна давать — TCP такого не умеет.
RFC 9221 Datagram Frames: можно слать ненадёжные датаграммы внутри QUIC-сессии — для игр и realtime, когда ретрансмиссия вредна.
TLS 1.3 внутри QUIC разрешает только AEAD-шифры. Классические CBC и RC4 остались в музее.
Часть сетей режет UDP или душит его скорость. Поэтому клиент всегда держит TCP-фоллбек и шлёт Alt-Svc, чтобы при следующем визите попробовать h3.
UDP в 1980-м подарил интернету свободу: голый канал без правил. 40 лет никто не знал, что делать с этой свободой, кроме игр и DNS. Google понял: свобода UDP + дисциплина TCP + приватность TLS = интернет, каким он должен был быть с самого начала. Просто в 1981 году ещё не было криптографии, мобильных сетей и понимания, как всё будет.